`
234390216
  • 浏览: 10233045 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462625
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775522
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398366
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395023
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679989
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530893
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183954
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467934
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151398
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68154
社区版块
存档分类
最新评论

Spring bean处理——回调函数

阅读更多

Spring bean处理——回调函数

 

     Spring中定义了三个可以用来对Spring bean或生成beanBeanFactory进行处理的接口, InitializingBeanBeanPostProcessorBeanFactoryPostProcessor。通过实现这三个接口我们就可以对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......");
   }
 
}

 

 

 

分享到:
评论

相关推荐

    三、Spring源码分析——ApplicationContext

    ApplicationContext负责Bean的生命周期,包括初始化、实例化、依赖注入、初始化回调、销毁等阶段。它可以使用 BeanPostProcessor 接口对Bean进行预处理和后处理,实现自定义逻辑。同时,它还支持定义初始化方法和...

    【框架源码篇 04】Spring源码手写篇-Bean定义配置化

    Bean定义包含了许多属性,如Bean的类名、初始化方法、依赖关系、作用域、生命周期回调方法等。这些属性使得我们可以对Bean的行为进行精细化控制,实现高度的灵活性和可配置性。 首先,让我们来看Bean的类名。在...

    精通Spring--Java轻量级架构开发实践.pdf

    1. 依赖注入的基本原理:如何通过构造函数、setter方法或接口回调实现依赖关系的解耦。 2. Bean的定义与管理:理解XML配置文件中的bean元素,以及如何通过注解来声明和管理bean。 3. AOP(面向切面编程)基础:...

    第四章 在Ioc容器中装配Bean

    Spring IoC容器在装配Bean时还可以应用生命周期回调,例如实现InitializingBean和DisposableBean接口,或者使用@PostConstruct和@PreDestroy注解,可以在Bean的生命周期的特定点执行代码。 除了上述提到的装配方式...

    Spring.3.x企业应用开发实战(完整版).part2

    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 数据库事务基础...

    Spring3.1.3 Ioc在Web容器中的建立

    4. **生命周期管理**:Spring提供预初始化、初始化、后初始化回调方法,以及销毁方法,允许我们自定义bean的生命周期。 **Spring Ioc的优势** 1. **松耦合**:bean之间的依赖关系由Spring容器管理,降低了bean之间...

    动手写框架,模拟简易的SpringIOC.rar

    在"MyIOC"中,我们可能需要实现类似的生命周期回调机制。 7. **AOP代理**:虽然不是IOC的基本部分,但Spring通常会结合AOP来提供声明式事务管理和其他横切关注点。如果"动手写"的实现考虑了AOP,那么会涉及到切面的...

    Spring3.x企业应用开发实战(完整版) part1

    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 数据库事务基础...

    Spring Reference Documentation(page 27)

    这种解耦使得代码更易于维护和扩展,因为对象不再需要直接创建依赖的对象实例,而是通过构造函数、setter方法或接口回调等方式接收它们。 在Spring中,DI主要有三种实现方式: 1. 构造器注入:通过构造函数传入...

    Spring3_权威开发指南

    - **回调接口集合及触发顺序**:列出了Spring支持的各种回调接口,以及它们在Bean生命周期中的调用顺序。 - **命名空间**:介绍了Spring提供的`<util/>`命名空间,用于简化常用类型的配置。 - **值得重视的若干DI...

    SpringFactory.java

    "SpringFactory.java"可能提供了定制化生命周期的方法,如初始化回调(init-method)、销毁回调(destroy-method)等。 4. **Bean的作用域**:Spring支持单例(Singleton)、原型(Prototype)、请求(Request)、...

    自学b站黑马ssm框架思维导图XMind笔记

    - 生命周期管理:包括初始化、正常使用和销毁三个阶段,Spring提供了回调方法、Scope(作用域)和生命周期接口等进行管理。 3. **04依赖注入.xmind** —— 依赖注入的详细操作 - XML配置注入:通过`<bean>`标签...

    J2EE企业级项目开发-3期(KC007) 7.2 精解Spring之IoC原理与具体使用文档.docx

    4. **Bean的生命周期管理**:Spring容器负责Bean的创建、初始化、销毁等生命周期过程,开发者可以通过实现特定接口或使用回调方法自定义生命周期行为。 **使用示例:** ```java @Configuration public class ...

    用java写的一个简单的ioc实现,初学的朋友可以看看

    同时,`Bean`类可能还包含了一些方法,如`init()`和`destroy()`,用来模拟Spring中的初始化回调和销毁回调,以便在容器管理Bean生命周期时执行特定的逻辑。 `Property.java`文件可能与属性注入有关,这是依赖注入的...

    dwr笔记二之经典用法之和spring结合+验证用户是否存在

    如果非空,则调用`MemberManager.getMemberForName()`方法,传入用户名,并指定回调函数`showResult`。 - **服务器端逻辑** - 服务器端的方法(例如`getMemberForName`)会检查数据库中是否已有相同的用户名。 - ...

    groovy学习

    此外,Groovy支持闭包,这是一种强大的功能,可以用于函数式编程和回调处理,简化了多层嵌套的回调函数。 其次,Groovy与Java的无缝集成是其一大优点。Groovy编译成字节码后,可以直接运行在Java虚拟机上,可以调用...

    MySpringDemo.rar

    DI允许我们将对象的依赖关系通过构造函数、setter方法或者接口回调等方式注入,使得代码更易于测试和维护。在"MySpringDemo"中,我们可以看到如何定义Bean并进行注入,例如: ```xml <bean id="exampleBean" class=...

    dwr的几个小例子,dwr的几个小例子

    DWR支持异步调用,用户可以指定一个JavaScript回调函数来处理服务器返回的结果。这种方式增强了用户体验,因为用户界面不会因等待服务器响应而冻结。 5. **缓存机制**: DWR有内置的缓存机制,可以缓存服务器端的...

    proxool相关jar包

    3. **proxool-listenerCfg.jar**:这个jar包可能包含了Proxool的监听器配置,监听器允许用户定义一些回调函数,当数据库连接池中的事件(如连接创建、关闭、超时等)发生时,这些函数会被调用,从而实现对连接池的...

Global site tag (gtag.js) - Google Analytics