应用于运行过程中动态加载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 动态注册Bean的核心在于能够获取到`BeanFactory`的引用,通常我们使用的`ApplicationContext`接口并不直接提供Bean的注册功能,但是它的子接口`ConfigurableApplicationContext`...
Spring动态加载bean后调用实现方法解析 在 Spring 框架中,动态加载 bean 是一个非常实用的功能,特别是在我们需要在不改变原有程序结构的基础上添加新的 bean 的时候。通过使用 Spring 的 ...
在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...
在Spring框架中,动态加载配置文件是一项重要的功能,它使得开发者在开发过程中无需重启应用就能实时更新配置,极大地提高了开发效率。热部署方案是这一功能的具体应用,它允许我们在不中断服务的情况下,对应用程序...
Spring 简单容器中的 Bean 基本加载过程 Spring 框架是 Java 企业级应用程序的核心框架之一,它提供了一个 IOC(Inverse of Control,控制反转)容器,用于管理应用程序中的对象。Spring IOC 容器的核心是 ...
因此,在使用 DependsOn 注解时,需要了解 Spring 中 bean 的加载过程,以免出现错误。 其他实现方式 除了上述两种方式外,还有其他方式可以控制 2 个 bean 的初始化顺序。例如,可以使用 Spring 的 @Order 注解来...
本篇文章将深入探讨Spring动态加载Bean的概念、实现方式以及其在实际开发中的应用。 首先,理解Bean的生命周期是至关重要的。在Spring中,Bean的生命周期包括实例化、初始化、正常服务和销毁等阶段。通常,Spring...
在这个特定的"spring IOC反射装载bean"的主题中,我们将深入探讨Spring如何通过XML配置文件来加载和管理Bean,并利用Java的反射机制来实例化这些Bean。 首先,Spring容器通过读取XML配置文件来获取Bean的定义。这些...
在Spring框架中,Bean的加载顺序是理解Spring IoC(Inversion of Control,控制反转)容器工作原理的关键部分。这个过程涉及到Bean定义的解析、实例化、初始化等多个步骤。让我们详细探讨Spring Bean加载顺序的各个...
虽然通常这个注解用于Spring管理的Bean,但也可以在非Spring管理的类中使用,只要确保配置的加载和绑定过程正确执行。 为了读取YAML配置,你需要在Spring Boot应用的启动类或者其他适当的初始化点,注册`@...
一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...
Spring Bean 加载过程源码解析文档 Spring Bean 加载过程是 Spring 框架中...通过分析 SpringApplication 的源码,我们可以更好地理解 Spring Bean 加载过程的实现细节,并且能够更好地使用 Spring 框架开发应用程序。
Spring多种加载Bean方式解析 本篇文章主要介绍了Spring多种加载Bean方式解析,通过对Bean加载方式...通过对Spring加载Bean方式的了解,我们可以更好地理解Spring中的Bean加载机制,从而更好地使用Spring框架进行开发。
接下来,我们将通过一个简单的步骤来展示如何在Spring中创建Bean: 1. **定义Bean的类**: 首先,创建一个Java类,例如`MyService`,它代表一个Bean。这个类可能包含一些业务逻辑。 ```java public class ...
在传统的Spring应用中,我们可以通过在bean定义上添加`@Lazy`注解来实现单个bean的懒加载。例如: ```java @Lazy @Configuration public class DemoConfig { public DemoConfig() { log.warn(" > > > demoConfig ...
在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...
ApplicationContext 是 Spring 框架中的核心组件之一,负责加载和管理应用程序中的 Bean 对象。在 Web 应用程序中,ApplicationContext 的加载机制是非常重要的, Spring 提供了多种方式来加载 ApplicationContext。...