SpringBoot如何配置Bean

方式1 使用注解@Bean注入到Spring IoC容器中

定义一个POJO对象 User.java

public class User{
    private Long id;
    private String userName;
    private String note;

    /** setter and getter **/
}

然后再定义一个Java配置文件 AppConfig.java

@Configuration
public class AppConfig{
    @Bean(name="user")
    public User initUser(){
        User user=new User();
        user.setId(1L);
        user.setUserName("user_name_1");
        user.setNote("note_1");
        return user;
    }
}

@Configuration 代表这是一个Java配置文件,Spring的容器会根据它来生成IoC容器去装备Bean;

@Bean 代表将 initUser() 方法返回的POJO装配到IoC容器中,而属性name定义这个Bean的名字。如果没有配置它,则将方法名称“initUser”作为Bean的名称保存到IoC容器中

做好了这些,就可以使用 AnnotationConfigApplicationContext 来构建自己的IoC容器,如下所示,定义一个 IoCTest.java

public class IoCTest{
    public void test(){
        ApplicationContext ctx=new AnnotationConfigApplicationContext(AppConfig.class);
        User user=ctx.getBean(User.class);
    }
}

代码中将Java配置文件 AppConfig 传递给 AnnotationConfigApplicationContext 的构造方法,这样它就能够读取配置了。然后将配置里面的Bean装配到IoC容器中,于是就可以使用getBean方法获取对应的POJO

方式2 使用@Component扫描装配Bean到IoC容器中

@Component 标明哪个类被扫描进IoC容器中,而 @ComponentScan 标明采用何种策略去扫描装配Bean

定义一个POJO对象 User.java

@Component("user")
public class User{
    @Value("1")
    private Long id;

    @Value("user_name_1")
    private String userName;

    @Value("note_1")
    private String note;

    /** setter and getter **/
}

@Component 标明这个类将被IoC扫描装配,其中“user”作为Bean的名称,如果不配置,则IoC会将类名的第一个字母小写,其他不变作为Bean的名称放入IoC容器中

@value 指定具体的值,使得Spring IoC给与对应的属性注入对应的值。

然后再定义一个Java配置文件 AppConfig.java

@Configuration
@ComponentScan
public class AppConfig{
}

@ComponentScan 会扫描类AppConfig所在的当前包和其子包。因此需要将 User.javaAppConfig.java 放在同一包下。

@ComponentScan允许自定义扫描的包。假如 User.java 在包pojo下,而 AppConfig.java 在包config下,则可以将 AppConfig.java 中的注释修改为:

@ComponentScan("com.springboot.demo.*")

@ComponentScan(basePackages={"com.springboot.demo.pojo"})

@ComponentScan(basePackageClasses={User.class})

如果想扫描一些包,将一些Bean装配到Spring IoC容器中,但不想加载这个包中的某些Bean——比如有一个 UserService 类,我们将这个类标注 @Service ,这个标签注入了 @Component ,所以默认情况下会被扫描装配到Spring IoC中。假设我们采取了策略:

@ComponentScan("com.springboot.demo.*")

则对于 com.springboot.demo.pojocom.springboot.demo.service 都会被扫描。假设我们定义 UserService如下:

@Service
public class UserService{
    public void printUser(User user){
        System.out.println(user.getId());
        System.out.println(user.getUserName());
        System.out.println(user.getNote());
    }
}

按以上策略,它将被扫描到Spring IoC容器中,为了不被配装,需要把扫描的策略修改为:

@ComponentScan(basePackages={"com.springboot.demo.*"}, 
                excludeFilters={@Filter(type=FilterType.ASSIGNABLE_TYPE,classes={Service.class})})

由于加入了 excludeFilters 的配置,使标注了 @Service 的类将不被IoC容器扫描注入,这样就把 UserService 类排除到Spring IoC容器外了。

方法3 使用配置文件配置Bean

Spring Boot中可以使用application.properties来为应用添加配置。假设在配置文件中加入以下代码:

database.driverName=com.mysql.jdbc.Driver
database.url=jdbc.mysql://localhost:3306/ch3
database.username=root
database.password=123456

Spring Boot会通过其机制读取配置文件到上下文中,这样就可以引用它了。
创建一个类 DataBaseProperties.class

@Component
@ConfigurationProperties("database")
public class DataBaseProperties {
	private String driverName=null;	
	private String url=null;
	private String username=null;
	private String password=null;

    /*getter and setter*/

}

在这里的注解@ConfigurationProperties中配置的字符串 "database" ,将与POJO的属性名称组成属性的全限定名去配置文件中查找,这样就能将对应的属性读入的POJO中

posted @ 2020-10-30 13:01  maurrinho  阅读(2167)  评论(0编辑  收藏  举报