@ConditionalOnBean
基于bean组件的条件判断,简单来说就是只有当前的的IOC容器当中包含@ConditionalOnBean注解所规定的bean组件的时候,其它的组件才会被注入到容器当中。
@Bean("Tom")//这里可以设置自定义组件的名字
public Pet pet01(){
Pet pet = new Pet("汤姆猫");
return pet;
}
@ConditionalOnBean(name = "Tom")
@Bean
public User user01(){
User user = new User("张三",25);
//User组件依赖了Pet组件(true or false)
user.setPet(pet01());
return user;
}
user01会被注入到容器当中。
@Bean("tom")//这里可以设置自定义组件的名字
public Pet pet01(){
Pet pet = new Pet("汤姆猫");
return pet;
}
@ConditionalOnBean(name = "Tom")
@Bean
public User user01(){
User user = new User("张三",25);
//User组件依赖了Pet组件(true or false)
user.setPet(pet01());
return user;
}
user01不会被注入到容器当中。
@ConditionalOnMissingBean
基于bean组件的条件判断,简单来说就是只有当前的的IOC容器当中并不包含@ConditionalOnMissingBean注解所规定的bean组件的时候,其它的组件才会被注入到容器当中,跟 @ConditionalOnBean起到相反的作用。
@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类==配置文件
@ConditionalOnMissingBean(name = "test")
public class MyConfig {
/*
* 给容器中添加组件。
* 1.以方法名作为组件的id。
* 2.返回类型就是组件类型。
* 3.返回的值就是组件在容器中的实例。*/
/*
* 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中共的单实例对象*/
@Bean("Tom")//这里可以设置自定义组件的名字
public Pet pet01(){
Pet pet = new Pet("汤姆猫");
return pet;
}
@Bean
public User user01(){
User user = new User("张三",25);
//User组件依赖了Pet组件(true or false)
user.setPet(pet01());
return user;
}
}
由于容器当中并没有名字为test的组件,因此Tom组件和user01组件可以被注入到容器当中。
@ImportResource
虽然使用SpringBoot进行开发可以不写xml配置文件,但是难免会有人使用xml配置文件来向容器中注入组件,那么在SpringBoot里面就可以使用 @ImportResource注解来向容器中注入组件属性。
@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类==配置文件
@ConditionalOnMissingBean(name = "123")
@ImportResource("classpath:beans.xml")
public class MyConfig {
/*
* 给容器中添加组件。
* 1.以方法名作为组件的id。
* 2.返回类型就是组件类型。
* 3.返回的值就是组件在容器中的实例。*/
/*
* 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中共的单实例对象*/
//@Bean("Tom")//这里可以设置自定义组件的名字
public Pet pet01(){
Pet pet = new Pet("汤姆猫");
return pet;
}
//这个注解已经被屏蔽掉了,导致这里的user01和Tom并不是组件,组件的注入依赖于上面的@ImportResource注解
//@Bean
public User user01(){
User user = new User("张三",25);
//User组件依赖了Pet组件(true or false)
user.setPet(pet01());
return user;
}
}
@ConfigurationProperties
如何将bean组件的属性值和属性配置文件绑定在一起呢,@ConfigurationProperties就是来解决这个问题的,具体使用我们来看看代码:
//在配置类当中注入user01组件,此时的组件并没有属性内容
@Bean
public User user01(){
User user = new User();
return user;
}
<!--设置属性值-->
user.username=lisi
user.userage=24
user.pet.petype=dog
//在User类上面添加@ConfigurationProperties注解即可绑定属性
//使用这个注解的前提是User类组件已经被注入到容器当中!!!
@ConfigurationProperties(prefix = "user")
public class User {
private String username;
private int userage;
private Pet pet;
//无参构造方法
public User() {
}
//有参构造方法
public User(String username, int userage) {
this.username = username;
this.userage = userage;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getUserage() {
return userage;
}
public void setUserage(int userage) {
this.userage = userage;
}
public Pet getPet() {
return pet;
}
public void setPet(Pet pet) {
this.pet = pet;
}
@Override
public String toString() {
return username +""+userage+""+pet.getPetype();
}
}