【问题标题】:Spring bean autowiring based on property基于属性的 Spring bean 自动装配
【发布时间】:2017-03-15 04:20:59
【问题描述】:

我想在属性文件中指定,哪个 bean 将被自动装配。
我找到了解决方案,但它们都使用 @Profile 注释,这意味着它们基于指定的配置文件,而不是指定的属性。

我就是这样做的:

@Configuration
public class WebServiceFactory {
    @Value("${webservice}")
    private String webService;
    @Lazy
    @Autowired
    private GraphQLService graphQLService;
    @Lazy
    @Autowired
    private RestService restService;

    @Primary
    @Bean
    WebService getWebService() {
        switch (webService) {
            case "graphQlService":
                return graphQLService;
            case "restService":
                return restService;
            default:
                throw new UnsupportedOperationException("Not supported web service.");
        }
    }
}

我要自动装配的 Bean 类型是接口 WebService,GraphQLService 和 RestService 是它的实现。
有没有更好的方法来做到这一点?

【问题讨论】:

  • 你想根据属性文件将一个bean注入另一个吗?或者你有很多 Webservices 实现和很多 GraphQSService 实现,你想在运行时注入一个特定的实现?
  • 是的,我有 application.properties 文件,并且有值“webservice”。 Spring 应该读取这个值并注入正确的 bean。

标签: java spring javabeans


【解决方案1】:

你可以使用 Spring 的正常配置来做到这一点。

class A{
 B bBean;
 ...//setters/getters here.
}

class B{}

你可以有一个配置文件(也可以是一个配置类)

<bean id = "a" class = "A">
      <property name="bBean" ref="b"/>     
   </bean>

<bean id = "b" class = "B">   
   </bean>

bBean 配置可以在不同的文件中,因此您可以从类路径中导入它。您可以在类路径或系统文件中使用配置文件,而不是使用属性文件。如果 B 是一个不同的实现,那么你用正确的类修改你的配置文件。

【讨论】:

  • 非常感谢您的回答,但有什么方法可以使用注释以编程方式执行此操作?
  • 为什么要使用注解?注释使用固定值,它更受限制。您可以使用配置文件或类来做同样的事情。
  • 你是对的,在这种情况下使用xml配置会更好。谢谢!
  • 注意,你也可以使用类配置。带有@bean 注释。并且对 xml 文件执行相同的操作。类与文件相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2018-07-22
  • 2011-11-30
  • 2017-05-23
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多