Spring注解驱动开发——组件注册 @Conditional按照条件注册bean
@Conditional
spring4.0之后添加的功能,按照一定的条件进行判断,满足条件注册bean
场景:2个Bean按照 Conditional 条件看注入或者不住入
@Bean public Person Bill(){ return new Person("Bill Gates",67); } @Conditional(value=LinuxCondition.class) @Bean public Person linus(){ return new Person("linus",67); }
场景:Conditional 条件:windows系统下注入Bill linux系统下注入linus
windows: 判断的实现类
package com.mongoubiubiu.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.type.AnnotatedTypeMetadata; /** * 判断是否是Windows系统 * @author 86138 * */ public class WindowCondition implements Condition { /** * ConditionContext 判断条件能使用的上下文(环境) * AnnotatedTypeMetadata 标记Condition 注解的注释信息 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //能获取到ioc 当前使用的bean工厂 ConfigurableListableBeanFactory config= context.getBeanFactory(); //获取到类加载器 ClassLoader classLoader = context.getClassLoader(); //获取到运行时环境 Environment environment=context.getEnvironment(); //获取到bean定义的注册类 BeanDefinitionRegistry registry=context.getRegistry(); String osName=environment.getProperty("os.name"); if(osName.equals("Windows 10")){ System.out.println("进入了判断"); return true; } return false; } }
Linux: 判断的实现类
package com.mongoubiubiu.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.type.AnnotatedTypeMetadata; public class LinuxCondition implements Condition{ /** * ConditionContext 判断条件能使用的上下文(环境) * AnnotatedTypeMetadata 标记Condition 注解的注释信息 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //能获取到ioc 当前使用的bean工厂 ConfigurableListableBeanFactory config= context.getBeanFactory(); //获取到类加载器 ClassLoader classLoader = context.getClassLoader(); //获取到运行时环境 Environment environment=context.getEnvironment(); //获取到bean定义的注册类 BeanDefinitionRegistry registry=context.getRegistry(); String osName=environment.getProperty("os.name"); if(osName.equals("linux")){ System.out.println("进入了判断"); return true; } return false; } }
标在方法上
Junit测试Windows
输出
linus 确实没有注入
测试linux
@Test public void test03(){ Environment en= applica.getEnvironment(); String [] af=applica.getBeanNamesForType(Person.class); for (String string : af) { System.out.println(string); } Map<String, Person> map= applica.getBeansOfType(Person.class); Environment environment=applica.getEnvironment(); String property=environment.getProperty("os.name"); // System.out.println(property); // System.out.println(map.toString()); }
只注入了linus 生效
标在类上
而目前是linux 条件是windows 才创建对象放入容器
Junit测试
@Test public void test03(){ Environment en= applica.getEnvironment(); String [] af=applica.getBeanNamesForType(Person.class); for (String string : af) { System.out.println(string); } Map<String, Person> map= applica.getBeansOfType(Person.class); Environment environment=applica.getEnvironment(); String property=environment.getProperty("os.name"); System.out.println(property); System.out.println(map.toString()); }
测试 发现一个都没有
本文作者:KwFruit
本文链接:https://www.cnblogs.com/mangoubiubiu/p/15059384.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
Spring注解驱动开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步