ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-Spring-如果存在主bean,则不要创建bean

2019-11-18 01:11:20  阅读:635  来源: 互联网

标签:dependency-injection spring-profiles spring-bean spring java


如果它可以作为主bean生成,是否可以防止创建A类型的bean

例:

我有两个配置类和两个配置文件.

AppConfig.java :(具有所有bean的通用配置类)

@Configuration
public class AppConfig {
    @Value("${host}")
    private String host;

    @Bean
    public A getA() {
        //uses the 'host' value to create an object  of type A
       // Involves database connections
    }

    @Bean
    public B getB(A a) {  //Others using bean A. This might come from either getA() or getOtherA()
        ...
    }

}

SpecificConfig.java :(仅当profile-a处于活动状态时,才会创建这些bean)

@Configuration
@Profile("profile-a")
public class SpecificConfig{
    @Bean
    @Primary
    public A getOtherA() {
     //return a bean of type A
    }
}

在这里,当选择profile-a时,类型为A的Bean将来自SpecificConfig.java.但是问题在于,当配置文件-a处于活动状态时,AppConfig.java中的参数主机不可用,因此AppConfig中的getA方法将引发异常.

由于类型A的bean已经存在或将要存在(我不确定bean创建的顺序),所以我不希望执行AppConfig中的getA().
(当配置文件-a有效时)

有没有办法做到这一点?

可能的解决方案:

>将@Profile({“!profile-a”})添加到AppConfig中的getA方法的顶部.
>如果检查主机参数是否存在,则添加.

我不想做以上两个,因为我必须在多个地方进行更改.
(还有很多其他的类,例如A和其他参数,例如host)

谢谢

让我知道是否需要澄清.

解决方法:

Spring Boot auto-configurationCondition annotations是约束bean创建的解决方案.

> @ConditionalOnBean:检查指定的Bean类和/或名称是否已包含在BeanFactory中.
> @ConditionalOnProperty:检查指定的属性是否具有特定值

例:

@Configuration
public class SpecificConfig{
   @Bean
   @ConditionalOnBean(A.class)
   @Primary
   public A getOtherA() {
    //return a bean of type A
   }
}

标签:dependency-injection,spring-profiles,spring-bean,spring,java
来源: https://codeday.me/bug/20191118/2024594.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有