Spring的BeanFacotryPostProcessor和BeanPostProcessor

今天研究spring的相关扩展点的启动顺序,预期是BeanfactoryPostProcessor会在BeanPostProcessor之前执行,但是我发现,写完代码后并没有执行我的BeanPostProcessor。

原始代码如下

  1 package com.think.www.config;
  2 
  3 import com.think.www.mybean.Dog;
  4 import org.springframework.beans.BeansException;
  5 import org.springframework.beans.factory.config.BeanDefinition;
  6 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  7 import org.springframework.beans.factory.config.BeanPostProcessor;
  8 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  9 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 10 import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
 11 import org.springframework.context.annotation.Bean;
 12 import org.springframework.context.annotation.Configuration;
 13 import org.springframework.stereotype.Component;
 14 import org.springframework.web.cors.CorsConfiguration;
 15 import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
 16 import org.springframework.web.filter.CorsFilter;
 17 
 18 /**
 19  * 代码不写注释,编程不打日志,像极了你和别人吹NB的样子。
 20  *
 21  * @author 北桥南望
 22  * @since 2021-05-25 13:01
 23  */
 24 
 25 @Configuration
 26 public class CorsConfig {
 27     private CorsConfiguration buildConfig() {
 28         CorsConfiguration corsConfiguration = new CorsConfiguration();
 29         // 允许任何域名
 30         corsConfiguration.addAllowedOrigin("*");
 31         // 允许任何头
 32         corsConfiguration.addAllowedHeader("*");
 33         // 允许任何方法
 34         corsConfiguration.addAllowedMethod("*");
 35         return corsConfiguration;
 36     }
 37 
 38     @Bean
 39     public CorsFilter corsFilter() {
 40         UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
 41         // 注册
 42         source.registerCorsConfiguration("/**", buildConfig());
 43         return new CorsFilter(source);
 44     }
 45 
 46     @Bean
 47     public Dog dog(){
 48 
 49         return new Dog();
 50 
 51     }
 52 
 53 
 54 
 55     @Component
 56     public static class DogBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
 57         @Override
 58         public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
 59 
 60             System.out.println();
 61             System.out.println();
 62             System.out.println();
 63 
 64             System.out.println("postProcessBeanDefinitionRegistry 执行结束");
 65 
 66             System.out.println();
 67             System.out.println();
 68             System.out.println();
 69 
 70         }
 71 
 72         @Override
 73         public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 74 
 75             
 76             Dog bean = beanFactory.getBean(Dog.class);
 77 
 78             System.out.println(bean);
 79 
 80             bean.setName("dddd");
 81 
 82             System.out.println();
 83             System.out.println();
 84             System.out.println();
 85 
 86             System.out.println("postProcessBeanFactory 执行结束");
 87 
 88             System.out.println();
 89             System.out.println();
 90             System.out.println();
 91 
 92         }
 93     }
 94 
 95     @Component
 96     public static class DogBeanPostProcessor implements BeanPostProcessor {
 97 
 98         @Override
 99         public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
100 
101 
102 
103             if(bean instanceof Dog){
104                 Dog dog = (Dog)bean;
105                 dog.setName("postProcessAfterInitialization");
106 
107                 System.out.println();
108                 System.out.println();
109                 System.out.println();
110 
111                 System.out.println(dog.getName());
112                 System.out.println("postProcessAfterInitialization 执行结束");
113 
114                 System.out.println();
115                 System.out.println();
116                 System.out.println();
117             }
118 
119 
120 
121             return bean;
122         }
123 
124         @Override
125         public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
126 
127 
128 
129             if(bean instanceof Dog){
130                 Dog dog = (Dog)bean;
131                 dog.setName("postProcessBeforeInitialization");
132 
133                 System.out.println();
134                 System.out.println();
135                 System.out.println();
136 
137                 System.out.println(dog.getName());
138                 System.out.println("postProcessBeforeInitialization 执行结束");
139 
140                 System.out.println();
141                 System.out.println();
142                 System.out.println();
143             }
144 
145 
146 
147             return bean;
148         }
149     }
150 
151 }
View Code
package com.think.www.mybean;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * 代码不写注释,编程不打日志,像极了你和别人吹NB的样子。
 *
 * @author 北桥南望
 * @since 2021-07-02 17:30
 */
public class Dog implements InitializingBean, DisposableBean {

    private int age=100;

    private String name="aaa";

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public void afterPropertiesSet() throws Exception {


        this.name = "InitializingBean";

        System.out.println();
        System.out.println();
        System.out.println();

        System.out.println(name);
        System.out.println("InitializingBean 执行结束");

        System.out.println();
        System.out.println();
        System.out.println();

    }

    @Override
    public void destroy() throws Exception {

        System.out.println("DisposableBean 执行结束");

    }

    @Override
    public String toString() {
        return "Dog{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
View Code

出现的结果就是BeanfactoryPostProcessor的内容会打印,但是BeanPostProcessor的内容一直不打印。(事实上BeanPostProcessor执行了,但是没有看到Dog的bean的初始化的前后处理.)我一度怀疑是不是SpringBoot做了什么变更。

直到我看了一下BeanFactoryPostProcessor的注释我才恍然大悟。看截图

 

 

这已经说明,BeanFactoryPostProcessor尽量去操作BeanDefinition,不要去操作Bean,这里操作Bean可能会导致Bean的过早实例化,会有一些副作用,会影响BeanPostProcessor之类的,所以如果想对Bean做一些处理的话,尽量到BeanPostProcessor去做。

后来代码稍作修改,各个扩展点就都可以执行了。

package com.think.www.config;

import com.think.www.mybean.Dog;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 代码不写注释,编程不打日志,像极了你和别人吹NB的样子。
 *
 * @author 北桥南望
 * @since 2021-05-25 13:01
 */

@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 允许任何域名
        corsConfiguration.addAllowedOrigin("*");
        // 允许任何头
        corsConfiguration.addAllowedHeader("*");
        // 允许任何方法
        corsConfiguration.addAllowedMethod("*");
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 注册
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }

    @Bean
    public Dog dog(){

        return new Dog();

    }



    @Component
    public static class DogBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

            System.out.println();
            System.out.println();
            System.out.println();

            System.out.println("postProcessBeanDefinitionRegistry 执行结束");

            System.out.println();
            System.out.println();
            System.out.println();

        }

        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {


            //这里回到导致Bean的过早实例化
//            Dog bean = beanFactory.getBean(Dog.class);
//
//            System.out.println(bean);
//
//            bean.setName("dddd");

            System.out.println();
            System.out.println();
            System.out.println();

            System.out.println("postProcessBeanFactory 执行结束");

            System.out.println();
            System.out.println();
            System.out.println();

        }
    }

    @Component
    public static class DogBeanPostProcessor implements BeanPostProcessor {

        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {



            if(bean instanceof Dog){
                Dog dog = (Dog)bean;
                dog.setName("postProcessAfterInitialization");

                System.out.println();
                System.out.println();
                System.out.println();

                System.out.println(dog.getName());
                System.out.println("postProcessAfterInitialization 执行结束");

                System.out.println();
                System.out.println();
                System.out.println();
            }



            return bean;
        }

        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {



            if(bean instanceof Dog){
                Dog dog = (Dog)bean;
                dog.setName("postProcessBeforeInitialization");

                System.out.println();
                System.out.println();
                System.out.println();

                System.out.println(dog.getName());
                System.out.println("postProcessBeforeInitialization 执行结束");

                System.out.println();
                System.out.println();
                System.out.println();
            }



            return bean;
        }
    }

}
View Code

打印的日志内容也贴一下吧。

 

 

posted @ 2021-07-05 10:09  Think-007  阅读(73)  评论(0编辑  收藏  举报