注解-组件注册03-@Scope @Lazy @Conditional

一、@Scope

默认单例
1. singleton 单实例(默认值),IOC容器启动会调用方法创建对象放在容器中,以后每次获取直接从容器中拿
2. prototype 多实例,IOC容器启动不会调用方法创建对象放在容器中,每次获取时才会调用方法创建对象--懒加载
3. request 同一个请求创建一个实例
4. session 同一个session创建一个实例

 二、@Lazy

懒加载,默认是true

三、@Conditional

@Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册bean
@Configuration
public class MainConfig2 {
    /**
     * @Conditional({Condition}):按照一定的条件进行判断,满足条件给容器中注册bean
     * 如果系统是windows,给容器注册bill
     * 如果系统是linux,给容器注册linus
     * @return
     */
    @Conditional({WinCondition.class})//该注解也可以配置在类上
    @Bean("bill")
    public Person person01(){
        return new Person("Bill Gates",62);
    }
    @Conditional({LinuxCondition.class})
    @Bean("linux")
    public Person person02(){
        return new Person("linus",48);
    }
}
/**
 * @author Millet
 * @date 2020/6/8 23:28
 */
public class LinuxCondition implements Condition {
    /**
     *
     * @param conditionContext 判断条件能使用的上下文(环境)
     * @param annotatedTypeMetadata 注释信息
     * @return
     */
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //判断是否是Linux系统
        //1.获取到IOC使用的beanFactory
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
        //2. 获取到类加载器
        ClassLoader classLoader = conditionContext.getClassLoader();
        //3. 获取到当前环境信息
        Environment environment = conditionContext.getEnvironment();
        //4. 获取到bean定义的注册类
        BeanDefinitionRegistry registry = conditionContext.getRegistry();

        String property = environment.getProperty("os.name");
        if(property.contains("Linux")){
            return true;
        }
        return false;
    }
}
LinuxCondition
/**
 * @author Millet
 * @date 2020/6/8 23:28
 */
public class WinCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Environment environment = conditionContext.getEnvironment();
        String property = environment.getProperty("os.name");
        if(property.contains("Windows")){
            return true;
        }
        return false;
    }
}
WinCondition

 

posted @ 2020-06-10 11:38  Qmillet  阅读(145)  评论(0编辑  收藏  举报