Spring BeanPostProcessor 的执行顺序

- 日理万妓 2022-12-05 00:44 316阅读 0赞

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70_pic_center

  1. 首先 Spring 通过调用构造方法创建 User 对象;
  2. User 对象创建好之后,先不直接进行初始化操作,通过 BeanPostProcessor 对刚创建好的 User 对象进行加工操作,其中 postProcessBeforeInitialization 方法的第一个参数是 User 对象,第二个参数是在配置文件中指定的 id 值;
  3. 加工好之后通过 return 将对象返回给 Spring 容器,然后 Spring 容器继续按照流程执行 初始化操作,先是 InitializingBean 的初始化操作;
  4. 再是 init-method 的初始化;
  5. 然后 Spring 容器再次将对象交给 BeanPostProcessor ,执行 postProcessAfterInitialization 方法。

实际上在实战中,我们很少处理 Spring 的初始化操作,所以没有必要区分 Before 还是 After。只需要实现其中的一个即可,显然选 After 方法更好。


先定义一个实体类 Category

  1. public class Category {
  2. private Integer id;
  3. private String name;
  4. public Integer getId() {
  5. return id;
  6. }
  7. public void setId(Integer id) {
  8. this.id = id;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. @Override
  17. public String toString() {
  18. return "Category{" +
  19. "id=" + id +
  20. ", name='" + name + '\'' +
  21. '}';
  22. }
  23. }

然后注入到 Spring 容器中:

  1. <bean class="edu.lsu.pojo.Category" id="category">
  2. <property name="id" value="1"/>
  3. <property name="name" value="迪丽热巴"/>
  4. </bean>

注意此时的名字是迪丽热巴。

此时我们定义一个 BeanPostProcessor,实现他的后置处理器方法,:

  1. public class MyBeanPostProcessor implements BeanPostProcessor {
  2. @Override
  3. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  4. return bean;
  5. }
  6. @Override
  7. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  8. Category category = (Category) bean;
  9. category.setName("古力娜扎");
  10. return category;
  11. }
  12. }

当我们在此时的时候,输出结果就是古力娜扎;

  1. @Test
  2. public void test7() {
  3. ApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext2.xml");
  4. Category category = ac.getBean("category", Category.class);
  5. System.out.println("category = " + category);
  6. }
  7. 输出:
  8. category = Category{ id=1, name='古力娜扎'}

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读