如何在Spring非托管类上使用@Value

时间:2017-05-04 08:59:16

标签: java spring tomcat code-injection

在解释我的问题之前,我的(简化)代码:

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 MyMethodt) {
    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>

问题是当实例化path来调用我的服务MyService时,变量MyFile在运行时在MyFileMyService文件中都为空。

我正在寻找在${FILE_PATH}内注入我的属性MyFile的解决方案。

这是我的环境:

  • Apache Tomcat 7
  • Java 8
  • Spring 4.1.6.RELEASE

我已经看到带有@Configurable bean的Spring AOP可以解决这个问题但不想更改我的Java代理,因为我不想修改生产服务器上的配置。

我不知道如何在MyFile上使用@Service和我的自定义构造函数。

欢迎任何想法。

3 个答案:

答案 0 :(得分:1)

您可以添加到MyService

@Autowired
private Environment environment;

并获得值

environment.getProperty("FILE_PATH");

之后,您可以根据需要将其设置为文件。

答案 1 :(得分:0)

 @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);
   }
}

创建一个Utility类作为服务,创建一个静态方法并从上下文中获取bean,然后使用该bean获取所需的属性

答案 2 :(得分:-1)

使用@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;
    }

    [...]
}