Spring Boot IoC(七)条件装配Bean

上一篇 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,否则不装配。

下一篇 Spring Boot IoC(八)Bean的作用域

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值