任何用于在注释方式中不使用Spring读取属性文件的API

时间:2016-09-22 17:38:54

标签: java spring reflection properties annotations

在我的应用程序中使用Spring。是否有任何API可以根据注释将属性文件加载到java pojo中。 我知道使用InputStream或Spring的PropertyPlaceHolder加载属性文件。 是否有任何API可用于填充我的pojo,如

@Value("{foo.somevar}")
private String someVariable;

我无法使用spring找到任何解决方案 WITHOUT

1 个答案:

答案 0 :(得分:3)

我想出了一个快速破解绑定属性的方法如下。

注意:它没有优化,没有错误处理。只是展示了一种可能性。

@Retention(RetentionPolicy.RUNTIME)
@interface Bind
{
    String value();
}

我已经测试了一些基本的参数并且正在工作。

class App
{
    @Bind("msg10")
    private String msg1;
    @Bind("msg11")
    private String msg2;

    //setters & getters
}

public class PropertyBinder 
{

    public static void main(String[] args) throws IOException, IllegalAccessException 
    {
        Properties props = new Properties();
        InputStream stream = PropertyBinder.class.getResourceAsStream("/app.properties");
        props.load(stream);
        System.out.println(props);
        App app = new App();
        bindProperties(props, app);

        System.out.println("Msg1="+app.getMsg1());
        System.out.println("Msg2="+app.getMsg2());

    }

    static void bindProperties(Properties props, Object object) throws IllegalAccessException 
    {
        for(Field field  : object.getClass().getDeclaredFields())
        {
            if (field.isAnnotationPresent(Bind.class))
            {
                Bind bind = field.getAnnotation(Bind.class);
                String value = bind.value();
                String propValue = props.getProperty(value);
                System.out.println(field.getName()+":"+value+":"+propValue);
                field.setAccessible(true);
                field.set(object, propValue);
            }
        }
    }
}

在根类路径中创建app.properties

msg10=message1
msg11=message2