如何在 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>

问题是运行时 MyServiceMyFile 文件中的变量 path 在实例化 MyFile 调用我的服务 MyService.

我正在寻找将我的 属性 ${FILE_PATH} 注入 MyFile.

的解决方案

这是我的环境:

我看到 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 获取所需的属性