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]