如何在 Spring 非托管 class 上使用 @Value
How to use @Value on Spring non-managed class
在解释我的问题之前,这是我的(简化的)代码:
foo.bar.MyFile
public class MyFile extends MyFileAbstract {
@Value("${FILE_PATH}")
private String path;
[...]
public MyFile(final Date date, final String number, final List<MyElement> elements) {
this.date = date;
this.number = number;
this.elements = elements;
}
@Override
public String getPath() {
return path;
}
[...]
}
foo.bar.MyService
@Service
public class MyService {
[...]
public String createFolder(MyFileAbstract file) throws TechnicalException {
[...]
String path = file.getPath();
[...]
}
[...]
}
服务调用
[...]
@Autowired
MyService service;
public void MyMethod() {
MyFile file = new MyFile();
service.createFolder(file);
[...]
}
[...]
我使用上下文 XML 来配置 Spring :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:property-placeholder
file-encoding="utf-8"
location="file:///[...]/MyProperties.properties" />
<context:annotation-config />
<context:component-scan base-package="foo.bar.classes" />
[...]
</beans>
问题是运行时 MyService
和 MyFile
文件中的变量 path
在实例化 MyFile
调用我的服务 MyService
.
我正在寻找将我的 属性 ${FILE_PATH}
注入 MyFile
.
的解决方案
这是我的环境:
- 阿帕奇 Tomcat 7
- Java 8
- Spring 4.1.6.RELEASE
我看到 Spring AOP with @Configurable bean 可以解决这个问题,但我不想更改我的 Java 代理,因为我不想修改生产服务器上的配置.
而且我不知道如何在 MyFile
上使用我的自定义构造函数使用 @Service。
欢迎任何想法。
使用@PropertySource 注解
@PropertySource("classpath:config.properties") //use your property file name
public class MyFile extends MyFileAbstract {
@Value("${FILE_PATH}")
private String path;
[...]
public MyFile(final Date date, final String number, final List<MyElement> elements) {
this.date = date;
this.number = number;
this.elements = elements;
}
@Override
public String getPath() {
return path;
}
[...]
}
您可以添加到您的 MyService
@Autowired
private Environment environment;
然后只获取值
environment.getProperty("FILE_PATH");
之后你可以根据需要将它设置到文件中。
@Service
public class BeanUtilityService implements ApplicationContextAware {
@Autowired
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
创建实用程序 class 作为服务,创建静态方法并从 context.Then 获取 bean 使用该 bean 获取所需的属性
在解释我的问题之前,这是我的(简化的)代码:
foo.bar.MyFile
public class MyFile extends MyFileAbstract {
@Value("${FILE_PATH}")
private String path;
[...]
public MyFile(final Date date, final String number, final List<MyElement> elements) {
this.date = date;
this.number = number;
this.elements = elements;
}
@Override
public String getPath() {
return path;
}
[...]
}
foo.bar.MyService
@Service
public class MyService {
[...]
public String createFolder(MyFileAbstract file) throws TechnicalException {
[...]
String path = file.getPath();
[...]
}
[...]
}
服务调用
[...]
@Autowired
MyService service;
public void MyMethod() {
MyFile file = new MyFile();
service.createFolder(file);
[...]
}
[...]
我使用上下文 XML 来配置 Spring :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:property-placeholder
file-encoding="utf-8"
location="file:///[...]/MyProperties.properties" />
<context:annotation-config />
<context:component-scan base-package="foo.bar.classes" />
[...]
</beans>
问题是运行时 MyService
和 MyFile
文件中的变量 path
在实例化 MyFile
调用我的服务 MyService
.
我正在寻找将我的 属性 ${FILE_PATH}
注入 MyFile
.
这是我的环境:
- 阿帕奇 Tomcat 7
- Java 8
- Spring 4.1.6.RELEASE
我看到 Spring AOP with @Configurable bean 可以解决这个问题,但我不想更改我的 Java 代理,因为我不想修改生产服务器上的配置.
而且我不知道如何在 MyFile
上使用我的自定义构造函数使用 @Service。
欢迎任何想法。
使用@PropertySource 注解
@PropertySource("classpath:config.properties") //use your property file name
public class MyFile extends MyFileAbstract {
@Value("${FILE_PATH}")
private String path;
[...]
public MyFile(final Date date, final String number, final List<MyElement> elements) {
this.date = date;
this.number = number;
this.elements = elements;
}
@Override
public String getPath() {
return path;
}
[...]
}
您可以添加到您的 MyService
@Autowired
private Environment environment;
然后只获取值
environment.getProperty("FILE_PATH");
之后你可以根据需要将它设置到文件中。
@Service
public class BeanUtilityService implements ApplicationContextAware {
@Autowired
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(Class<T> beanClass) {
return context.getBean(beanClass);
}
}
创建实用程序 class 作为服务,创建静态方法并从 context.Then 获取 bean 使用该 bean 获取所需的属性