当我想把配置文件include的功能加进步的时候,我打开了spring的参考手册,想大概看看spring是怎么做的。
但是我看到了spring中PropertyPlaceholderConfigurer的做法,对比了一下我的做法,发现我的很土啊,于是打算重写这个功能。
spring是用BeanFacoryPostProcessor来做的,就是在所有bean生成之前,要调一个回调方法。
问题是,这里实现了BeanFacoryPostProcessor接口的bean需要配置在配置文件中,像其他bean一样被创建,这样就遇到一个像
鸡先还是蛋先的问题。既然在所有bean生成之前,就要有这个BeanFacoryPostProcessor,但是BeanFacoryPostProcessor又是
一个bean。。。。。。。。。。
所以,我打算把BeanFacoryPostProcessor特殊化,也就是要从众多bean中找出BeanFacoryPostProcessor的定义。
本来我看了看spring的代码,以为要把BeanFacoryPostProcessor实例化才可以知道它是不是实现了这个接口,但是后来我发现
并不是这样的,只要有BeanFacoryPostProcessor的class就可以了。但是我的设计是读配置的时候只把String类型的className
保存,而没有保存class,看了看spring也是保存class的,看来我的设计有错误了,于是马上进行修改。
嗯,终于改好了。就是这个函数,在refresh()中加入
private void handleModuleFactoryPostProcessor() throws ModulesException, FactortInitialException, ConstructorException {
List<String> names=getPostProcessorNames(ModuleFactoryPostProcessor.class);
for(String name:names){
ModuleFactoryPostProcessor mfpp=(ModuleFactoryPostProcessor) getModule(name);
singletons.put(name, mfpp);
mfpp.postProcessModuleFactory(this);
for(ConfigurableApplicationContext context:kids){
mfpp.postProcessModuleFactory(context);
}
}
}
我原来实现PropertyPlaceholderConfigurer这个功能,写得很烂,哈哈,现在爽多了。
分享到:
相关推荐
总的来说,工厂Bean是Spring框架中的一个重要概念,它提供了对Bean创建过程的定制,使得我们可以处理那些需要特殊处理的对象。通过理解和熟练使用FactoryBean,可以极大地增强Spring应用程序的灵活性和可扩展性。
本章将详细分析Spring 5.2.9版本中Bean工厂的准备工作,特别是通过测试用例来理解其实现细节。 在Spring框架中,Bean工厂的初始化是一个关键过程,它涉及到许多内部机制的设置。首先,我们来看看`BeanFactory`接口...
实例化Spring Bean的工厂方法是实现定制化对象创建的一种方式,提供了比直接声明Bean更高的灵活性。开发者可以根据需求选择实例工厂方法或静态工厂方法,以满足特定的应用场景。在实际项目中,应根据实际情况权衡...
在Java Web开发中,使用JSP、Servlet和JavaBeans(Bean)是常见的技术组合,它们可以协同工作以实现动态网页的功能,如用户注册和登录。以下是这个过程的详细解释: 1. **数据库设计**: 在本例中,数据库选用...
虽然不是严格意义上的工厂模式,但Spring还提供了一种自定义Bean后处理的机制——`BeanPostProcessor`。开发者可以通过实现这个接口并在配置中注册,从而在Bean实例化之后、初始化之前或初始化之后进行定制操作。...
BeanMapper是一个实用工具,可以帮助我们高效地实现Bean到Bean的深度转换。本文将深入探讨BeanMapper的工作原理、如何使用它以及其背后的源码分析。 首先,BeanMapper的核心功能是将一个对象的属性值复制到另一个...
本文将围绕“JDK代理”、“CGI代理”以及它们与Spring后处理Bean的关系进行深入探讨。 首先,JDK代理,也称为接口代理,是Java内置的一种动态代理机制。通过实现`java.lang.reflect.InvocationHandler`接口并调用`...
- `InitializingBean`后处理:如果Bean实现了`InitializingBean`接口,Spring会调用`afterPropertiesSet()`方法。 5. **容器级回调**: 如果Bean定义了`@PostConstruct`注解的方法,Spring会在初始化后调用。这为...
Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...
在Spring框架中,Bean工厂就是一种实现单例模式的方式,它负责管理和维护Bean的生命周期。当从Bean工厂获取一个单例Bean时,如果该Bean已经存在,则直接返回,否则会首次创建并缓存。 而直接通过`new`关键字实例化...
`createBean(beanName, mbd, args)`在`AbstractAutowireCapableBeanFactory`中实现,它负责根据Bean定义创建Bean实例。 8. **实际创建Bean**: 在`doCreateBean()`方法中,Spring会创建Bean的实例,`...
在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...
### 一种面向对象的Java Bean查询方法的实现 #### 概述 在Java开发中,尤其是在涉及数据库操作的应用场景下,传统的做法是直接在Java Bean中编写SQL语句来完成数据的增删改查等操作。然而,这种方法存在一些明显的...
理解并掌握Singleton和Prototype Bean的作用域对于优化Spring应用性能、管理Bean的生命周期以及正确处理依赖关系至关重要。在设计系统时,需要根据对象的需求来选择合适的作用域,以达到最佳的性能和可维护性。在...
反射实现的bean转换类,配合类型转换器,告别所有bean转vo,bean转dto,dto转bean,vo转bean,什么构造器转换之类的,简直浪费程序员生命
前者用于MD5计算,后者用于处理找不到所需算法的情况。 ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; ``` 3. **创建`Md5Bean`类**: - 定义一个`Md5Bean`类,...
2. **运行**:容器启动后,它可以管理Bean的生命周期,处理Bean之间的依赖关系,响应来自应用程序的请求来获取Bean。 3. **关闭**:当应用程序关闭或者需要释放资源时,通过调用ApplicationContext的close()方法...
Spring IOC 04 配置通过静态工厂方法创建的bean、实例工厂创建的bean、FactoryBean (1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这...
每次客户端调用方法时,服务器都会从Bean池中选择一个可用的实例来处理请求。由于没有状态,多个客户端可以并发地调用同一个实例,提高了系统的性能和可伸缩性。 无状态会话Bean适用于那些不需要跟踪会话信息或业务...
07 源码分析-spring的bean工厂准备工作