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.java
与 AppConfig.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.pojo
和 com.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中