package com.lei.study_09_14.condition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; import org.springframework.core.type.AnnotatedTypeMetadata; /** * * * @author LeiLei * @date 2019/9/14 */ public class LinuxCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { ConfigurableListableBeanFactory bf = context.getBeanFactory(); BeanDefinitionRegistry reg = context.getRegistry(); ClassLoader cl = context.getClassLoader(); ResourceLoader rl = context.getResourceLoader(); Environment env = context.getEnvironment(); String name = env.getProperty("os.name"); System.out.println(name); if (name.contains("Linux")) { return true; } return false; } }
package com.lei.study_09_14.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotatedTypeMetadata; /** * @author LeiLei * @description ${DESCRIPTION} * @date 2019/9/14 */ public class WindowCondition implements Condition { public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment env = context.getEnvironment(); String name = env.getProperty("os.name"); System.out.println(name); if (name.contains("Windows")) { return true; } return false; } }
package com.lei.study_09_14.config; import com.lei.study_09_13.bean.Person; import com.lei.study_09_14.bean.Lei; import com.lei.study_09_14.condition.LinuxCondition; import com.lei.study_09_14.condition.WindowCondition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** * * * @author LeiLei * @date 2019/9/13 */ //如果写在方法上,则满足时,下面的所有方法组件都会装配,反之,都不会装配 @Conditional({WindowCondition.class}) @Configuration public class BeanConfig3 { //@Conditional({WindowCondition.class}) @Bean public Person bill() { return new Person("bill gates",62); } //@Conditional({LinuxCondition.class}) @Bean public Person linus() { return new Person("linus",48); } //@Bean public Lei lei() { return new Lei(); } }
@Test public void testCondition() { ApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig3.class); System.out.println("容器初始化完成。。。"); String[] names = context.getBeanDefinitionNames(); //Object a = context.getBean("lei"); //System.out.println(a); //String[] names = context.getBeanNamesForType(Person.class); for (String name : names) { System.out.println(name); } }
总结:
1.@Conditional注解放在方法上,对一个方法组件生效。
2.@Conditional注解放在类上,针该类下所有方法组件生效。
3.@Conditional声明为实现Condition接口的类。