Spring入门-创建Bean的六种方式

时间:2022-03-22作者:klpeng分类:IT综合浏览:292评论:0

 创建一个容器类AppConfig加入@Configuration@ComponentScan
@ComponentScan默认是扫描AppConfig的本路径和子路径下加入了

import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    
    
    
    
}

 创建一个测试类。输出ApplConfig类中托管的所有方法。后续会多次运行


import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {

    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); //获取AppConfig中的所有被托管的Bean
        String strs [] = ac.getBeanDefinitionNames();
        for(String s:strs){
            System.out.println(s);
        }
    }



}

 创建一个Bean类

public class User{
    String name;
    String id ;
}


上述类都在同一个包

一、使用@Bean注解

 在容器类内创建返回值为需要托管的类的方法,方法名即为托管类的id,并且加上@Bean注解。一般用于第三方类托管.

@Configuration
@ComponentScan
public class AppConfig {

    @Bean
    public Hello hel(){

        return new Hello();
    }


}

 再次运行Test类:
Spring入门-创建Bean的六种方式

二、使用@ComponentScan注解

 在容器类AppConfig类上加入@ComponentScan注解。默认会扫描AppConfig类的本路径和子路径下有@Component,@Service,@Controller,@Repository注解的类加入到容器中托管。选择指定路径下托管则为@ComponentScan(value={"类的包路径"}).

import org.springframework.stereotype.Component;

@Component
public class MyPerson {
    
}

 MyPerson类在AppConfig类的包路径下,不需要指定路径。
 直接运行Test类:
Spring入门-创建Bean的六种方式

三、使用@Import()注解

 在容器类上加入@Import()注解。 可以一次性导入多个类。格式: @Import({类名.class})
 测试:
 创建两个Bean类。

package com.my.csdntest;
public class MyBook {
}
package com.my.csdntest;
public class MyPen {
}

 在容器类上加入注解@Import()

import com.my.csdntest.MyBook;
import com.my.csdntest.MyPen;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({MyBook.class,MyPen.class})
public class AppConfig {
    @Bean
    public User hel(){
        return new User();
    }
}

 继续运行Test类
Spring入门-创建Bean的六种方式

四、使用ImportSelector接口

 和上述的@Import()搭配使用。创建一个类实现ImportSelector接口。重写里面selectImports方法

public class ToolImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{MyBook.class.getName(),MyPen.class.getName()};
    }
}

 在容器类中使用@Import导入上述类。


@Configuration
@Import({ToolImportSelector.class})
public class AppConfig {
    @Bean
    public User hel(){
        return new User();
    }
    
}

五、使用FactoryBean接口

 和Bean注解配合使用。创建一个类实现FactoryBean接口。然后按照@Bean注解来返回该类。
 如下所示:

import org.springframework.beans.factory.FactoryBean;

public class MyPenFactoryBean implements FactoryBean<MyPen> {
    @Override
    public MyPen getObject() throws Exception {
        return new MyPen();
    }

    @Override
    public Class<?> getObjectType() {
        return MyPen.class;
    }

    @Override
    public boolean isSingleton() {  //是否是单例模式
        return false;
    }
}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public MyPenFactoryBean myPenFactoryBean(){
        return  new MyPenFactoryBean();
    }

}

六、条件注解@Conditional

 使用此注解可以根据条件来选择是否托管至容器中。
 首先用一个类MyCondition实现Condition接口。在需要托管的类上加上注解@Conditional(MyCondition.class)。在使用上述能够托管该类的基础上,根据MyCondition类中重写的matches()方法来判断是否托管,返回true则可以,false则不托管。
 如下所示:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if(1+1==2){
            return false;
        }
        return true;
    }
}

import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Component;

@Component
@Conditional(MyCondition.class)
public class MyPen {
}
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class AppConfig {


}

 运行Test类发现没myPen的id。
Spring入门-创建Bean的六种方式

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢