仿照Spring的AOP写的 MyAOP 2.0,有环绕通知、前置通知、后置通知、返回通知、异常通知等。
已实现:①通过动态代理+通知的注解类,实现了前置通知、后置通知等各种通知;②切点(在需要通知的方法上加注解);③切面(同②);
未实现:①通知的格式没写成可配置的; ②切点、切面没抽取成一个更方便配置的切面类;③其他。
二、思路整理:
1.涉及的角色:
①被代理类;
②被代理类要实现的接口;
③代理类;
④动态创建“代理类的对象”的类;
⑤注解类:
a. 切面注解类,注解在类上:
@Aspect
b. 各种通知注解,注解在方法上:
@Before
@AfterReturning
@After
@AfterThrowing
@Around
⑥IOC容器:BeanFactory(自己实现IOC容器:博客还没写完 * ~ *,写好了再附上链接)。
2.实现步骤:
(1)被代理类、被代理类的接口、通知的注解类的创建;
(2)创建一个“动态代理类”,并把“被代理类的实例”传给该代理类;在该动态代理类的invoke()方法中,实现前置通知、后置通知等各种通知,也是在该invoke()方法中调用、执行真正的代理类要执行的那个方法。
(3)创建一个可以动态创建“代理类的实例”的类,通过该类的getProxyInstance(Object obj)方法可以得到一个动态代理类的实例。
(4)给方法加通知注解,该方法的实例须已交由IOC容器管理的;
(5)遍历BeanFactory,找出方法上有@通知注解的bean,为这些bean生成代理类对象(步骤:MyProxy3.getProxyInstance(Object obj))
(6)用代理类的实例去替代BeanFactory中的被代理类的实例
三、代码实现:
被代理类的接口:
1 public interface SuperMan { 2 int add(int a, int b); 3 int divide(int a, int b); 4 }