2013-03-13 24 views
7

Tôi đang cố gắng lấy các thuộc tính từ tệp .properties trong một đối tượng của ứng dụng của tôi. Kiến thức duy nhất của tôi về cách thực hiện điều này là thông qua đối tượng Environment.Cách tự động lấy đối tượng Môi trường Mùa xuân

Nó hoạt động tuyệt vời trong cấu hình của tôi ...

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

Nhưng tôi cố gắng làm điều đó trong một lớp khác và nó là null. Tôi đã thử sử dụng @Resource@Autowired và tiêm thủ công.

Có điều gì đặc biệt về Environment đang ngăn điều này không?

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

Cập nhật: tôi thấy this resource trong đó nổi bật việc sử dụng @Value, nhưng tôi không sử dụng bất kỳ cấu hình XML trong ứng dụng của tôi.

Nó trông như thế này có thể là những gì tôi đang tìm kiếm: Loading properties in Spring 3.1 programmatically

+0

Tôi không nghĩ rằng một môi trường có liên quan trong bất cứ điều gì khác hơn là tải bối cảnh ứng dụng. –

+0

Có cách nào khác để tôi lấy các mục cấu hình từ các tệp .properties không? – Webnet

+1

Chú thích '@ Value' xuất hiện trong đầu bạn, nhưng bạn sẽ phải thiết lập' PropertyPlaceholderConfigurer'. Đừng báo cho tôi về điều này, nhưng hãy tra cứu nó đi. –

Trả lời

9

Bạn cần phải sử dụng @Value annotaion cho nó. Nhưng trước khi nó được yêu cầu khai báo <context:property-placeholder trong xml.

Xem here để biết chi tiết.

Ngoài ra, một cách khác:

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

Bạn có thể sử dụng lò xo @Autowired chú thích như dưới đây, nhưng chắc chắn rằng bạn chú thích lớp học của bạn với @Component hoặc tương tự những người thân.

@Autowired 
Environment env; 

Ngoài ra hãy chắc chắn đậu của bạn là rõ ràng cho chức năng quét, tức là nó sẽ vào được bên com.production gói trong trường hợp của bạn. quét phần nên được kích hoạt như thế này

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

hoặc

@ComponentScan(basePackages = {"com.production"}) 
Các vấn đề liên quan