2016-08-01 79 views
0

我是新來的春天框架,我有一些問題,試圖讀取和使用文件的屬性。總結一下,我想要做的是定義一個類,它存儲所有讀取的屬性,第二個類使用這些屬性來執行某些操作,第三個類使用結果。春天:使用從文件讀取的屬性

存儲屬性的類是:

@Configuration 
public class PropertyClass { 
    @Value("${propertyName") 
    private Integer propertyName; 

    @Bean(name = "propertyName") 
    public Integer getPropertyName() { 
     return propertyName; 
    } 
} 

讀取和使用這些屬性的類:

@Component 
public class PropertyReader { 
    private Integer myProperty; 

    @Autowire 
    @Qualifier("propertyName") 
    public void setMyProperty(
     Integer myProperty) { 
     this.myProperty = myProperty; 
    } 

    public Integer getValue() { 
     //do something with myProperty 
     return result; 
    } 
} 

和使用PropertyReader類:

public class Utilizer { 
    private PropertyReader getPropertyReader() { 
     ApplicationContext context = new AnnotationConfigApplicationContext(PropertyReader.class); 
     PropertyReader reader = (BakerStorageClassConfigHelper)context.getBean("PropertyReader"); 
     return reader; 
    } 
} 

我已將類註冊爲application-config.xml文件中的bean:

<bean class="property.class.package.PropertyClass" depends-on="Environment" /> 
<bean class="reader.class.package.PropertyReader" /> 

而且我有一個environment.xml文件,其中的「環境」bean用位置規則定義以查找屬性文件。

現在發生了什麼,在類「熱利用」當我試圖讓「ApplicationContext的」對象拋出一個異常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'PropertyReader': 
Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire method: public void reader.class.package.PropertyReader.setMyProperty(java.lang.Integer); 
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.Integer] 
found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

我試圖改變PropertyReader類的註釋@Repository或@Service,並試圖添加一個@ComponentScan與指定的PropertyClass包,但沒有爲我工作..

有人可以給我一些建議嗎?
謝謝!

+0

在應該注入的setMyProperty方法中有一個myProperty參數,但事實上它沒有在任何地方指定,是嗎?也許你可以嘗試在PropertyReader bean聲明中設置這個屬性值。 –

+0

謝謝你的建議格林......我可以問你如何做到這一點? – giocarmine

+0

嘗試用以下代替PropertyReader bean聲明:

回答

1

我不明白爲什麼你需要聲明propertyName爲整數。 如果您需要的只是從文件中獲取屬性,那麼您可以定義一個PropertiesFactoryBean並將其自動裝載到您喜歡的任何其他bean。

假設你有一個包含值的myValues.properties文件:

key1=value1 
key2=value2 

定義豆:

@Bean(name = "myProperties") 
public PropertiesFactoryBean detailQueriesFactoryBean() 
{ 
    PropertiesFactoryBean pfb = new PropertiesFactoryBean(); 
    pfb.setLocation(new ClassPathResource("com/xxx/myValues.properties")); 
    return pfb; 
} 

現在,無論你需要它,這樣做:

@Autowired 
@Qualifier("myProperties") 
private Properties myValuesContainer; 

public void myMethod(){ 
    //this will get you "value1" 
    String value1 = myValuesContainer.getProperty("key1"); 
} 

希望這爲你工作。

---------------------爲你的情況----------------

如果它已經在應用程序上下文中,您可以使用@Value直接在您的PropertyReader中注入值併爲它們添加getter/setter。不需要PropertyClass,對吧?

或者您可以將@PostConstruct方法添加到PropertyReader。在該方法內部,您可以從現有上下文中檢索所需的值。

@PostContstruct 
public void extractValues(){ 
    //retrieve value from context and assign to whichever var. 
} 
+0

謝謝Leon,事實是,屬性文件已經在應用程序的不同位置使用,並且他們被加載在environment.xml文件中設置位置。 我需要讀取這些屬性的一個子集我定義了「PropertyClass」,並且我希望與其他應用程序的工作保持一致。 – giocarmine

+0

我更新了您的案例的答案。但是我注意到代碼中有一件事: ApplicationContext context = new AnnotationConfigApplicationContext(PropertyReader。類); 這看起來不正確。如果您需要一個新的appContext,您通常會將一個'@Configuration'類傳遞給AnnotationConfigApplicationContext構造函數。 –