最近需要降低用户xml里配置bean的个数,因此希望能在不告知用户的情况下,新增我需要使用的bean,就是以前用户需要显示配置的bean,现在我悄悄注入了。注入的必须要在同一个spring容器了。
spring容器其实说白了最后就是一个类似map的结构来保存所有的实例化的bean,那这个容器怎么获得呢,看了下最常用的
ApplicationContextAware,这个里面只有简单的get方法不满足我的要求,然后再来看有个叫BeanFactoryPostProcessor的比较满足我的需求,我可以获得ListableBeanFactory的一个实例了。有了这个ListableBeanFactory我就可以来读取我的xml里的bean同时并注册上去了。
看下spring的源码里有个叫XmlBeanDefinitionReader ,他是负责来读取xml里的bean然后注册到某个BeanFactory的。之前犯了个错误直接使用 XmlBeanFactory来注册我的bean,最后发现因为这个XmlBeanFactory和用户所在的容器并不能很好整合,所以需要单独获得用户的容器然后再注册进我的bean。
好说了这么多还是上代码吧。很简单的,看来还是对spring不太了解导致之前走了弯路。
public class MyBeanPost implements BeanFactoryPostProcessor{
private ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
DefaultResourceLoader defaultResourceLoader = new DefaultResourceLoader();
Resource resource = defaultResourceLoader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX+"test-spring-config.xml");
XmlBeanDefinitionReader definitionReader = new XmlBeanDefinitionReader((BeanDefinitionRegistry)this.beanFactory);
definitionReader.loadBeanDefinitions(resource);
}
}
可以在用户的spring容器里 实例化MyBeanPost,然后你在用户的spring容器下可以神秘的使用在这个MyBeanPost里注入进去的bean,当然我的本意不是这个,*-*.
分享到:
相关推荐
- **依赖注入(Dependency Injection, DI)**:Spring的核心特性,它允许外部环境(如Spring容器)来管理对象的创建和依赖关系。DI通过反转控制权,使得组件之间松耦合,易于测试和维护。 - **Bean工厂(Bean ...
BeanFactoryPostProcessor接口是Spring框架提供的一个接口,用于扩展Spring容器的功能。该接口只有一个方法`postProcessBeanFactory`,该方法在容器加载完成之后被调用,可以用来改变容器中的配置或做一些初始化工作...
而在IOC模式下,这个责任被“反转”到一个外部容器,即Spring容器。容器负责创建对象,管理它们的生命周期,并根据需要将依赖关系注入到对象中。这样,代码只需声明其依赖,而无需知道依赖的具体实现或如何获取依赖...
这里的`exampleBean`依赖于`anotherBean`,Spring容器会根据XML配置自动装配这两个Bean。 **Maven构建** Maven是一个项目管理工具,它可以帮助开发人员管理项目的构建、报告和文档。在Spring项目中,Maven可以用来...
2. **依赖注入**:Spring容器会根据Bean之间的依赖关系来决定实例化顺序。如果一个Bean依赖于另一个Bean,那么被依赖的Bean会先被实例化。Spring使用“依赖倒置”的原则,使得控制权从对象内部转移到了外部的容器。 ...
这样,Spring容器就能加载并解析这个外部XML文件,进而管理其中定义的Bean。 了解了基本用法后,我们来探讨一下Spring读取外部文件的工作原理。Spring的`ApplicationContext`类是通过`DefaultResourceLoader`来加载...
例如,在配置文件中添加了一个bean标签,并指定了id和class属性,Spring容器就会根据这个配置信息来创建对象实例。 IOC容器还提供了依赖注入的功能,可以将对象之间的关系维护到容器中,例如,ScheduleController...
1. 配置解析:Spring首先读取配置文件(XML、Java配置类或注解),解析出Bean的定义信息,包括Bean的类型、初始化方法、依赖关系等。 2. Bean的实例化:当需要使用某个Bean时,IOC容器会根据Bean的定义创建实例。...
这里,`propertyConfigurerForAnalysis`是`PropertyPlaceholderConfigurer`的实例bean,其作用是将`dbQuery.properties`中的键值对作为环境变量注入到Spring容器中。`classpath:`前缀表示该文件位于类路径下,即项目...
在Spring框架中,这个外部容器就是ApplicationContext,它负责加载XML配置文件并管理其中定义的bean。 在Spring中,XML配置文件是定义bean及其依赖关系的主要方式。一个典型的XML配置文件可能包含以下元素: ```...
控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来,交由一个外部容器(如Spring框架)来处理。这样做的好处是可以提高代码的可测试性、灵活性和解耦。 XML是Spring框架中用来描述对象及其相互依赖...
在Spring框架中,Bean是被Spring管理的对象,它们可以通过XML配置、注解或者Java配置类来定义。Spring使用IoC容器来管理和实例化这些Bean。获取Bean主要有以下几种方式: 1. **通过Bean的ID**:使用`...
然后,你可以使用注解如@Controller、@Service、@Repository和@Service来标记你的类,这些注解将被Spring容器自动扫描并管理。 在Web层,可以使用Spring MVC框架,通过定义DispatcherServlet和Controller来处理HTTP...
以上是Spring中基于XML的Bean配置的基本知识点,通过这些配置,我们可以精细控制Spring容器如何管理和实例化Bean,以及它们之间的依赖关系。随着Spring的发展,Java配置和注解配置逐渐成为主流,它们提供了更简洁、...
通过对IoC(Inversion of Control,控制反转)的实现,Spring容器将对象的创建和组装工作从应用代码中分离出来,使得应用更易于测试和维护。本文将从实现的角度,通过对外部接口、内部实现、组成部分和执行过程四个...
它是所有Spring容器的基类,为其他容器提供了基本的服务和功能。 ##### 3.2 ApplicationContext介绍 `ApplicationContext`是在`BeanFactory`基础上的增强版本,除了继承了`BeanFactory`的所有功能之外,还提供了...
5. **Bean的生命周期**:Spring容器对Bean的生命周期进行管理,包括初始化、正常使用、销毁等阶段,开发者可以自定义生命周期回调方法以进行特定操作。 ### Spring AOP **面向切面编程(AOP)** 是Spring的另一个...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交给了Spring容器,从而让开发者从繁琐的依赖管理中解脱出来,更专注于业务逻辑的实现。在这个名为"spring_IOC实现...
- **读取配置元数据**:Spring容器通过XML、Java配置或者注解来获取关于bean的定义,这些定义包含了类路径、依赖关系、初始化方法等信息。 - **创建bean实例**:根据配置元数据,容器实例化bean,这可能包括单例或...