`
elicer
  • 浏览: 133630 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

动态加载 bean 到Spring Context

阅读更多
动态Bean的实现类

import java.io.IOException;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.xml.ResourceEntityResolver;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * 
 * This class used to dynamic loan bean to spring context during runtime
 * 
 *
 */
public class DynamicLoadBean implements ApplicationContextAware{

	private ConfigurableApplicationContext applicationContext = null;
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = (ConfigurableApplicationContext)applicationContext;
	}
	public ConfigurableApplicationContext getApplicationContext() {
		return applicationContext;
	}
	
	/**
	 * 向spring的beanFactory动态地装载bean
	 * @param configLocationString 要装载的bean所在的xml配置文件位置。
spring配置中的contextConfigLocation,同样支持诸如"/WEB-INF/ApplicationContext-*.xml"的写法。
	 */
	public void loadBean(String configLocationString){
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader((BeanDefinitionRegistry)getApplicationContext().getBeanFactory());
		beanDefinitionReader.setResourceLoader(getApplicationContext());
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(getApplicationContext()));
		try {
			String[] configLocations = new String[]{configLocationString};
			for(int i=0;i<configLocations.length;i++)
				beanDefinitionReader.loadBeanDefinitions(getApplicationContext().getResources(configLocations[i]));
		} catch (BeansException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}




测试类如下
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:data-access-config.xml");   
                DynamicLoadBean dynamicBeanLoad =(DynamicLoadBean)ctx.getBean("dynamicLoadBean");
        
        dynamicBeanLoad.loadBean("data-access-dynamicConfig.xml");
        MagazineService magezineService = (MagazineService)ctx.getBean("magazineService"); 



data-access-config.xml文件中包含原始的bean, data-access-dynamicConfig.xml文件中包含要动态加载的bean的配置文件。

不要忘了把DyanmicLoanBean 配置到原始的spring context 配置文件中也就时data-access-config.xml中


   <bean id="dynamicLoadBean" class="com.spring.dynamic.DynamicLoadBean">       
   </bean>


动态加载的bean的配置文件

   <bean id="magazineService" class="com.ibank.test.openjpa.dao.MagazineServiceImpl">  
      <property name="magazineDao" ref="magazineDao"/>  
   </bean> 


当然了动态加载的bean也可以reference 到原始的context中的bean.比如magazineDao就是在data-access-config.xml中配置的一个bean.
11
1
分享到:
评论
8 楼 OMG-SOCOOL 2016-04-14  
不用单独加载指定的文件
private static ConfigurableApplicationContext applicationContext;
public static Object getBeanByClass(final Class c) {
return applicationContext.getBean(c);
}

public static Object getBeanById(final String id) {
return applicationContext.getBean(id);}
7 楼 heilinshuguang 2013-12-12  

dear
    动态加载bean已经了解。我现在有这样一个需求:spring配置文件system-config.xml,里面配置了服务的配置信息,服务启动后,我又想修改system-config.xml,请问有没有办法在不重启服务的情况下再次加载system-config.xml
6 楼 Bactryki 2011-10-18  
学习了太谢谢了
5 楼 cofspring 2010-10-15  
我也在找这方面的,但是我想直接程序运行过程中,程序自己修改原始配置文件,比如增加一个bean,这样可否自动加载新增加的这个bean,而不是重新读取整个配置文件,有什么方法?
4 楼 ronry 2010-08-08  
需要在原定义文件中定义DynamicLoadBean,侵入性太强
3 楼 siberxu 2010-02-08  
是好文章正在找这方面的,
只是我的为什么会出现
No bean named 'dynamicLoadBean' is defined错误
2 楼 jelly 2010-01-09  
不错,正好需要!
1 楼 ldeng76 2009-09-08  
非常感谢,这个对我很好帮助 .
很奇怪,好文章竟然没人顶.

相关推荐

    利用Spring Context上下文创建自定义对象

    在Spring应用中,Context通常通过`ApplicationContext`接口来实例化,如`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`,这些类用于加载XML配置文件并初始化bean。 创建自定义对象的基本...

    spring-context-4.2.xsd.zip

    除了基础的配置,`spring-context-4.2.xsd`还支持对资源加载、国际化、消息源、任务调度、事件监听等高级特性。例如,`&lt;context:component-scan&gt;`元素可以自动扫描并注册带有特定注解的bean,极大地简化了代码配置。...

    spring-context源码

    `spring-context`包含了强大的Spring表达式语言(SpEL),它允许在运行时对bean和属性进行动态查询和修改。SpEL可以用在注解的值、bean的属性绑定以及`ExpressionEvaluator`的表达式解析等多个场景。 综上所述,`...

    Spring動態加載Bean

    在Spring框架中,动态加载Bean是一项重要的功能,它允许我们在运行时根据需要加载或卸载Bean,而不是在应用启动时一次性加载所有Bean。这对于处理不同环境、减少内存占用或者实现按需服务的情况非常有用。本篇文章将...

    spring bean XML配置入门

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

    spring-context-3.1.1.RELEASE.zip

    9. **Spring Expression Language (SpEL)**:Spring的表达式语言允许在运行时查询和操作对象图,常用于AOP、Bean装配和动态数据绑定。 10. **Profile功能**:Spring 3.1引入了Profile概念,可以根据不同的运行环境...

    Spring之动态注册bean的实现方法

    在 Spring 框架中,动态注册 Bean 是一个非常重要的功能,它允许开发者在应用程序运行时动态添加或删除 Bean,从而提高应用程序的灵活性和可维护性。下面我们将详细介绍 Spring 之动态注册 Bean 的实现方法。 动态...

    动态的装配bean,注入到Controller中

    在Spring框架中,动态装配bean并将其注入到Controller中是一种常见的需求,这允许我们根据运行时的条件或配置来创建和管理对象。本篇将详细解释两种实现方式:基于XML配置和使用`@PostConstruct`注解。 首先,让...

    spring依赖注入bean

    在 Java 应用中使用 Spring,我们需要创建一个 Spring 上下文(ApplicationContext)来加载 Bean 的定义。这个上下文将负责创建和管理 Bean,以及执行依赖注入。通常,我们可以使用 `ClassPathXmlApplicationContext...

    Spring多种加载Bean方式解析

    主要的流程是找到定义Bean的方式,然后生成BeanDefinition后注册到Spring上下文中,由Spring自动创建Bean的实例。 BeanDefinition BeanDefinition是一个接口,用来描述一个Bean实例,例如是SINGLETON还是PROTOTYPE...

    Spring在应用中获得Bean的方法

    只要在字段、setter方法或构造函数上添加`@Autowired`,Spring就会自动匹配并注入相应的Bean。 ```java public class MyClass { @Autowired private MyBean myBean; } ``` 4. **通过`@Resource`注解** `@...

    spring创建bean简单示例

    Spring提供了多种注解,如`@Component`、`@Service`、`@Repository`和`@Controller`,它们可以用来标记Bean类,自动注册到Spring容器。同时,使用`@Autowired`注解可以完成依赖注入。 ```java @Service public ...

    Test05_Spring_Context_XML.rar

    在Spring中,Context XML配置文件是初始化和管理应用程序上下文的关键,它定义了bean的创建、依赖关系以及服务的提供方式。本文将深入探讨Spring工程的初始化模块与基础配置,以及如何利用Maven构建这样的工程。 ...

    Spring定义bean的三种方式和自动注入

    在Spring框架中,管理Bean的方式主要有三种:XML...总之,Spring提供了多种方式来定义和管理Bean,从XML到注解再到Java配置,使得开发更加灵活高效。同时,自动注入功能大大简化了依赖关系的建立,降低了代码耦合度。

    spring-context-3.0.0.RELEASE.jar.zip

    1. **配置管理**:Spring Context通过XML、注解或Java配置类等方式加载配置信息,解析并管理Bean定义。 2. **依赖注入**:根据配置信息,Spring Context自动完成对象的实例化、初始化和装配,以及对象间的依赖关系。...

    spring-framework-4.2.5.core_beans_context_aop.zip

    Spring Context 还充当了一个全局的bean工厂,允许任何地方的bean获取到其他bean的引用,增强了组件间的交互。此外,它支持消息源和AOP方面的配置,使得应用程序能够更好地适应不同的运行环境。 4. **Spring AOP**...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    这里提到的是一组完整的Spring库,包括`spring-core`、`spring-context`、`spring-webmvc`、`spring-web`、`spring-beans`、`spring-test`、`spring-jdbc`、`spring-orm`、`spring-aop`和`spring-tx`,它们都是3.2.0...

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

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

    org.springframework.context_3.0.5.release.jar.zip

    依赖注入是Spring的核心特性,ApplicationContext通过读取配置文件中的bean定义,自动将依赖的bean注入到目标bean中,降低了代码的耦合度,提高了可测试性和可维护性。 五、AOP支持 ApplicationContext还支持AOP...

    Java中Spring获取bean方法小结

    - **通过代码注解**:Spring也支持通过注解来获取Bean,如`@Autowired`和`@Resource`,它们能够自动将依赖注入到目标字段或方法中,无需手动从ApplicationContext获取。 3. **静态Singleton Bean Manager** 通常...

Global site tag (gtag.js) - Google Analytics