`
zhyi_12
  • 浏览: 99862 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

spring中动态加载bean的简单实现

    博客分类:
  • java
阅读更多
  • 场景

应用于运行过程中动态加载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&amp;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毫秒。

数据库输出的数据

 

0
9
分享到:
评论
5 楼 Freeman19211105 2016-08-11  
楼主,下次 尽可能分享的时候把包贴出来,要不很容易倒错包的
4 楼 zy463395598 2015-10-16  
您好,请问可以给个动态加载定时任务的例子吗?
我这边按照您的方法,有两个问题
1、可以把bean动态装配进去,但是不能自动执行,即便在xml里面协商init-method也不执行,但是bean确实是已经装配进spring,可以通过getBean获取到。
2、按这种方式装载,装载bean的时候不能注入其他bean,那么在做动态装载定时任务的时候怎么样把Scheduler注入到执行bean里面去?
如果可以到话麻烦回复我下,mail:87565929@qq.com
谢谢!
3 楼 ciwan 2015-07-16  
楼主,能吧DynamicResource的贴全吗
2 楼 hustlxjaw 2011-04-25  
有个工具叫jRebel,可以热加载,对spring支持的也挺好
1 楼 yheye 2011-04-09  
LZ,请问怎么把jar包动态加入进去呢?

相关推荐

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    Spring bean 动态注册,jar包热替换

    Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...

    spring运行过程中动态注册bean

    ### Spring运行过程中动态注册Bean 动态注册Bean的核心在于能够获取到`BeanFactory`的引用,通常我们使用的`ApplicationContext`接口并不直接提供Bean的注册功能,但是它的子接口`ConfigurableApplicationContext`...

    Spring动态加载bean后调用实现方法解析

    Spring动态加载bean后调用实现方法解析 在 Spring 框架中,动态加载 bean 是一个非常实用的功能,特别是在我们需要在不改变原有程序结构的基础上添加新的 bean 的时候。通过使用 Spring 的 ...

    spring的bean加载顺序样例项目

    在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...

    Spring动态加载配置文件

    在Spring框架中,动态加载配置文件是一项重要的功能,它使得开发者在开发过程中无需重启应用就能实时更新配置,极大地提高了开发效率。热部署方案是这一功能的具体应用,它允许我们在不中断服务的情况下,对应用程序...

    详解Spring简单容器中的Bean基本加载过程

    Spring 简单容器中的 Bean 基本加载过程 Spring 框架是 Java 企业级应用程序的核心框架之一,它提供了一个 IOC(Inverse of Control,控制反转)容器,用于管理应用程序中的对象。Spring IOC 容器的核心是 ...

    详解Spring 中如何控制2个bean中的初始化顺序

    因此,在使用 DependsOn 注解时,需要了解 Spring 中 bean 的加载过程,以免出现错误。 其他实现方式 除了上述两种方式外,还有其他方式可以控制 2 个 bean 的初始化顺序。例如,可以使用 Spring 的 @Order 注解来...

    Spring動態加載Bean

    本篇文章将深入探讨Spring动态加载Bean的概念、实现方式以及其在实际开发中的应用。 首先,理解Bean的生命周期是至关重要的。在Spring中,Bean的生命周期包括实例化、初始化、正常服务和销毁等阶段。通常,Spring...

    spring IOC反射装载bean

    在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...

    Spring Bean 加载顺序 .

    在Spring框架中,Bean的加载顺序是理解Spring IoC(Inversion of Control,控制反转)容器工作原理的关键部分。这个过程涉及到Bean定义的解析、实例化、初始化等多个步骤。让我们详细探讨Spring Bean加载顺序的各个...

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    虽然通常这个注解用于Spring管理的Bean,但也可以在非Spring管理的类中使用,只要确保配置的加载和绑定过程正确执行。 为了读取YAML配置,你需要在Spring Boot应用的启动类或者其他适当的初始化点,注册`@...

    spring bean XML配置入门

    一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...

    springBean加载过程源码解析文档,附有代码类名和行数

    Spring Bean 加载过程源码解析文档 Spring Bean 加载过程是 Spring 框架中...通过分析 SpringApplication 的源码,我们可以更好地理解 Spring Bean 加载过程的实现细节,并且能够更好地使用 Spring 框架开发应用程序。

    Spring多种加载Bean方式解析

    Spring多种加载Bean方式解析 本篇文章主要介绍了Spring多种加载Bean方式解析,通过对Bean加载方式...通过对Spring加载Bean方式的了解,我们可以更好地理解Spring中的Bean加载机制,从而更好地使用Spring框架进行开发。

    spring创建bean简单示例

    接下来,我们将通过一个简单的步骤来展示如何在Spring中创建Bean: 1. **定义Bean的类**: 首先,创建一个Java类,例如`MyService`,它代表一个Bean。这个类可能包含一些业务逻辑。 ```java public class ...

    Spring Boot 全局懒加载机制.docx

    在传统的Spring应用中,我们可以通过在bean定义上添加`@Lazy`注解来实现单个bean的懒加载。例如: ```java @Lazy @Configuration public class DemoConfig { public DemoConfig() { log.warn(" &gt; &gt; &gt; demoConfig ...

    Spring Bean创建初始化流程.docx

    在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...

    Spring中ApplicationContext加载机制

    ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供了多种方式来加载 ApplicationContext。...

Global site tag (gtag.js) - Google Analytics