@Conditional和@Import

@Conditional

它是Spring-context包下的一个注解
按照一定的条件判断,满足条件给容器中注册Bean组件,它有很多扩展。
在这里插入图片描述

@Import

在这里插入图片描述

用法一:引入其他配置类

@Configuration
public class MyConfig3 {
	//....
}

@Configuration
@Import({MyConfig3.class})
public class SpringConfig {
}

用法二:引入包选择器

具体实现:实现ImportSelector 接口,重写selectImports方法

public class MyImportSelector implements ImportSelector {
    /**
     * @param importingClassMetadata: 当前标注了@Import注解类的所有注解的信息
     * @return String[] 数组,返回需要导入的组件的全类名数组
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        int i = 0;
        String className = importingClassMetadata.getClassName();
        System.out.println("标注@Import注解的类:"+className);
        Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
        for (String annotationType : annotationTypes) {
            System.out.println("标注@Import注解类上的全部注解"+i+": "+annotationType);
            i++;
        }
        String[] s = new String[]{"com.herd.bean.Person","com.herd.bean.Red"};
        return s;
    }
}
@Import({MyImportSelector.class)
public class SpringConfig {
}

用法三:引入bean定义注册信息 手工注册

具体实现:实现ImportBeanDefinitionRegistrar 接口,重写registerBeanDefinitions方法

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     *
     * @param importingClassMetadata 当前类的注解信息
     * @param registry  BeanDefinition注册类:
     *                  把所有需要添加到容器中的bean,注册; 
     *                  通过registry.registerBeanDefinitions()手工注册
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        //判断容器中是否包含某个bean
        boolean definition = registry.containsBeanDefinition("com.herd.bean.Person");
        System.out.println("是否含有com.herd.bean.Person的bean:"+definition);
        int count = registry.getBeanDefinitionCount();
        System.out.println("容器中bean的数量:"+count);
        /**
         * 手工注册
         */
        RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
        //自定义bean的名称
        registry.registerBeanDefinition("rainBow",beanDefinition);
    }
}
public class RainBow {
}

用法四:自己写的bean或者第三方

//自己写的类
public class Blue {
}

@Configuration
@Import({Blue.class, DateFormatterRegistrar.class})
public class MyConfig {

}

最后一种:引入一个FactoryBean

具体实现:实现FactoryBean,重写方法

public class ColorFactoryBean implements FactoryBean {

	//返回bean
    @Override
    public Object getObject() throws Exception {
        return new Pink();
    }
	//bean的类型
    @Override
    public Class<?> getObjectType() {
        return Pink.class;
    }
	//是否单例
    @Override
    public boolean isSingleton() {
        return true;
    }
}

//pink类
public class Pink {
}
@Configuration
@Import({ColorFactoryBean.class})
public class SpringConfig {
}

注意默认获取的时getObject()方法中的对象,若是想要获取ColorFactoryBean对象,则在获取时加上一个&

 @Test
    public void test03(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //打印容器中所有的bean
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
        Object bean = context.getBean("com.herd.condition.ColorFactoryBean");
        System.out.println(bean);
        Object bean1 = context.getBean("&com.herd.condition.ColorFactoryBean");
        System.out.println(bean1);
    }

结果:
在这里插入图片描述


使用:AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(xxxConfig.class);加载配置类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值