Spring Boot IoC(七)条件装配Bean

版权声明:From Lay https://blog.csdn.net/Sadlay/article/details/83277179

上一篇 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的作用域

猜你喜欢

转载自blog.csdn.net/Sadlay/article/details/83277179
今日推荐