自己实现简易版AOP含AOP实现的步骤分解_第1页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自己实现简易版aop,含aop实现的步骤分解思路收拾:1.涉及的角色:被代理类;被代理类要实现的接口;代理类;动态创建代理类的对象的类;注解类(注解在办法上);ioc容器:beanfactory(自己实现ioc容器:2.实现步骤:(1)被代理类、被代理类的接口、inoutlog注解类的创建;(2)创建一个动态代理类,并把被代理类的实例传给该代理类;在该动态代理类的invoke()办法中,实现日志的输出,也是在该invoke()办法中调用、执行真正的代理类要执行的那个办法。(3)创建一个可以动态创建代理类的实例的类,通过该类的getproxyinstance(objectobj)办法可以得到一个

2、动态代理类的实例。(4)给办法加通知注解,该办法的实例须已交由ioc容器管理的;(5)遍历beanfactory,找出办法上有inoutlog注解的bean,为这些bean生成代理类对象(步骤:myproxy3.getproxyinstance(objectobj));(6)用代理类的实例去替代beanfactory中的被代理类的实例;三、代码实现:被代理类的接口:packagemyiocandmyaop.bean;publicinterfacesubjectvoidtest();被代理类:1packagemyiocandmyaop.bean;23importmyiocandmyaop.ann

3、otations.inoutlog;4importmyiocandmyaop.annotations.myautowired;5importmyiocandmyaop.annotations.mycomponent;67/*8*被代理类9*/10mycomponent11publicclasspersonimplementssubject1213myautowired14privatestudentstudent;1516inoutlog17publicvoidtest()18system.out.println(this+".test():"+student);1920i

4、noutlog注解类:packagemyiocandmyaop.annotations;importjava.lang.annotation.elementtype;importjava.lang.annotation.retention;importjava.lang.annotation.retentionpolicy;importjava.lang.annotation.target;target(elementtype.method)retention(retentionpolicy.runtime)publicinterfaceinoutlog动态代理类:publicclassmyi

5、nvocationhandler2implementsinvocationhandlerprivateobjectobject;/被代理类privateobjectinvoke;publicvoidsetobject(objectobject)this.object=object;/*在beanfactory中,办法上有inoutlog注解,则生成动态代理办法*/overridepublicobjectinvoke(objectproxy,methodmethod,objectargs)throwsthrowable/这里做推断,看是否需要做下面的输出booleanbool=false;/!注

6、重,要用被代理类的对象去推断其method办法上是否有inoutlog注解,而不是用入参method对象(该method对象是被代理类的接口的)/怎么处理入参的类型:见myaop2.这里没有做入参处理,可能会报办法找不到异样,注重!methoddeclaredmethod=object.getclass().getdeclaredmethod(method.getname();if(null!=declaredmethod.getannotation(inoutlog.class)system.out.println("我是日志输出start");bool=true;inv

7、oke=method.invoke(object,args);/这里做推断,同上if(bool)system.out.println("我是日志输出end");system.out.println("-");returninvoke;动态创建代理类的对象的类:publicclassmyproxy2/*动态的创建一个代理类的对象*myproxy动态创建的代理类的对象:*classaimplementssubject*privatehandlerhandler;*publicvoidtest()*/获得到当前办法名*handler.invoke();*/pu

8、blicstaticobjectgetproxyinstance(objectobj)myinvocationhandler2handler=newmyinvocationhandler2();handler.setobject(obj);returnproxy.newproxyinstance(obj.getclass().getclassloader(),obj.getclass().getinterfaces(),handler);/*对于有inoutlog注解的,用代理类的bean来替代beanfactory中的被代理类的bean。*这一步很重要,由于当执行到bean.method()

9、,执行的就一定是bean对应的method()办法,*假如此时没实用代理类对象去替换,那么执行的就是没有inoutlog的本来的那个办法。*/publicstaticvoidupdatebean(stringcompleteclassname,objectobject)myioc.updatebeanfrombeanfactory(completeclassname,getproxyinstance(object);/(全类名,代理类的bean)扫描beanfactory,找出办法上有inoutlog注解的bean,为其创建代理类对象,并替代原bean。用法测试:publicclassmyao

10、p2publicstaticvoidmain(stringargs)/*用法步骤:*給指定类的某个办法加inoutlog注解;*通过beanfactory或的该类的实例;*执行bean.method();*效果:method()办法的前后有了log的输出。*/stringcompleteclassname="myiocandmyaop.bean.person"objectbean=myioc.getbean(completeclassname);subjectperson=(subject)bean;person.test();staticinit();publicstaticvoidinit()updatebeanfrombeanfactory();/*扫描beanfactory,找出办法上有inoutlog注解的bean,为其创建代理类对象,并替代原bean。*/publicstaticvoidupdatebeanfrombeanfactory()for(map.entryentry:myioc.getbeanfactory().entryset()for(meth

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论