spring BeanPostProcessor后置处理器

这个接口有两个方法:


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;
    }
}

**实时内容请关注微信公众号,公众号与博客同时更新:程序员星星**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值