【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!! (2)

现在,我们就要提出新的需求了,比如,如果当前操作系统是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()方法中,如下所示。

@Test public 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 10 person binghe001 binghe002 给容器中添加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:注释信息 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //判断是否是Linux系统 //1.获取到IOC容器使用的BeanFactory ConfigurableListableBeanFactory 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:注释信息 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //判断是否是Linux系统 //1.获取到IOC容器使用的BeanFactory ConfigurableListableBeanFactory 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"); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspgdj.html