15

我正在尝试从我的应用程序对象中的 .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;
    }
}

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

看起来这可能是我正在寻找的内容:Loading properties in Spring 3.1 programmatically

4

2 回答 2

13

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

有关详细信息,请参见此处

另外,另一种方式:

@Inject
ApplicationContext context;
......
Enviroment env = context.getEnvironment();
于 2013-03-13T15:02:42.990 回答
13

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

@Autowired
Environment env;

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

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

或者

@ComponentScan(basePackages = {"com.production"} )
于 2017-02-14T11:29:27.780 回答