`

spring-扩展点-BeanPostProcessor

阅读更多
理解spring中一个bean的初始化过程非常重要,很多基础功能的扩展,就是在bean初始化的某一步进行的。

BeanPostProcessor:功能的定位是:
1、实例化bean前,实例化,实例化后的钩子(new)
2、初始化bean前,执行设置方法,初始化bean后的钩子(init-method,destory-method,setMethod)





下面做个case:
public interface IUserService {
  public String getUsername ();
  public String getPassword();
}


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class UserServiceImpl implements IUserService,
     BeanFactoryAware,
     InitializingBean,
     DisposableBean{
	private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

	public UserServiceImpl(){
		logger.info("UserServiceImpl 构造函数 ");
	}
	
	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}

	public void setUsername(String username) {
		logger.info("UserServiceImpl setUsername {}",username);
		this.username = username;
	}

	public void setPassword(String password) {
		logger.info("UserServiceImpl setPassword {}",password);
		this.password = password;
	}

	@Override
	public String toString() {
		return "UserServiceImpl [username=" + username + ", password="
				+ password + "]";
	}

	
	public void initMethod(){
		logger.info("UserServiceImpl initMethod");
	}
	
	public void destroy(){
		logger.info("UserServiceImpl destroy");
	}
	
	public void destroyMethod(){
		logger.info("UserServiceImpl destroyMethod");
	}

	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		logger.info("setBeanFactory {} {}", beanFactory);
	}

	public void afterPropertiesSet() throws Exception {
		logger.info("UserServiceImpl afterPropertiesSet");
	}
	
}


public class MyInstantiationTracingBeanPostProcessor implements	
InstantiationAwareBeanPostProcessor{
	private static final Logger logger = LoggerFactory.getLogger(MyInstantiationTracingBeanPostProcessor.class);

	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		logger.info("postProcessBeforeInitialization 初始化 {} {}", bean, beanName);
		return bean;
	}

	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		logger.info("postProcessAfterInitialization 初始化 {} {}", bean, beanName);
		return bean;
	}

	public Object postProcessBeforeInstantiation(Class<?> beanClass,
			String beanName) throws BeansException {
		logger.info("postProcessBeforeInstantiation 实例化 {} {}", beanClass,beanName);
		return null;
	}

	/**
	 * 实例化
	 */
	public boolean postProcessAfterInstantiation(Object bean, String beanName)
			throws BeansException {
		logger.info("postProcessAfterInstantiation 实例化 {} {}", bean, beanName);
		return true;
	}

	public PropertyValues postProcessPropertyValues(PropertyValues pvs,
			PropertyDescriptor[] pds, Object bean, String beanName)
			throws BeansException {
		logger.info("postProcessPropertyValues 改变   PropertyValues {} {}", pvs,bean);
		return pvs;
	}

}


测试例子:
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class TestXmlBeanFactory {
	public static void main(String[] args) {
		ConfigurableListableBeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring/applicationContext.xml"));
        factory.addBeanPostProcessor(new MyInstantiationTracingBeanPostProcessor());
        IUserService userService = factory.getBean(IUserService.class);
		String password = userService.getPassword();
		factory.destroyBean("user", userService);
		
		System.out.println(password);
	}

}

或者

public class TestApplicationContext {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"classpath:spring/applicationContext.xml");
		IUserService userService = applicationContext.getBean(IUserService.class);
		String password = userService.getPassword();
		applicationContext.destroy();
		System.out.println(password);
	}

}


输出:

c.g.MyInstantiationTracingBeanPostProcessor- postProcessBeforeInstantiation 实例化 class com.gym.UserServiceImpl user
com.gym.UserServiceImpl- UserServiceImpl 构造函数
c.g.MyInstantiationTracingBeanPostProcessor- postProcessAfterInstantiation 实例化 UserServiceImpl [username=null, password=null] user
c.g.MyInstantiationTracingBeanPostProcessor- postProcessPropertyValues 改变   PropertyValues PropertyValues: length=2; bean property 'username'; bean property 'password' UserServiceImpl [username=null, password=null]
com.gym.UserServiceImpl- UserServiceImpl setUsername xinchun.wang
com.gym.UserServiceImpl- UserServiceImpl setPassword 123456
com.gym.UserServiceImpl- setBeanFactory org.springframework.beans.factory.xml.XmlBeanFactory@3a51127a: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,user,processor]; root of factory hierarchy {}
c.g.MyInstantiationTracingBeanPostProcessor- postProcessBeforeInitialization 初始化 UserServiceImpl [username=xinchun.wang, password=123456] user
com.gym.UserServiceImpl- UserServiceImpl afterPropertiesSet
com.gym.UserServiceImpl- UserServiceImpl initMethod
c.g.MyInstantiationTracingBeanPostProcessor- postProcessAfterInitialization 初始化 UserServiceImpl [username=xinchun.wang, password=123456] user
com.gym.UserServiceImpl- UserServiceImpl destroy
com.gym.UserServiceImpl- UserServiceImpl destroyMethod
  • 大小: 45.4 KB
1
1
分享到:
评论

相关推荐

    官方原版源码 spring-5.2.8.RELEASE.zip

    Beans模块提供了Bean工厂,它是Spring管理对象的中心,而Context模块扩展了Bean工厂,提供了一种上下文模型,可以加载其他容器和资源。 2. **Data Access/Integration**(数据访问/集成):该模块涵盖了JDBC、ORM、...

    spring-framework-3.2.13.RELEASE 源码

    最后,Spring的容器提供了多种扩展点,如BeanPostProcessor、BeanFactoryPostProcessor等,这使得开发者可以在容器初始化阶段自定义逻辑。在3.2.13.RELEASE中,我们可以探索这些扩展点的实现,以及如何利用它们增强...

    spring-framework-4.3.6 API

    1. 容器扩展:Spring 提供了 BeanPostProcessor 和 BeanFactoryPostProcessor 接口,允许用户自定义扩展点,实现更精细的控制。 2. Annotation-based Configuration:除了 XML 配置外,4.3.6 版本更加强调注解驱动的...

    spring-framework-2.5.6

    4. **IoC容器扩展点**:如BeanPostProcessor,了解如何扩展Spring以满足特定需求。 三、文档详解 Spring 2.5.6的官方文档是开发者的重要参考资料,它详细介绍了框架的各个组件和使用方法。通过阅读文档,可以掌握...

    spring-framework-4-reference

    容器扩展点提供了自定义容器行为的能力,通过实现特定的接口或继承特定的类即可达到目的。比如,可以通过实现BeanPostProcessor来在bean的初始化前后执行自定义逻辑。 classpath扫描和托管组件功能允许通过简单的...

    spring-beans

    此外,Spring提供了多种扩展点,如 BeanPostProcessor 和 InstantiationAwareBeanPostProcessor,允许自定义处理Bean的创建和初始化过程。 在Spring框架中,"spring-beans"模块是所有其他模块的基石,它提供的IoC...

    spring-framework-2.5.4源码.rar

    3. **AOP**:Spring的AOP模块支持面向切面编程,使得我们可以编写横切关注点,如日志、事务管理等。`org.springframework.aop`包包含了AOP的相关实现,如`AspectJ`的集成,`Pointcut`定义切点,`Advisor`定义通知,...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. RequiredAnnotationBeanPostProcessor示例 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7....

    spring-beans-3.0.2.RELEASE.jar.zip

    SpringBeans-3.0.2.RELEASE.jar还包含了一些关键接口,如BeanPostProcessor允许自定义Bean实例化后的处理逻辑,InitializingBean和DisposableBean分别用于标识初始化和销毁方法。同时,该版本的Spring支持AOP(面向...

    spring-custom-master.7z

    这需要我们掌握AspectJ的元数据解析和Spring的`BeanDefinition`,以及`BeanPostProcessor`和`InstantiationAwareBeanPostProcessor`接口,这些都是Spring处理注解的核心组件。 其次,项目中可能涉及自定义注解的...

    Java自定义注解与spring BeanPostProcessor详解

    Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...

    spring-framework-main.zip 源码

    《Spring框架核心源码解析》 Spring框架是Java开发...同时,了解源码也有助于我们更好地利用Spring的扩展点,定制化自己的解决方案。总之,掌握Spring源码对于任何希望成为资深Java开发者的程序员来说都是必经之路。

    spring扩展点测试示例代码

    这个压缩包提供的"spring扩展点测试示例代码"是一个实例,帮助我们理解如何在实践中利用Spring的扩展点进行自定义功能的实现。 首先,Spring的核心设计理念之一就是“依赖注入”(Dependency Injection,DI),它...

    spring-reference1.2.pdf

    根据提供的文档信息,我们可以深入探讨Spring框架的核心概念与特性,特别是版本1.2中的关键知识点。下面将基于文档中提到的各个章节进行详细解析。 ### 1. 引言 #### 1.1 概览 Spring框架是一个开源的Java平台,它...

    spring-reference.pdf

    综上所述,Spring框架通过其强大的依赖注入机制和丰富的扩展点,为Java开发者提供了一个灵活、高效、可扩展的开发平台。无论是构建简单的Web应用还是复杂的企业级系统,Spring都能提供强有力的支持。

    Spring-Context:Spring上下文上下文

    通过以上知识点,我们可以看出Spring-Context在Spring框架中的重要地位,它不仅实现了Bean的管理,还提供了丰富的扩展性和灵活性,使得开发者能够构建复杂的企业级应用。了解并掌握Spring-Context的这些核心概念,...

    spring框架3.0.0---api

    其次,Spring 3.0.0对AOP(面向切面编程)进行了扩展,提供了更多的切面编程模型。AOP允许开发者将关注点分离,如日志记录、事务管理等,可以编写一次,然后在整个应用程序中统一应用。Spring的`@Aspect`注解定义了...

    spring ioc

    5. `InstantiationAwareBeanPostProcessor`:进一步扩展了 `BeanPostProcessor`,可以在 Bean 实例化之前和之后进行操作。 通过阅读 Spring 源码,我们可以更好地理解其内部机制,从而优化代码、调试问题,甚至开发...

    spring-reference

    Spring提供了BeanPostProcessor、InitializingBean、DisposableBean等生命周期接口,允许开发者在Bean初始化前后执行自定义的操作。 #### 5.2 更多的定制选项 Spring还提供了许多其他的定制选项,如环境感知、条件...

    bp-support-spring-context:支持使用Spring Context

    回到"bp-support-spring-context"项目,它可能是为Spring Context提供了一些扩展或增强功能,例如新的bean定义方式、额外的生命周期策略,或者更方便的集成方式。由于没有具体的代码细节,我们只能推测它可能包含...

Global site tag (gtag.js) - Google Analytics