这个接口有两个方法:
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
类实现这个接口,spring每一个bean被创建时都会走这个接口的实现类,从而我们就可以加一下自己的逻辑,对spring中的bean做一些修改。
最好先了解一下spring的Bean的生命周期,我这简化的说,在spring bean的生命周期中,就和servlet一样,顺序:构造函数实例化->注入属性->setBeanName->setBeanFactory->postProcessAfterInitialization->afterPropertiesSet->init-method->postProcessBeforeInitialization,大体是这么个流程。 所以我们可以在生命周期过程中,对bean做修改,完成自己的业务逻辑。
看下一个简单的例子:
package com.xhx.spring.config;
import com.xhx.spring.domain.User;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.net.UnknownServiceException;
/**
* xuhaixing
* 2018/9/28 22:34
* 后置处理器
**/
@Configuration
public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
@Override
public int getOrder() {
return 0;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof User){
User user = (User)bean;
user.setAge(18);
}
return bean;
}
}
在注入User类时,我把年龄给改了。
User bean的初始化:
package com.xhx.spring.config;
import com.xhx.spring.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xuhaixing
* 2018/9/28 22:31
**/
@Configuration
public class UserConfig {
@Bean
public User user(){
return new User("fdsf-df-32-fa-g","xu",25);
}
}
我们写了一个接口,看一下User bean的值:
package com.xhx.spring.controller;
import com.xhx.spring.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* xuhaixing
* 2018/9/28 22:32
**/
@RestController
@RequestMapping(name = "user")
public class UserController {
@Autowired
private User user;
@RequestMapping(name = "getUser")
public User getUser(){
return user;
}
}
**实时内容请关注微信公众号,公众号与博客同时更新:程序员星星**