【Spring系列】- 手写模拟Spring框架( 六 )

然而,在spring扫描的时候会进行操作,因为自己实现的BeanPostProcessor是通过Component注解注入spring容器的 。因此可以通过判断有Component注解时候,进行判断是否含有BeanPostProcessor类,如果有生成BeanPostProcessor对象,并且将其实例添加到beanPostProcessorList容器中 。在此就需要定义ArrayList<BeanPostProcessor> beanPostProcessorList = new ArrayList<>();来记录BeanPostProcessor 。
// 6 判断是否是并加入beanPostProcessorList,这里不能使用instanceofif (BeanPostProcessor.class.isAssignableFrom(clazz)) {    // 直接生成对象    BeanPostProcessor instance = (BeanPostProcessor) clazz.newInstance();    // 然后保存进去    beanPostProcessorList.add(instance);}接着就可以在创建bean对象的时候,在初始化前后去遍历这个BeanPostProcessor链表,调用相应的方法,就能够调用自定义的MyBeanPostProcessor的方法 。
// 6 BeanPostProcessor 初始化前 AOP 遍历beanPostProcessorListfor (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {    instance = beanPostProcessor.postBeforeProcessor(beanName, instance);}// 5 初始化if (instance instanceof InitializingBean) {    ((InitializingBean)instance).afterPropertiesSet();}// 6 BeanPostProcessor 初始化后 AOPfor (BeanPostProcessor beanPostProcessor : beanPostProcessorList) {    instance = beanPostProcessor.postAfterProcessor(beanName, instance);}运行结果:.

【Spring系列】- 手写模拟Spring框架

文章插图
AOP机制需要通过代理对象 。这样如果不进行操作,返回的对象还是原来的,如果是通过操作了,那么返回的就是代理的对象 。这里就简单的打印一句话 。在扫描的时候,扫到userService这个bean的时候,返回的实例就是代理对象 。
@Overridepublic Object postAfterProcessor(String beanName, Object bean) {    System.out.println("初始化后的bean:" + beanName + " -- " + bean);    if (beanName.equals("userService")) {        // 创建一个代理对象, 代理的是UserInterface这个        Object proxyInstance = Proxy.newProxyInstance(MyBeanPostProcessor.class.getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {            @Override            /**             * proxy:代理对象             * method:代理对象当前正在执行的方法             */            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                System.out.println("切面逻辑");                return method.invoke(bean, args);            }        });        return proxyInstance;    }    return bean;}

经验总结扩展阅读