Spring:使用从文件中读取的属性

时间:2016-08-01 14:33:55

标签: java spring

我是Spring框架的新手,我在尝试阅读和使用文件中的属性时遇到了一些问题。

总而言之,我想要做的是定义一个存储所有读取属性的类,一个使用这些属性做某事的类和一个使用结果的第三个类。

存储属性的类是:

@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文件,其中“Environment”bean定义了位置规则以查找属性文件。

现在,当我尝试获取“Ap​​plicationContext”对象时抛出异常,在“Utilizer”类中会发生什么:

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,并尝试使用指定的PropertyClass包添加@ComponentScan,但这些都不适用于我..

有人可以给我一些建议吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

我不明白为什么你需要将propertyName声明为整数。 如果您需要的只是从文件中获取属性,那么您可以定义PropertiesFactoryBean并将其自动装配到您喜欢的任何其他bean。

假设您有一个包含值的myValues.properties文件:

key1=value1
key2=value2 

定义Bean:

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