上一篇 Spring Boot IoC(六)使用properties配置文件
七、条件装配Bean
有时候某些客观因素会使得一些Bean无法进行初始化,例如数据库连接池的配置中漏掉一些配置会造成数据源不能连接上。这样的情况下,IoC容器如果还进行数据源的装配,则系统将会抛出异常,导致应用无法继续,这种情况下我们不希望IoC容器去装配数据源。
为了处理这样的场景,Spring提供了@Conditianal
注解帮助我们,它需要配合另外一个接口Condition
(org.springframeword.context.annotation.Condition)来完成对应的功能。
注解@Conditional
我们实现根据条件装配数据源
数据源Bean
@Configuration
public class AppConfig {
@Bean(name = "dataSource", destroyMethod = "close")
@Conditional(value = DataBaseConditional.class)
public DataSource getDataSource(
@Value("${test1.driverName}") String driver, @Value("${test1.url}") String url,
@Value("${test1.username}") String username, @Value("${test1.password}") String password) {
Properties prop = new Properties();
prop.setProperty("driver", driver);
prop.setProperty("url", url);
prop.setProperty("username", username);
prop.setProperty("password", password);
DataSource dataSource = null;
try {
dataSource = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("dataSource装备成功");
return dataSource;
}
}
接口Condition
DataBaseConditional
实现了Condition
接口
public class DataBaseConditional implements Condition {
/**
* 数据库装配条件
* @param context 条件上下文
* @param metadata 注释类型的元数据
* @return true 装配bean,否则不装配
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 取出环境变量
Environment env = context.getEnvironment();
return env.containsProperty("test1.driverName")
&& env.containsProperty("test1.url")
&& env.containsProperty("test1.username")
&& env.containsProperty("test1.password");
}
}
matche
方法首先读取其上下文,然后判定是否已经配置了对应的数据库信息,这样的话当这些都已经配置好后则返回true。这时候Spring会装配数据库连接池的Bean,否则不装配。