0
点赞
收藏
分享

微信扫一扫

Spring的BeanPostProcessor

尤克乔乔 2021-09-25 阅读 75

一:什么是BeanPostProcessor

BeanPostProcessor是Spring IOC容器给我们提供的一个扩展接口。接口声明如下:

@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 IOC容器实例化Bean===
===调用BeanPostProcessor的postProcessBeforeInitialization方法===
===调用bean实例的初始化方法===
===调用BeanPostProcessor的postProcessAfterInitialization方法===

二:BeanPostProcessor实例

前置代码:
Person类:

@Component
public class Person {
}

User类:

package org.example.bean;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

/**
 * @author yzh
 * @date 2021/4/29 8:42
 **/
@Component
public class User {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public User(String name) {
        this.name = name;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

Config类:

package org.example.bean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;

/**
 * @author yzh
 * @date 2021/4/29 9:20
 **/
@ComponentScan("org.example.bean")
public class Config {

    //@Bean
    //public User user(){
    //    return  new User();
    //}
}

1.新建一个类SpringBeanPostProcessor并实现BeanPostProcess接口,发现并未让我们强制实现方法,这是因为BeanPostProcessor里的方法时默认实现的,但是我们仍然可以实现该方法
注意该类需要打上@Component让Spring识别到,否则重写的方法不生效

package org.example.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * @author yzh
 * @date 2021/4/30 9:57
 **/
@Component
public class SpringBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("1111111111111111111111");
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return new Person();
    }
}

运行结果:因为我们在后置处理处替换了原有返回Bean,所有此处报了类型不正确的错误,希望要一个UserBean,但是返回一个PersonBean

1111111111111111111111
1111111111111111111111
1111111111111111111111
Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'user' is expected to be of type 'org.example.bean.User' but was actually of type 'org.example.bean.Person'
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:399)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1115)
    at org.example.bean.Main.main(Main.java:16)

Process finished with exit code 1

注:如果直接return null,不会改变任何值
如:

package org.example.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * @author yzh
 * @date 2021/4/30 9:57
 **/
@Component
public class SpringBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("1111111111111111111111");
        return null;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //return new Person();
        return null;
    }
}

当然也可以通过后置处理器处理一些自己的代码逻辑,但是除非必要,否则不推荐这样操作

举报

相关推荐

0 条评论