当前位置: 首页 > 知识库问答 >
问题:

如何在没有XML的情况下,基于Spring的属性在运行时注入不同的服务

金飞翼
2023-03-14

我正在使用Spring Boot for Java独立应用程序。我有一个利用服务的bean。我想在运行时根据Spring的属性文件中的属性(4)注入该服务的不同实现。

这听起来像工厂模式,但是Spring也允许使用注释来解决问题,就像这样。

@Autowired @Qualifier("selectorProperty") private MyService myService;

然后在beans.xml文件中,我有一个别名,这样我就可以使用@Qualiator中的属性。

<alias name="${selector.property}" alias="selectorProperty" />

在我的不同实现中,我会有不同的限定符。

@Component("Selector1")
public class MyServiceImpl1

@Component("Selector2")
public class MyServiceImpl2

应用属性

selector.property = Selector1

selector.property = Selector2

而关于工厂模式,在Spring中,您可以使用ServiceLocatorFactoryBean创建一个工厂,该工厂将为您提供相同的功能

<bean
  class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean"
  id="myServiceFactory">
  <property
    name="serviceLocatorInterface"
    value="my.company.MyServiceFactory">
  </property>
</bean>

public interface MyServiceFactory
{
    MyService getMyService(String selector);
}

然后在bean中,您可以使用类似的东西在运行时根据属性的值获得正确的实现。

@Value("${selector.property}") private String selectorProperty;

@Autowired private MyServiceFactory myServiceFactory;

private MyService myService;

@PostConstruct
public void postConstruct()
{
    this.myService = myServiceFactory.getMyService(selectorProperty);
}

但是这个解决方案的问题是,我找不到避免使用XML来定义工厂的方法,我想只使用注释。

所以问题是,有没有一种方法可以只使用注释来使用ServiceLocatorFactoryBean(或类似的东西),或者如果我不想在XML中定义bean,我是否必须使用@Autoween@Qualiator的方式?或者有没有其他方法可以在运行时基于Spring 4避免XML的属性注入不同的服务?如果您的答案是只使用@Autoween@Qualiator和别名,请给出为什么这比使用众所周知的工厂模式更好的原因。

使用额外的XML迫使我在我的Launcher类中使用@重要性资源("classpath:beans.xml"),我也不想使用它。

谢谢

共有2个答案

魏高邈
2023-03-14

我使用的是Spring配置文件

例如,对于使用它的数据源,您可以定义任意多个数据源

@Configuration
@Profile("dev")
public class StandaloneDataConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.HSQL)
            .addScript("classpath:com/bank/config/sql/schema.sql")
            .addScript("classpath:com/bank/config/sql/test-data.sql")
            .build();
    }

}

@Configuration
@Profile("cloud")
public class CloudDataConfig {

    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.HSQL)
            .addScript("classpath:com/bank/config/sql/schema.sql")
            .addScript("classpath:com/bank/config/sql/test-data.sql")
            .build();
    }

}

在运行时,通过指定

-斯普林。个人资料。active=“myProfile”

您激活了一个或另一个配置(所有配置都必须导入到主配置中,根据活动配置文件忽略它们)。

下面是一篇好文章:http://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/

单于奇略
2023-03-14

实际上,通过在配置文件中将ServiceLocatorFactory声明为bean,可以使用不带XML的ServiceLocatorFactory。

@Bean
public ServiceLocatorFactoryBean myFactoryServiceLocatorFactoryBean()
{
    ServiceLocatorFactoryBean bean = new ServiceLocatorFactoryBean();
    bean.setServiceLocatorInterface(MyServiceFactory.class);
    return bean;
}

@Bean
public MyServiceFactory myServiceFactory()
{
    return (MyServiceFactory) myFactoryServiceLocatorFactoryBean().getObject();
}

然后仍然可以像往常一样使用工厂,但不涉及XML。

@Value("${selector.property}") private String selectorProperty;

@Autowired @Qualifier("myServiceFactory") private MyServiceFactory myServiceFactory;

private MyService myService;

@PostConstruct
public void postConstruct()
{
    this.myService = myServiceFactory.getMyService(selectorProperty);
}
 类似资料:
  • 问题内容: 我想要一种简单的,最好是基于注释的方式,将外部属性注入到Java程序中,而无需使用spring框架() SomeClass.java application.yml 在标准库中是否有建议的方法? 问题答案: 我最终使用apache commons配置: pom.xml: src /…/ PropertiesLoader.java /src/main/resources/applicat

  • 我正在尝试设置SpringXML配置,而不必创建进一步的。但是我经常遇到以下异常,即使我在 spring.xml: 我错过了什么?

  • 我有一个Spring boot项目,它有使用kafka进行日志记录的依赖项。我无法摆脱所述依赖项,因为我的逻辑需要来自该依赖项的代码 我已尝试禁用自动配置 我尝试通过bean配置将missingTopicsFatal设置为false 但很明显,设置已经是假的,因为我的应用程序运行时没有失败,只是tomcat不想打开侦听端口 应用程序启动,但spring拒绝打开侦听端口,并继续使用错误进行循环 在本

  • 我有一个从maven项目构建的jar文件。在它的pom,我有Spring靴和防波堤。我的项目的目的是在我的网站上实现web套接字。Jetty的web套接字实现不包含一个主方法,只包含一个类,这样它就知道当它收到web套接字请求时该怎么做。然后我尝试java-jar target/myproject-0.0.1-snapshot.jar,但我得到错误“no main manifest attribu

  • 文档说这个库运行在GPU上。如果我功能强大的笔记本电脑没有GPU,我还能运行Deeplearning4J吗?

  • 问题内容: 我可以在没有jQuery的情况下访问数据属性吗? 使用jQuery很容易,但是如果没有jQuery,我在任何地方都看不到该怎么做。 如果我在Google上搜索“没有jQuery”,那么我得到的只是jQuery示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。