Mini-Spring之AOP

引言

我们上一篇文章中,已经完成了BeanPostProcessor实现,这篇文章着重讲述AOP如何实现。

让我们开始吧!😊

本文所有的代码都在这个项目工程里,大家需要的时候可以随时取用。传送门

aop也就是切面编程,实际在我们的spring中其实就是生产一个代理类,这个代理类包含了原有类的操作,然后又增强了一些其他的操作。

我们可以想到,既然是代理类,那么肯定是原始类已经生产完之后,才回根据它生成,不然后就会导致代理类和被代理对象的不一致。

显而易见,我们可以在BeanPostProcessor中的afterinit方法中去实现这个逻辑,我们截取关键代码:

public Object postProcessAfterInitialization(Object bean, String beanName) {
        if(beanName.equals("userService")){
            System.out.println("after init bean processor");
        }

              //这里只是区分下让逻辑分开,其实可以和上面合并在一起
        if(beanName.equals("userService")){
              //创建代理类,这里使用jdk的动态代理,理由很简单无需引用其他三方的包
              //但是需要在UserService中实现一个接口,具体可以看我们的代码
            return Proxy.newProxyInstance(SelfTestBeanPostProcessor.class.getClassLoader(),
                    bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                      //这里写的就是切面的逻辑
                    System.out.println("aop logic-----");
                      //这里调用原来的方法
                    return method.invoke(bean, args);
                }
            });
        }


        return bean;
}

完成之后,执行相关测试代码:

before init bean processor
initializing bean —-afterPropertiesSet
after init bean processor
aop logic
com.zhu.service.OrderService@6f94fa3e|userService

有我们想要的效果,这就是一个简单的aop实现。

自此,我们完成了我们的目标,写了一个简单的spring,比较清晰的了解了spring的生命周期,为我们后续理解spring源码做了一个简单的指引。