如何自动装配 Spring Environment 对象

Posted

技术标签:

【中文标题】如何自动装配 Spring Environment 对象【英文标题】:How to autowire a Spring Environment object 【发布时间】:2013-03-01 14:00:16 【问题描述】:

我正在尝试从我的应用程序对象中的 .properties 文件中获取属性。我唯一知道如何做到这一点的是通过Environment 对象。

在我的配置中效果很好...

@Configuration
@ComponentScan(basePackages = 
        "com.production"
)
@PropertySource(value = 
        "classpath:/application.properties",
        "classpath:/environment-$FETTER_ENVIRONMENT.properties"
)
@EnableJpaRepositories("com.production.repositories")
@EnableTransactionManagement
public class Config 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USER = "db.user";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";

    @Resource
    Environment environment;

但我尝试在另一个类中执行它并且它是空的。我试过使用@Resource@Autowired 和手动注入。

Environment 有什么特别之处可以防止这种情况发生吗?

@Component
public class Vendor 
    private String token;

    @Autowired
    private Environment environment;

    public Vendor() 
        //get token from config
        //Environment environment = (Environment) ApplicationContextProvider.getApplicationContext().getBean("environment");
        setToken(environment.getProperty("api.vendor.token"));
    

    public String getToken() 
        return token;
    

    public void setToken(String token) 
        this.token = token;
    

更新:我发现this resource 突出了@Value 的用法,但我的应用程序中没有使用任何XML 配置。

看起来这可能就是我要找的东西:Loading properties in Spring 3.1 programmatically

【问题讨论】:

我不认为环境与应用程序上下文加载以外的任何事情相关。 我还有其他方法可以从 .properties 文件中获取配置项吗? 想到了@Value 注释,但您必须设置PropertyPlaceholderConfigurer。不要引用我的话,但请查一下。 【参考方案1】:

您需要使用@Value 注释。但之前需要在xml中声明<context:property-placeholder

详情请见here。

另外,另一种方式:

@Inject
ApplicationContext context;
......
Enviroment env = context.getEnvironment();

【讨论】:

【参考方案2】:

您可以使用 spring @Autowired 注释,如下所示,但请确保您使用 @Component 或类似的注释您的类。

@Autowired
Environment env;

还要确保您的 bean 对扫描可见,即在您的情况下它应该位于 com.production 包中。 应该像这样启用组件扫描

<context:component-scan base-package="com.production"/>

@ComponentScan(basePackages = "com.production" )

【讨论】:

以上是关于如何自动装配 Spring Environment 对象的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring JUnit:如何在自动装配组件中模拟自动装配组件

如何进行 Spring DAO 自动装配

如何让 Spring 使用多个上下文自动装配集成测试类?

如何测试自己具有自动装配依赖关系的 Spring 服务 bean?