参与spring初始化的方式

一、BeanPostProcessor接口

BeanPostProcessor是spring的一个后置处理器,他可以参与spring容器初始化的过程。我们通过重写这个接口的两个方法进行参与,示例如下:

@Component
    public class AopBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("hello")){
            System.out.println("BeforeInitialization");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("hello")) {
            System.out.println("AfterInitialization");
        }
        return bean;
    }
}
@Repository
public class Hello {
    public void say(){
        System.out.println("hello, ===================================");
    }
}
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(MyConfig.class);
        Hello hello = (Hello)acac.getBean("hello");
        hello.say();
    }
}
执行结果:

BeforeInitialization
AfterInitialization
hello, ===================================

如果实现多个后置处理器,如何保证其执行顺序?我们通过实现PriorityOrdered类重新getOrder()的方法进行设置,其返回值越小其执行优先权越高,示例如下:

@Component
    public class AopBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("hello")){
            System.out.println("BeforeInitialization");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("hello")) {
            System.out.println("AfterInitialization");
        }
        return bean;
    }
    @Override
    public int getOrder() {
        return 201;
    }
}
@Component
public class AopBeanPostProcessor1 implements BeanPostProcessor, PriorityOrdered {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("hello")){
            System.out.println("BeforeInitialization1");
        }

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("hello")) {
            System.out.println("AfterInitialization1");
        }
        return bean;
    }

    @Override
    public int getOrder() {
        return 200;
    }
}
执行结果如下:

BeforeInitialization1
BeforeInitialization
AfterInitialization1
AfterInitialization
hello, ===================================

 

posted @ 2022-01-10 00:01  乖~摸摸头  阅读(72)  评论(0)    收藏  举报