Spring限定符和属性占位符
有谁知道我是否应该能够在限定符中使用属性占位符作为表达式?我似乎无法得到这个工作。Spring限定符和属性占位符
我使用的是spring 3.0.4。
@Controller public class MyController {
@Autowired
@Qualifier("${service.class}")
Service service;
}
@Service
@Qualifier("ServiceA")
ServiceA implements Service {
public void print() {
System.out.println("printing ServiceA.print()");
}
}
@Service
@Qualifier("ServiceB")
ServiceB implements Service {
public void print() {
System.out.println("printing ServiceB.print()");
}
}
XML:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="file:/etc/config.properties"/>
</bean>
config.properties:
config.properties service.class=serviceB
回答:
我冒昧猜测答案是否定的,只是根据在少数的javadoc页面写窗口。例如,请参阅该文档为@Value
:
http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/annotation/Value.html
通知他们做出的注解使用表达式的特别关注。作为对比,@Qualifier
文档:
http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/annotation/Qualifier.html
这使得没有提及的表达式。显然不是一个明确的答案(但春天通常对文档非常好)。另外,如果在@Qualifier
注释中支持表达式,我希望它们的工作方式与@Value
注释相同(只是基于spring是一个非常一致的框架)。
Spring 3.1具有新的配置文件bean功能,它看起来像它可以完成像你想要做的事情。下面是一个写了起来:
http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/
回答:
也许给这个一抡:
@Controller public class MyController {
private String serviceId;
@Value("${serviceId}")
public void setServiceId(String serviceId) {
this.serviceId = serviceId;
}
@Autowired
@Qualifier(serviceId)
Service service;
}
回答:
这工作。如果您只使用默认的Spring bean名称,则可以忽略服务名称。 serviceA VS ServiceA等
@Controller class MyController {
@Autowired(required=false)
@Qualifier("Service")
Service service;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("app-ctx.xml", MyController.class);
for(String s:context.getBeanDefinitionNames()){
System.out.println(s);
for(String t:context.getAliases(s)){
System.out.println("\t" + t);
}
}
context.getBean(MyController.class).service.print();
}
}
public interface Service {
void print();
}
@Service(value="ServiceA")
public class ServiceA implements example.Service {
public void print() {
System.out.println("printing ServiceA.print()");
}
}
@Service(value="ServiceB")
public class ServiceB implements example.Service {
public void print() {
System.out.println("printing ServiceB.print()");
}
}
XML:
<beans> <alias name="${service.class}" alias="Service"/>
<context:property-placeholder location="example/app.properties"/>
<context:component-scan base-package="example"/>
<beans>
道具:
service.class=ServiceB
回答:
此方法适用于没有XML与属性文件。
此致类改进:
MyController.java
:
@Controller public class MyController {
@Autowired
public MyController(@Qualifier("MyServiceAlias") MyService myService) {
myService.print();
}
}
ServiceA.java
:
@Service("serviceA") public class ServiceA implements MyService {
@Override
public void print() {
System.out.println("printing ServiceA.print()");
}
}
ServiceB.java
:
@Service("serviceB") public class ServiceB implements MyService {
@Override
public void print() {
System.out.println("printing ServiceB.print()");
}
}
application.properties
(在这里你可以更改类将被加载):
service.class=serviceA
和重要的配置文件AppConfig.java
:
@Configuration public class AppConfig {
@Autowired
private ApplicationContext context;
@Bean
public MyService MyServiceAlias(@Value("${service.class}") String qualifier) {
return (MyService) context.getBean(qualifier);
}
}
附加说明:
- 使用
@Qualifier
只为该字段将被自动装配。对于服务,要指定bean名称,请使用@Service
。 - 如果你想标准bean名称,你不需要使用
@Service
specyify名称。例如,ServiceA的标准bean名称是serviceA
(不是ServiceA
- 请参阅大首字母),因此@Service("serviceA")
冗余(@Service
就足够了)。 - 我基于
AppConfig
对此回答:Spring Bean Alias in JavaConfig。 - 此解决方案比此Spring Qualifier and property placeholder更好,因为您不需要XML。
- 测试Spring Boot 1.5.7。
以上是 Spring限定符和属性占位符 的全部内容, 来源链接: utcz.com/qa/266348.html