如何按照条件向Spring容器中注册bean?这次我懂了( 二 )

再次运行SpringBeanTest类中的testAnnotationConfig6()方法,输出结果如下所示 。
personbinghe001binghe002给容器中添加Person....{person=Person(name=binghe002, age=18), binghe001=Person(name=binghe001, age=18), binghe002=Person(name=binghe002, age=20)}可以看到,输出了注册到容器的bean 。
带条件注册bean现在,我们就要提出新的需求了,比如,如果当前操作系统是windows操作系统,则向Spring容器中注册binghe001;如果当前操作系统是linux操作系统,则向Spring容器中注册binghe002 。此时,我们就需要使用@Conditional注解了 。
这里,有小伙伴可能会问:如何获取操作系统的类型呢,别急,这个问题很简单,我们继续向下看 。
使用Spring的ApplicationContext接口就能够获取到当前操作系统的类型,如下所示 。
ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);Environment environment = context.getEnvironment();String osName = environment.getProperty("os.name");System.out.println(osName);我们将上述代码整合到SpringBeanTest类中的testAnnotationConfig6()方法中,如下所示 。
@Testpublic void testAnnotationConfig6(){ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class);Environment environment = context.getEnvironment();String osName = environment.getProperty("os.name");System.out.println(osName);String[] names = context.getBeanNamesForType(Person.class);Arrays.stream(names).forEach(System.out::println);Map<String, Person> beans = context.getBeansOfType(Person.class);System.out.println(beans);}接下来,我们运行SpringBeanTest类中的testAnnotationConfig6()方法,输出的结果信息如下所示 。
Windows 10personbinghe001binghe002给容器中添加Person....{person=Person(name=binghe002, age=18), binghe001=Person(name=binghe001, age=18), binghe002=Person(name=binghe002, age=20)}由于我使用的操作系统是Windows 10操作系统,所以在结果信息中输出了Windows 10 。
到这里,我们成功获取到了操作系统的类型,接下来,就可以实现:如果当前操作系统是Windows操作系统,则向Spring容器中注册binghe001;如果当前操作系统是Linux操作系统,则向Spring容器中注册binghe002的需求了 。此时,我们就需要借助Spring的@Conditional注解来实现了 。
要想使用@Conditional注解,我们需要实现Condition接口来为@Conditional注解设置条件,所以,这里,我们创建了两个实现Condition接口的类,分别为WindowsCondition和LinuxCondition,如下所示 。

  • WindowsCondition
package io.mykit.spring.plugins.register.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;/** * @author binghe * @version 1.0.0 * @description Windows条件,判断操作系统是否是Windows */public class WindowsCondition implements Condition {/*** ConditionContext:判断条件使用的上下文环境* AnnotatedTypeMetadata:注释信息*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//判断是否是Linux系统//1.获取到IOC容器使用的BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();//2.获取类加载器ClassLoader classLoader = context.getClassLoader();//3.获取当前的环境信息Environment environment = context.getEnvironment();//4.获取bean定义的注册类,我们可以通过BeanDefinitionRegistry对象查看//Spring容器中注册了哪些bean,也可以通过BeanDefinitionRegistry对象向//Spring容器中注册bean,移除bean,查看bean的定义,查看是否包含某个bean的定义BeanDefinitionRegistry registry = context.getRegistry();String property = environment.getProperty("os.name");return property.contains("Windows");}}
  • LinuxCondition
package io.mykit.spring.plugins.register.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;/** * @author binghe * @version 1.0.0 * @description Linux条件,判断操作系统是否是Linux */public class LinuxCondition implements Condition {/*** ConditionContext:判断条件使用的上下文环境* AnnotatedTypeMetadata:注释信息*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {//判断是否是Linux系统//1.获取到IOC容器使用的BeanFactoryConfigurableListableBeanFactory beanFactory = context.getBeanFactory();//2.获取类加载器ClassLoader classLoader = context.getClassLoader();//3.获取当前的环境信息Environment environment = context.getEnvironment();//4.获取bean定义的注册类,我们可以通过BeanDefinitionRegistry对象查看//Spring容器中注册了哪些bean,也可以通过BeanDefinitionRegistry对象向//Spring容器中注册bean,移除bean,查看bean的定义,查看是否包含某个bean的定义BeanDefinitionRegistry registry = context.getRegistry();String property = environment.getProperty("os.name");return property.contains("linux");}}


推荐阅读