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 }
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 + '\'' + '}'; } }
出现的结果就是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; } } }
打印的日志内容也贴一下吧。
原创博文,未经许可不得转载,转载请注明出处。