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