Spring bean处理——回调函数
Spring中定义了三个可以用来对Spring bean或生成bean的BeanFactory进行处理的接口, InitializingBean、BeanPostProcessor和BeanFactoryPostProcessor。通过实现这三个接口我们就可以对Spring bean进行处理了。
InitializingBean接口
InitializingBean中定义了一个afterPropertiesSet()方法。当BeanFactory将我们的bean实例化并且设置好了对应的属性之后,如果我们的bean实现了InitializingBean接口,则会调用对应的afterPropertiesSet()方法。那么我们就可以在这个方法体里面对当前bean的属性进行更改等其它操作。
@Component("beanA") public class BeanA implements InitializingBean { /** * 回调函数,会在bean属性设置完成后调用 */ public void afterPropertiesSet() throws Exception { System.out.println("回调函数,会在bean属性设置完成后调用"); } }
BeanPostProcessor接口
BeanPostProcessor接口实现类可以在bean初始化前后对bean做一些处理。ApplicationContext可以自动检测到其中的bean是否已实现了BeanPostProcessor接口,如果已经实现了该接口它会自动把它当做一个BeanPostProcessor进行处理。然后在需要调用BeanPostProcessor时进行调用。BeanPostPorcessor中定义了两个方法,postProcessBeforeInitialization()和postProcessAfterInitialization()。
l postProcessBeforeInitialization(Object bean, String beanName)方法将在调用bean的初始化方法之前被调用。方法参数分别表示当前的bean对象和对应的bean名称。
l postProcessAfterInitialization(Object bean, String beanName)方法将在调用bean的初始化方法之后被调用。
BeanPostProcessor是针对于容器中的所有的bean的。一旦容器中定义有BeanPostProcessor,那么容器中的每一个bean在初始化前后都会调用BeanPostProcessor对应的方法。
@Component public class MyBeanPostProcessor implements BeanPostProcessor { /** * 任何bean对象在初始化方法回调之后都会调用BeanPostProcessor的 * postProcessAfterInitialization方法。我们可以在该方法体里面对返回的bean再做一层封装。 * 调用该方法前,我们传递进来的bean对象是已经填充好了属性值的。当我们把BeanPostProcessor作为 * 一个bean定义在ApplicationContext中时,ApplicationContext会自动检测到它并把它当做 * 一个BeanPostProcessor进行调用。 */ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(bean + "after initialization, beanName is " + beanName); return bean; } /** * 任何bean对象在初始化方法回调之前都会调用BeanPostProcessor的 * postProcessBeforeInitialization方法。调用该方法前,我们传递进来的 * bean对象是已经填充好了属性值的。 */ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(bean + "beforeInitialization, beanName is " + beanName); return bean; } }
BeanFactoryPostProcessor接口
BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理。BeanFactoryPostProcessor是针对于bean容器的,在调用它时,BeanFactory只加载了bean的定义,还没有对它们进行实例化,所以我们可以通过对BeanFactory的处理来达到影响之后实例化bean的效果。跟BeanPostProcessor一样,ApplicationContext也能自动检测和调用容器中的BeanFactoryPostProcessor。 @Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { /** * BeanFactoryPostProcessor的postProcessBeanFactory()方法会在当前BeanFactory初始化 * 以后,并且所有的bean定义都已经被加载,但是还没有对应的实例时被调用。所以我们可以在该方法体里面通过 * BeanFactory做一些操作。当我们把BeanFactoryPostProcessor作为一个bean定义在ApplicationContext中时, * ApplicationContext会自动检测到它并把它当做一个BeanFactoryPostProcessor进行调用。 */ public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("postProcessBeanFactory......"); } }
相关推荐
ApplicationContext负责Bean的生命周期,包括初始化、实例化、依赖注入、初始化回调、销毁等阶段。它可以使用 BeanPostProcessor 接口对Bean进行预处理和后处理,实现自定义逻辑。同时,它还支持定义初始化方法和...
Bean定义包含了许多属性,如Bean的类名、初始化方法、依赖关系、作用域、生命周期回调方法等。这些属性使得我们可以对Bean的行为进行精细化控制,实现高度的灵活性和可配置性。 首先,让我们来看Bean的类名。在...
1. 依赖注入的基本原理:如何通过构造函数、setter方法或接口回调实现依赖关系的解耦。 2. Bean的定义与管理:理解XML配置文件中的bean元素,以及如何通过注解来声明和管理bean。 3. AOP(面向切面编程)基础:...
Spring IoC容器在装配Bean时还可以应用生命周期回调,例如实现InitializingBean和DisposableBean接口,或者使用@PostConstruct和@PreDestroy注解,可以在Bean的生命周期的特定点执行代码。 除了上述提到的装配方式...
8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础...
4. **生命周期管理**:Spring提供预初始化、初始化、后初始化回调方法,以及销毁方法,允许我们自定义bean的生命周期。 **Spring Ioc的优势** 1. **松耦合**:bean之间的依赖关系由Spring容器管理,降低了bean之间...
在"MyIOC"中,我们可能需要实现类似的生命周期回调机制。 7. **AOP代理**:虽然不是IOC的基本部分,但Spring通常会结合AOP来提供声明式事务管理和其他横切关注点。如果"动手写"的实现考虑了AOP,那么会涉及到切面的...
8.3.1 使用模板和回调机制 8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础...
这种解耦使得代码更易于维护和扩展,因为对象不再需要直接创建依赖的对象实例,而是通过构造函数、setter方法或接口回调等方式接收它们。 在Spring中,DI主要有三种实现方式: 1. 构造器注入:通过构造函数传入...
- **回调接口集合及触发顺序**:列出了Spring支持的各种回调接口,以及它们在Bean生命周期中的调用顺序。 - **命名空间**:介绍了Spring提供的`<util/>`命名空间,用于简化常用类型的配置。 - **值得重视的若干DI...
"SpringFactory.java"可能提供了定制化生命周期的方法,如初始化回调(init-method)、销毁回调(destroy-method)等。 4. **Bean的作用域**:Spring支持单例(Singleton)、原型(Prototype)、请求(Request)、...
- 生命周期管理:包括初始化、正常使用和销毁三个阶段,Spring提供了回调方法、Scope(作用域)和生命周期接口等进行管理。 3. **04依赖注入.xmind** —— 依赖注入的详细操作 - XML配置注入:通过`<bean>`标签...
4. **Bean的生命周期管理**:Spring容器负责Bean的创建、初始化、销毁等生命周期过程,开发者可以通过实现特定接口或使用回调方法自定义生命周期行为。 **使用示例:** ```java @Configuration public class ...
同时,`Bean`类可能还包含了一些方法,如`init()`和`destroy()`,用来模拟Spring中的初始化回调和销毁回调,以便在容器管理Bean生命周期时执行特定的逻辑。 `Property.java`文件可能与属性注入有关,这是依赖注入的...
如果非空,则调用`MemberManager.getMemberForName()`方法,传入用户名,并指定回调函数`showResult`。 - **服务器端逻辑** - 服务器端的方法(例如`getMemberForName`)会检查数据库中是否已有相同的用户名。 - ...
此外,Groovy支持闭包,这是一种强大的功能,可以用于函数式编程和回调处理,简化了多层嵌套的回调函数。 其次,Groovy与Java的无缝集成是其一大优点。Groovy编译成字节码后,可以直接运行在Java虚拟机上,可以调用...
DI允许我们将对象的依赖关系通过构造函数、setter方法或者接口回调等方式注入,使得代码更易于测试和维护。在"MySpringDemo"中,我们可以看到如何定义Bean并进行注入,例如: ```xml <bean id="exampleBean" class=...
DWR支持异步调用,用户可以指定一个JavaScript回调函数来处理服务器返回的结果。这种方式增强了用户体验,因为用户界面不会因等待服务器响应而冻结。 5. **缓存机制**: DWR有内置的缓存机制,可以缓存服务器端的...
3. **proxool-listenerCfg.jar**:这个jar包可能包含了Proxool的监听器配置,监听器允许用户定义一些回调函数,当数据库连接池中的事件(如连接创建、关闭、超时等)发生时,这些函数会被调用,从而实现对连接池的...