临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

手把手教会Spring从面向对象再到面向切面,直接易懂

9月9日 相思宫投稿
  ObjectobjectnewObject();
  世间万物的本质都可看作类的对象,面向对象(OOP)的模式让程序易维护、易复用、易扩展,而面向切面(AOP)则是面向对象的补充,让对象的功能更加强大
  对比前面的日志框架技术二者非常相似,他的特点就是在不影响业务的前提下将程序的运行情况输出到控制台,总体来看是起一个辅助的作用,所谓的AOP亦是如此是在不改原有代码的前提下对其进行增强一。OOPAOP
  OOP将组件视为对象,AOP将对象的切面视为对象
  OOPAOP让程序通过极其简单的方式变得更加全面、强大
  AOP(AspectOrientedProgramming)面向切面编程、OOP(ObjectOrientedProgramming)面向对象编程
  OOP是一种编程思想,AOP也是一种编程思想,编程思想主要的内容就是指导程序员该如何编写程序,两者都是不同的编程范式各有特色二。AOP核心
  通过以下一个计算程序运行时间的功能,引出AOP相关概念RepositorypublicclassAImplimplementsA{publicvoidsave(){记录程序当前执行执行(开始时间)LongstartTimeSystem。currentTimeMillis();业务执行万次for(inti0;i10000;i){System。out。println(START。。。);}记录程序当前执行时间(结束时间)LongendTimeSystem。currentTimeMillis();计算时间差LongtotalTimeendTimestartT输出信息System。out。println(执行万次程序消耗时间:totalTimems);}publicvoidm1(){System。out。println(m1。。。);}publicvoidm2(){System。out。println(m2。。。);}}
  (1)save,m1和m2方法,这些方法我们给起了一个名字叫连接点
  (2)对于需要增强的方法我们给起了一个名字叫切入点
  (3)将功能抽取到一个方法中,换句话说就是存放共性功能的方法,我们给起了个名字叫通知
  (4)通知是要增强的内容,会有多个,切入点是需要被增强的方法,也会有多个,那哪个切入点需要添加哪个通知,就需要提前将它们之间的关系描述清楚,那么对于通知和切入点之间的关系描述,我们给起了个名字叫切面
  (5)通知是一个方法,方法不能独立存在需要被写在一个类中,这个类我们也给起了个名字叫通知类
  三。第一个AOP案例1。环境准备创建一个Maven项目pom。xml添加Spring依赖springcontext添加A和AImpl类publicinterfaceA{publicvoidsave();publicvoidm1();}RepositorypublicclassAImplimplementsA{publicvoidsave(){System。out。println(System。currentTimeMillis());System。out。println(bookdaosave。。。);}publicvoidm1(){System。out。println(bookdaom1。。。);}}创建Spring的配置类ConfigurationComponentScan(yu7daily)publicclassConfig{}编写Show运行类publicclassShow{publicstaticvoidmain(String〔〕args){ShowlicationContextctxnewAnnotationConfigShowlicationContext(Config。class);AActx。getBean(A。class);A。save();}}2。AOP实现步骤
  1。EnableAspectJAutoProxy开启注解格式AOP功能
  2。Aspect设置当前类为AOP切面类
  3。Pointcut设置切入点方法
  4。Before
  1。添加依赖
  pom。xmldependencygroupIdorg。aspectjgroupIdaspectjweaverartifactIdversion1。9。4versiondependency
  因为springcontext中已经导入了springaop,所以不需要再单独导入springaop。
  导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。
  2。定义接口与实现类:环境准备的时候,AImpl已经准备好,不需要做任何修改
  3。定义通知类和通知
  通知就是将共性功能抽取出来后形成的方法,共性功能指的就是当前系统时间的打印publicclassTest{publicvoidmethod(){System。out。println(System。currentTimeMillis());}}
  类名和方法名没有要求,可以任意。
  4。定义切入点
  AImpl中有两个方法,分别是save和m1,我们要增强的是m1方法,该如何定义呢?publicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}publicvoidmethod(){System。out。println(System。currentTimeMillis());}}
  说明:
  切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。
  execution及后面编写的内容
  5。制作切面
  切面是用来描述通知和切入点之间的关系,如何进行关系的绑定?publicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}Before(po1())publicvoidmethod(){System。out。println(System。currentTimeMillis());}}
  绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
  说明:Before翻译过来是之前,也就是说通知会在切入点方法执行之前执行,除此之前还有其他四种类型
  6。将通知类配给容器并标识其为切面类ComponentAspectpublicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}Before(po1())publicvoidmethod(){System。out。println(System。currentTimeMillis());}}7。开启注解格式AOP功能ConfigurationComponentScan(yu7daily)EnableAspectJAutoProxypublicclassConfig{}8。运行程序publicclassShow{publicstaticvoidmain(String〔〕args){ShowlicationContextctxnewAnnotationConfigShowlicationContext(Config。class);AActx。getBean(A。class);A。m1();}}
  看到在执行m1方法之前打印了系统时间戳,说明对原始方法进行了增强,AOP编程成功!!!四。切入点表达式
  前面的案例中,有涉及到如下内容:
  对于AOP中切入点表达式,我们总共会学习三个内容,分别是语法格式、通配符和书写技巧。1。语法格式
  首先我们先要明确两个概念:
  切入点:要进行增强的方法
  切入点表达式:要进行增强的方法的描述方式
  描述方式一:执行yu7daily。dao包下的A接口中的无参数m1方法execution(voidyu7daily。dao。A。m1())
  描述方式二:执行yu7daily。dao。impl包下的AImpl类中的无参数m1方法execution(voidyu7daily。dao。impl。AImpl。m1())
  因为调用接口方法的时候最终运行的还是其实现类的方法,所以上面两种描述方式都是可以的。
  对于切入点表达式的语法为:切入点表达式标准格式:动作关键字(访问修饰符返回值包名。类接口名。方法名(参数)异常名)execution(publicUseryu7daily。service。UserService。findById(int))
  切入点表达式就是要找到需要增强的方法,所以它就是对一个具体方法的描述,但是方法的定义会有很多,所以如果每一个方法对应一个切入点表达式,极其复杂可以通过以下方式进行简化2。通配符
  使用通配符描述切入点,主要的目的就是简化之前的配置
  :单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现execution(publicyu7daily。。UserService。find())
  匹配yu7daily包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
  。。:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写execution(publicUsercom。。UserService。findById(。。))
  匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法
  :专用于匹配子类类型execution(。。Service。(。。))使用切入点表达式来分析下:execution(voidyu7daily。dao。A。m1())匹配接口,能匹配到execution(voidyu7daily。dao。impl。AImpl。m1())匹配实现类,能匹配到execution(yu7daily。dao。impl。AImpl。m1())返回值任意,能匹配到execution(yu7daily。dao。impl。AImpl。m1())返回值任意,但是m1方法必须要有一个参数,无法匹配,要想匹配需要在m1接口和实现类添加参数execution(voidcom。。。。。m1())返回值为void,com包下的任意包三层包下的任意类的m1方法,匹配到的是实现类,能匹配execution(voidcom。。。。m1())返回值为void,com包下的任意两层包下的任意类的m1方法,匹配到的是接口,能匹配execution(void。。m1())返回值为void,方法名是m1的任意包下的任意类,能匹配execution(。。(。。))匹配项目中任意类的任意方法,能匹配,但是不建议使用这种方式,影响范围广execution(。。u(。。))匹配项目中任意包任意类下只要以u开头的方法,m1方法能满足,能匹配execution(。。e(。。))匹配项目中任意包任意类下只要以e结尾的方法,m1和save方法能满足,能匹配execution(voidcom。。())返回值为void,com包下的任意包任意类任意方法,能匹配,代表的是方法execution(yu7daily。。Service。find(。。))将项目中所有业务层方法的以find开头的方法匹配execution(yu7daily。。Service。save(。。))将项目中所有业务层方法的以save开头的方法匹配五。AOP通知类型
  它所代表的含义是将通知添加到切入点方法执行的前面。
  除了这个注解外,还有没有其他的注解,换个问题就是除了可以在前面加,能不能在其他的地方加?
  (1)前置通知,追加功能到方法执行前,类似于在代码1或者代码2添加内容
  (2)后置通知,追加功能到方法执行后,不管方法执行的过程中有没有抛出异常都会执行,类似于在代码5添加内容
  (3)返回后通知,追加功能到方法执行后,只有方法正常执行结束后才进行,类似于在代码3添加内容,如果方法执行抛出异常,返回后通知将不会被添加
  (4)抛出异常后通知,追加功能到方法抛出异常后,只有方法执行出异常才进行,类似于在代码4添加内容,只有方法抛出异常后才会被添加
  (5)环绕通知,环绕通知功能比较强大,它可以追加功能到方法执行的前后,这也是比较常用的方式,它可以实现其他四种通知类型的功能环境准备
  1。pom。xml添加Spring依赖springcontext、aspectjweaver
  2。添加A和AImpl类publicinterfaceA{publicvoidm1();publicintm2();}RepositorypublicclassAImplimplementsA{publicvoidm1(){System。out。println(m1。。。);}publicintm2(){System。out。println(m2isrunning。。。);return1;}}创建Spring的配置类ConfigurationComponentScan(yu7daily)EnableAspectJAutoProxypublicclassConfig{}创建通知类ComponentAspectpublicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}publicvoidaround(){System。out。println(aroundbeforeadvice。。。);System。out。println(aroundafteradvice。。。);}}编写Show运行类publicclassShow{publicstaticvoidmain(String〔〕args){ShowlicationContextctxnewAnnotationConfigShowlicationContext(Config。class);AActx。getBean(A。class);A。m1();}}环绕通知
  (1)原始方法有返回值的处理修改Test,对A中的m2方法添加环绕通知,ComponentAspectpublicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}Pointcut(execution(intyu7daily。dao。A。m2()))privatevoidpo2(){}Around(po2())publicvoidaroundM2(ProceedingJoinPointpjp)throwsThrowable{System。out。println(aroundbeforeadvice。。。);表示对原始操作的调用pjp。proceed();System。out。println(aroundafteradvice。。。);}}修改Show类,调用m2方法ComponentAspectpublicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}Pointcut(execution(intyu7daily。dao。A。m2()))privatevoidpo2(){}Around(po2())publicObjectaroundM2(ProceedingJoinPointpjp)throwsThrowable{System。out。println(aroundbeforeadvice。。。);表示对原始操作的调用Objectretpjp。proceed();System。out。println(aroundafteradvice。。。);}}
  说明:
  返回的是Object而不是int的主要原因是Object类型更通用随时可以转型
  在环绕通知中是可以对原始方法返回值就行修改的1。返回后通知ComponentAspectpublicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}Pointcut(execution(intyu7daily。dao。A。m2()))privatevoidpo2(){}AfterReturning(po2())publicvoidafterReturning(){System。out。println(afterReturningadvice。。。);}}
  注意:返回后通知是需要在原始方法m2正常执行后才会被执行,如果m2()方法执行的过程中出现了异常,那么返回后通知是不会被执行。后置通知则是不管原始方法有没有抛出异常都会被执行2。异常后通知ComponentAspectpublicclassTest{Pointcut(execution(voidyu7daily。dao。A。m1()))privatevoidpo1(){}Pointcut(execution(intyu7daily。dao。A。m2()))privatevoidpo2(){}AfterReturning(po2())publicvoidafterThrowing(){System。out。println(afterThrowingadvice。。。);}}
  环绕通知注意事项1。环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知2。通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行3。对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,最好设定为Object类型4。原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object5。由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须要处理Throwable异常
投诉 评论

正式确认!大巴黎遭打击,齐达内做出正确决定,梅西姆巴佩很失望北京时间5月29日,欧洲联赛传来最新消息,记者HadrienGrenier正式确认,齐达内不会执教巴黎,后者的计划未能打动他,这样的情况对于大巴黎来说显然是个不小的打击。……谁才是特斯拉Model3的超级平替?这四款车才是性价比之选如果说特斯拉Model3、小鹏P7、比亚迪汉算是第一代中高端电动轿车的代表,那么最近密集上市的比亚迪海豹、长安深蓝SL03、零跑C01、哪吒S等全新纯电轿车就有点迭代升级的意思……周润发67岁已经满头白发了,为什么86岁的谢贤还是一头黑发?哈喽,大家好我是红莲时间过得可真快,一眨眼,2022年都已经过去了大半,夏天有过好长一阵时间,没想到转眼就入秋了,所以说人生还是要珍惜现有的时光,就比如我们童年熟悉的香港……原神玩家第一次充月卡,却有陌生人愿出33倍的价格回收前言:贪生怕死角斗士,勇往直前少女心,欢迎来到《龙百万探索原神》,本期分享一下提瓦特大陆上的趣闻快讯。玩家吐槽雷神大世界拉胯原神虽然是一款类单机游戏,但是这款游戏的……手把手教会Spring从面向对象再到面向切面,直接易懂ObjectobjectnewObject();世间万物的本质都可看作类的对象,面向对象(OOP)的模式让程序易维护、易复用、易扩展,而面向切面(AOP)则是面向对象的补……为年轻人准备的双芯旗舰iQOONeo6首发评测【【【前言:iQOONeo系列旗舰,这次更堆料了】】】说到iQOONeo系列,这可能是如今整个手机行业中最特别的产品线之一。早在2019年,初代iQOONeo就凭借着配备……蓬长客港集团省际航线开通大小新闻客户端6月30日讯(YMG全媒体记者王鸿云通讯员张茜摄影报道)6月28日,载有390余名旅客的寻仙17号客轮自蓬长客港集团长岛港首发驶往旅顺港,该航线为首条鲁辽直航海上……2022旅交会这个展厅带你体验数字化美好生活好看、好玩、好吃、好喝、好享在7月22日启幕的2022中国国际旅游交易会上,文旅企业及智慧旅游馆华侨城展厅将为观众带来数字化美好生活的新体验。展厅还将通过华侨城布局云南以来的5……惊!裁判误判改变赛场局势,广厦队9491战胜北京首钢12月31日,在CBA第二阶段的比赛中,浙江广厦队以9491的比分最终也是成功拿下了北京首钢,纵观这场比赛,广厦队赢得可不是那么轻松的,因为这一阶段的首钢队,经过补强之后,其阵……见证大自然的鬼斧神工天眼峰老象峰穿越地点:北京平谷,导航平谷北店村即可路程:12公里(包含中间走错了一段路35)爬升:600米图1难度:1颗星不用开到村里,看着轨迹接近了就在路边把车停好,……我真的很好奇,他长得这么油,是怎么吃上软饭的?在娱乐圈混,你要知道一个道理:人红是非多。人一红,过往的黑料也都会给你扒出来,而没有多少人能够全身而退的,因为过多过少都有一些会黑料在身。我们知道现在出名的方式比以前简单……石油和煤炭不是树木形成,而是自然形成宇宙也不是大爆炸产生的传统理论认为石油和煤炭形成的原因:石油的成油机理有生物沉积变成的。煤炭是树木在地壳的变动不断地埋入地下,长期与空气隔绝,并在高温高压下,经过一系列复杂的物理化学变化……
来体验四大升级9月ColorOS13适配计划公布涉一加9Fi继OPPO在2022开发者大会上公布了ColorOS13的升级公测计划之后,日前,OPPO正式公布了2022年9月升级适配计划,从公布的机型来看,其中涉及到一加9系列、OPPO……官宣了!华为MateXs2确升级北斗卫星消息,没信号也能发消10月31日,华为终端释放一则消息,表示华为MateXs2即将升级北斗卫星消息功能,令其在原本超可靠、超平整和超轻薄的基础上,带来体验的再度提升。在很多人的印象中,北斗系统是用……喜讯!中国斯诺克4胜1负2人轰出50,携手丁俊晖冲击正赛北京时间2022年11月26日,斯诺克德国大师赛结束资格赛第5日争夺,5位中国球员登场,结果取得4胜1负的成绩,只有傅家俊输给希金斯,其他四位球员范争一、李行、曹宇鹏、庞俊旭全……去陕西必点的七大特色名菜,每一道都让人念念不忘,你吃过几道?陕西是一座很有文化底蕴的城市,也是一座非常有魅力的城市,小编每次去到陕西游玩,都被它的城市风光所折服,当然,特色美食也是必不可少的,今天小编就来分享去陕西必点的七大特色名菜,每……又又又被王小虎搞住院了孕352,熬过了孕早期出血;NT检查,无创DNA检查,大排畸,小排畸,糖耐都是一次顺利过,我这好汉第二次被胎心监护搞住院了孕322的时候,常规检查胎心监护2次没吸氧没过,……赵继伟率伴郎团接亲!给新娘献花被问有钱还是有卡?纪委有我的爱5月18日消息,5月18日,辽宁队后卫赵继伟与妻子王君瑞将在海南三亚大婚,在原帅、王政博等伴郎团鼎力协助下,赵继伟圆满完成了接亲环节,抱得美人归。这次赵继伟的婚礼搞得十分……2022年9月16日秋季非常漂亮的早安图片带祝福语,暖心早安秋雨过后天变凉,春捂秋冻要适当,休为争俏不服老,劝君多添新衣裳,保重身体更健康,群里的兄弟姐妹们,大家早上好!永久的财富是朋友,一生的金牌是健康,鲜花可以重开,人生没有重……预算两千元左右,拍照能力好,这几款放心入手大家好,现如今手机拍照能力成了很多朋友们首选的需求,所以各个厂家也是在手机拍照上下了大功夫!那么今天给大家介绍三款预算两千元左右,拍照能力比较好的手机。喜欢的朋友可以收藏起来!……为什么科学家如此确定火星上曾经有水?看看下面的两张照片:左边是火星上的鹅卵石照片,右边是地球上鹅卵石的照片。几乎相似。像这样的鹅卵石是在水或类似水的材料的帮助下产生的,水会侵蚀侧面,使它们变得像鹅卵石一样圆……刘强东涉嫌性侵女大学生案听证会,时隔2年后再次重启后沙爆料,刘强东涉嫌性侵女大学生案听证会时隔2年后再次重启。刘强东案将在美国举行公开听证会,时间在4月25日。开庭时间:45PM(美国中部时间)56AM(北京时间)。听证……华为海思芯4K电视盒子旗舰版到手价88元随着智能电视的普及,电视盒子也成为了很多家庭首选。毕竟,随着光纤宽带的普及,网络观影已经成为习惯。魅盒高清电视盒子,采用了华为海思芯片,不仅可以直播观看央视卫视地方台,内置4K……海天味业再回应双标,前阿里高管任李锦记CEO新消费周报速览一周新消费投融资新风向高端护肤品牌溯华完成数千万元战略融资36Kr消息,高端护肤品牌溯华近日已完成数千万元战略融资,投资方为上市公司若羽臣,浪潮资本担任此……

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找