Spring注解驱动开发 第四节Conditional根据条件注册bean
@Configuration
public class MainConfig2 {
/**
* @see
* ConfigurableBeanFactory#SCOPE_PROTOTYPE
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
*/
//@Scope("prototype")
//@Lazy
@Bean
public Person person(){
System.out.println("person类被初始化了...");
return new Person("张三","27");
}
/**
* Conditional:按照一定的条件进行判断,满足条件给容器中注册bean
* 如果系统是linux就给容器注册林纳斯,
* 如果系统是windows就给容器注册比尔盖茨.
* @return
*/
@Conditional({WindowsCondition.class})
@Bean
public Person bill(){
return new Person("比尔盖茨","60");
}
@Conditional({LinuxCondtition.class})
@Bean
public Person linus(){
return new Person("林纳斯","50");
}
}
首先先在配置类中注入两个bean,一个windows,一个linux。
/**
* 判断操作系统是否windows
*/
public class WindowsCondition implements Condition {
//ConditionContext 判断条件能使用的上下文环境
//AnnotatedTypeMetadata 获取当前标注了Conditional注解的注释信息
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//可以获取当前ioc使用的beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//获取类加载器
ClassLoader classLoader = context.getClassLoader();
//获取上下文环境变量
Environment environment = context.getEnvironment();
//获取bean定义系统,可以用它注册bean,移除bean
BeanDefinitionRegistry registry = context.getRegistry();
String systemName = environment.getProperty("os.name");
if (systemName.contains("Windows")) {
return true;
}
return false;
}
}
/**
* 判断操作系统是否linux
*/
public class LinuxCondtition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//获取上下文环境变量
Environment environment = context.getEnvironment();
if(environment.getProperty("os.name").contains("linux")){
return true;
}
return false;
}
}
上面的两个是根据当前环境的上下文判断向spring容器注入哪个bean,代码片段中有详细注释各个方法的作用。
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
@Test
public void test03(){
String[] names = context.getBeanNamesForType(Person.class);
for(String name : names){
System.out.println(name);
}
Map<String,Person> map = context.getBeansOfType(Person.class);
System.out.println(map);
}
获取当前spring容器中类型为person的所有id名称,并获取当前spring容器中person类型的所有详细数据信息。
运行打印结果:
四月 22, 2019 4:50:12 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Mon Apr 22 16:50:12 GMT+08:00 2019]; root of context hierarchy
person类被初始化了...
person
bill
{person=Person{name='张三', age='27'}, bill=Person{name='比尔盖茨', age='60'}}
Process finished with exit code 0
可以看出由于当前系统是windows,所以比尔盖茨被注册到spring容器中
然后我们修改java虚拟机参数,将其设置为linux。
然后再次运行,打印结果:
四月 22, 2019 4:52:28 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2ff5659e: startup date [Mon Apr 22 16:52:28 GMT+08:00 2019]; root of context hierarchy
person类被初始化了...
person
linus
{person=Person{name='张三', age='27'}, linus=Person{name='林纳斯', age='50'}}
Process finished with exit code 0
可以看出林纳斯被注册到spring容器中。
如果@Conditional被注册在类上,就表示复核当前条件的话,person,linux,windows都被注册到spring容器中。