Springboot部分装配注解

多个bean使用

**@Primary:**自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

  @Primary
  @Bean
  public Van vanA(){
    return new Van(new FighterA());
  }

一、@configurationproperties

注解读取配置类属性到实体类属性上赋值

导包

<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

@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;
    }
 
}

三、@Conditional

它的作用是按照一定的条件进行判断,满足条件给容器注册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

@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

@ConditionalOnBean注解就会很简单,跟@ConditionalOnMissingBean(四、)相反。
@ConditionalOnBean注解是,如果有容器中有Computer类,就注入备用电脑Computer类,如果没有Computer就不注入

六、@ConditionalOnClass

这个注解会判断类路径上是否有指定的类,一开始看到的时候比较困惑,类路径上如果没有指定的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());
  }
}

六、@ConditionalOnProperty

在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

等等等------这个遇到了就百度就好 本文自己看防止忘记

你可能感兴趣的:(idea,spring,boot,java,spring)