我正在使用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")
,我也不想使用它。
谢谢
我使用的是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/
实际上,通过在配置文件中将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示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。