应用于运行过程中动态加载bean,比如数据源的动态加载、定时任务的动态加载等。
spring3.0.5
DynamicBeanReader bean动态加载接口.
DynamicBeanReaderImpl bean动态加载实现类.
DynamicResource org.springframework.core.io.Resource的实现类.
DynamicBean 动态bean描述对象的抽象类.
DataSourceDynamicBean 继承自DynamicBean,一个数据源的简单bean配置描述对象.
spring配置
<bean id="dynamicBeanReader" class="org.youi.common.bean.DynamicBeanReaderImpl" init-method="init">
</bean>
动态加载bean接口
public interface DynamicBeanReader{
/**
* 动态加载bean
* @param dynamicBean
*/
public void loadBean(DynamicBean dynamicBean);
}
动态加载bean实现类
public class DynamicBeanReaderImpl implements DynamicBeanReader,ApplicationContextAware{
private static final Log logger = LogFactory.getLog(DynamicBeanReaderImpl.class);//日记
private ConfigurableApplicationContext applicationContext = null;
private XmlBeanDefinitionReader beanDefinitionReader;
/*初始化方法*/
public void init(){
beanDefinitionReader = new XmlBeanDefinitionReader((BeanDefinitionRegistry)
applicationContext.getBeanFactory());
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(applicationContext));
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = (ConfigurableApplicationContext)applicationContext;
}
public void loadBean(DynamicBean dynamicBean){
long startTime = System.currentTimeMillis();
String beanName = dynamicBean.getBeanName();
if(applicationContext.containsBean(beanName)){
logger.warn("bean【"+beanName+"】已经加载!");
return;
}
beanDefinitionReader.loadBeanDefinitions(new DynamicResource(dynamicBean));
logger.info("初始化bean【"+dynamicBean.getBeanName()+"】耗时"+(System.currentTimeMillis()-startTime)+"毫秒。");
}
}
public class DynamicResource implements Resource {
private DynamicBean dynamicBean;
public DynamicResource(DynamicBean dynamicBean){
this.dynamicBean = dynamicBean;
}
/* (non-Javadoc)
* @see org.springframework.core.io.InputStreamSource#getInputStream()
*/
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(dynamicBean.getXml().getBytes("UTF-8"));
}
//其他实现方法省略
}
/**
* 动态bean描述对象
*/
public abstract class DynamicBean {
protected String beanName;
public DynamicBean(String beanName) {
this.beanName = beanName;
}
public String getBeanName() {
return beanName;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
/**
* 获取bean 的xml描述
* @return
*/
protected abstract String getBeanXml();
/**
* 生成完整的xml字符串
* @return
*/
public String getXml(){
StringBuffer buf = new StringBuffer();
buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
.append("<beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")
.append(" xmlns:p=\"http://www.springframework.org/schema/p\" xmlns:aop=\"http://www.springframework.org/schema/aop\"")
.append(" xmlns:context=\"http://www.springframework.org/schema/context\" xmlns:jee=\"http://www.springframework.org/schema/jee\"")
.append(" xmlns:tx=\"http://www.springframework.org/schema/tx\"")
.append(" xsi:schemaLocation=\"")
.append(" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd")
.append(" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd")
.append(" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd")
.append(" http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd")
.append(" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd\">")
.append(getBeanXml())
.append("</beans>");
return buf.toString();
}
}
/**
* 数据源动态bean描述对象
*/
public class DataSourceDynamicBean extends DynamicBean {
private String driverClassName;
private String url;
private String username;
private String password;
public DataSourceDynamicBean(String beanName) {
super(beanName);
}
/* (non-Javadoc)
* @see org.youi.common.bean.DynamicBean#getBeanXml()
*/
@Override
protected String getBeanXml() {
StringBuffer xmlBuf = new StringBuffer();
xmlBuf.append("<bean id=\""+beanName+"\" class=\"org.apache.commons.dbcp.BasicDataSource\" destroy-method=\"close\"")
.append(" p:driverClassName=\""+driverClassName+"\" ")
.append(" p:url=\""+url+"\"")
.append(" p:username=\""+username+"\"")
.append(" p:password=\""+password+"\"/>");
return xmlBuf.toString();
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
/**
*junit测试类
*/
@ContextConfiguration(locations={"classpath:applicationContext-test.xml"})
public class DynamicBeanReaderTests extends AbstractJUnit4SpringContextTests{
@Autowired
private DynamicBeanReader dynamicBeanReader;
@Test
public void testLoadBean(){
DataSourceDynamicBean dataSourceDynamicBean = new DataSourceDynamicBean("dataSource1");
dataSourceDynamicBean.setDriverClassName("org.gjt.mm.mysql.Driver");
dataSourceDynamicBean.setUrl("jdbc:mysql://127.0.0.1:3306/youi2?useUnicode=true&characterEncoding=utf-8");
dataSourceDynamicBean.setUsername("youi2");
dataSourceDynamicBean.setPassword("youi2");
dynamicBeanReader.loadBean(dataSourceDynamicBean);//
DataSource s = (DataSource)applicationContext.getBean("dataSource1");
try {
PreparedStatement ps = s.getConnection().prepareStatement("select '数据库输出的数据' a from dual");
ps.execute();
ResultSet rs = ps.getResultSet();
while(rs.next()){
System.out.println(rs.getString("a"));
}
} catch (SQLException e) {
//TODO
}
}
}
执行测试的输出:
20110310 23:12:44 INFO DynamicBeanReaderImpl.loadBean(60) | 初始化bean【dataSource1】耗时78毫秒。
数据库输出的数据
分享到:
相关推荐
spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
主要介绍了Spring动态加载bean后调用实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Spring Bean 加载顺序 实验小例子
spring基于xml配置加载bean 的demo 了解spring的反射机制
该项目展示spring配置文件的那些bean的加载顺序
本篇将对定义在 XMl 文件中的 bean,从静态的的定义到变成可以使用的对象的过程,即 bean 的加载和获取的过程进行一个整体的了解
自定义注解加载Bean是Spring框架提供的一个扩展点。基于这个扩展点可以实现灵活加载Bean的功能。 例如 Dubbo框架通过这个扩展点将添加了自定义注解@org.apache.dubbo.config.annotation.Service和@org.apache.dubbo
1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以...这时候你需要通过一些手段来控制springboot中的bean加载顺序。
Spring加载Bean: AbstractBeanFactory.xmind
本篇文章主要介绍了Spring多种加载Bean方式解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(new String[] {“config1.xml”, config2.xml})传给ApplicationContext实现进行加载多个配置文件,...
同上文中提到我们需要手动在 bean 增加 @Lazy 注解,这就意味着我们仅能对程序中自行实现的 bean 进行添加。但是现在 spring boot 应用中引入了很多第三方 starter ,比如 druid-spring-boot-starter 数据源注入、...
Spring動態加載Bean的實現 初學Spring者
spring注解开发使用教程--Bean加载控制(二)案例代码
spring bean加载
主要给大家介绍了关于如何在Spring中使用编码方式动态配置Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本次为spring解析配置文件中spring.xml的过程,并且根据解析的spring.xml中的<bean>节点加载bean到map中。
springBean加载过程源码解析文档,附有代码类名和行数
本篇文章主要介绍了Spring中Bean的加载的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧