**@Primary:**自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Primary
@Bean
public Van vanA(){
return new Van(new FighterA());
}
注解读取配置类属性到实体类属性上赋值
导包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
对应实体类
@Data
@Component
@ConfigurationProperties(prefix = "user1")
public class User {
private String name;
private String age;
}
对应application.properties
配置文件内容如下:
user1.name=zhangsan
user1.age=123
@EnableConfigurationProperties的作用是把springboot配置文件中的值与我们的xxxProperties.java的属性进行绑定,需要配合@ConfigurationProperties使用,无需ioc注入即可使用bean方式注入
实体
//@Component 此注解去掉 bean不会注入到ioc管理
@Data
@ConfigurationProperties(prefix = "person")
public class PersonProperties {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
application.properties:
person.last-name=zzzz
person.age=18
person.birth=2020/12/15
person.boss=false
person.maps.k1=v12
person.maps.k2=142
person.lists=aaa,aab,cd,d
person.dog.name=dddd
person.dog.age=2
使用
@RestController
@EnableConfigurationProperties(PersonProperties.class)
public class HelloController {
//没有bean注入则使用@EnableConfigurationProperties(PersonProperties.class)
@Autowired
PersonProperties person;
@RequestMapping("/sayHello")
public String sayHello() {
System.out.println(person);
return null;
}
}
它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
配置类
@Configuration
public class BeanConfig {
//只有一个类时,大括号可以省略
//如果WindowsCondition的实现方法返回true,则注入这个bean
@Conditional({WindowsCondition.class})
@Bean(name = "bill")
public String person1(){
return "true";
}
//如果LinuxCondition的实现方法返回true,则注入这个bean
@Conditional({LinuxCondition.class})
@Bean("linus")
public String person2(){
return "false";
}
}
实现接口:这个根据返回的值看看要不要注入bean
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String property = environment.getProperty("os.name");
if (property.contains("Linux")){
return true;
}
return false;
}
}
public class WindowsCondition implements Condition {
/**
* @param conditionContext:判断条件能使用的上下文环境
* @param annotatedTypeMetadata:注解所在位置的注释信息
* */
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取ioc使用的beanFactory
ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
//获取类加载器
ClassLoader classLoader = conditionContext.getClassLoader();
//获取当前环境信息
Environment environment = conditionContext.getEnvironment();
//获取bean定义的注册类
BeanDefinitionRegistry registry = conditionContext.getRegistry();
//获得当前系统名
String property = environment.getProperty("os.name");
//包含Windows则说明是windows系统,返回true
if (property.contains("Windows")){
return true;
}
return false;
}
}
测试
// public ApplicationContext ApplicationContext;
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
@Test
public void test1(){
String osName = applicationContext.getEnvironment().getProperty("os.name");
System.out.println("当前系统为:" + osName);
Object bill = applicationContext.getBean("linus");
System.out.println(bill);
}
@ConditionalOnMissingBean注解
两个类,一个Computer类,一个配置类,想要完成;如果容器中没有Computer类,就注入备用电脑Computer类,如果有Computer就不注入;
实体
@Data
@AllArgsConstructor
public class Computer {
public String name;
}
配置类
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanConfig {
// @Bean(name = "notebookPC") 有的时候就会输出这个而不是备用电脑
public Computer computer1() {
return new Computer("笔记本电脑");
}
// @ConditionalOnBean(Computer.class) (此处是五)
@ConditionalOnMissingBean(Computer.class)
@Bean("notebookPC")
public Computer computer2() {
return new Computer("备用电脑");
}
}
测试
public ApplicationContext ApplicationContext;
@Test
public void test1() {
Map<String, Computer> beansOfType = ApplicationContext.getBeansOfType(Computer.class);
System.out.println(JSON.toJSONString(beansOfType));
}
@ConditionalOnBean注解就会很简单,跟@ConditionalOnMissingBean(四、)相反。
@ConditionalOnBean注解是,如果有容器中有Computer类,就注入备用电脑Computer类,如果没有Computer就不注入
这个注解会判断类路径上是否有指定的类,一开始看到的时候比较困惑,类路径上如果没有指定的class,那编译也通过不了啊…这个主要用于集成相同功能的第三方组件时用,只要类路径上有该组件的类,就进行自动配置,比如spring boot web在自动配置视图组件时,是用Velocity,还是Thymeleaf,或是freemaker时,使用的就是这种方式。
@Configuration
@ConditionalOnClass({FighterA.class})
//@ConditionalOnClass(name = {"com.zhk.Fighter"}) 未发现此类就不注入下面的bean
public class VanConfigA {
@Primary
@Bean
public Van vanA(){
return new Van(new FighterA());
}
}
在spring boot中有时候需要控制配置类是否生效,可以使用@ConditionalOnProperty注解来控制@Configuration是否生效.
配置类
@Configuration
@ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true")
public class FilterConfig {
//prefix为配置文件中的前缀,
//name为配置的名字
//havingValue是与配置的值对比值,当两个值相同返回true,配置类生效.
@Bean
public String testA() {
return "success";
}
}
配置
filter.loginFilter=true
等等等------这个遇到了就百度就好 本文自己看防止忘记