spring 配置文件里变量改用数据库加载的问题。

spring 配置文件里变量改用数据库加载的问题。

问题描述:

大侠们,我最近做的一个 发送mail 的程序,spring里配置的参数信息是从properties文件里加载进来的。最近想改成从数据库里读取的方式。突然就没有思路了。哪个哥哥能给个思路指点一下我。不胜感激

[code="java"]













${mail.smtp.auth}

${mail.smtp.timeout}







[/code]

[quote]
从数据库读取出来了,放在一个bean类里.那下的spring注入属性的时候,我该如何
在value属性里填充bean属性呢?


[/quote]
这种情况基本上不能再使用spring注入了,因为你自己创建的bean并不由spring容器托管,所以后面也无法注入。
你可以采用类似propertyplaceholder的思想,在bean由容器创建之前把这些参数值设置进去。具体的做法,你可以通过扩展JavaMailSenderImpl并实现BeanPostProcessor接口:
[code="java"]
public class MyJavaMailSenderImpl extends JavaMailSenderImpl implements BeanPostProcessor {

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

}

public Object
postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

//在这里通过查询数据库,把相应的参数设置到mailsender里面
}
}
[/code]
不过这样做,就和spring容器耦合比较大。

这个不难吧,你可以定义个linstener, 什么的,只要在web应用启动的时候,从数据库读取出来,存到一个类的变量里面不就可以了

自己写一个BeanFactoryPostProcessor实现,跟PropertyPlaceholderConfigurer类似的功能

BeanFactoryPostProcessor实现该接口,然后只需要实现一个获取值得抽象方法就可以了,具体可以参考源码

如果按这样做,还需要定义property吗,直接把变量设置为静态的,现用现调多好

既然取都取到了,还在回归到配置文件,不需要吧。
直接调用mailSender类相应属性的set方法就可以了。

替换成

只要实现spring窗器加载时的接口,例如:ApplicationContextAware接口,然后写个方法打上标记@PostConstruct,自己定义一个类似MAP的变量,然后存放相关的mail所用的信息,在业务逻辑时使用就可以了。不需要通过配置文件读取了。。这个只是读取的方式不一样罢了。。

1、扩展PropertyPlaceholderConfigurer类、暂且把类名定为:ExtPropertyPlaceholderConfigurer
spring配置文件:
[code="java"]


classpath:conf/jdbc.properties


[/code]
2、修改properties配置文件
[code="java"]
sql=select * from table
[/code]
3、实现ExtPropertyPlaceholderConfigurer 类
[code="java"]
package mytest;

import java.util.Properties;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

public class ExtPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

@Override
protected String resolvePlaceholder(String placeholder, Properties props) {
    String sql = props.getProperty(placeholder);
    //根据SQL获取数据库中对应SQL的数据
    Object obj = find(sql);
    return obj.toString();
}

}
[/code]
5、在配置文件的引用
[code="java"][/code]