日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Aop面向切面编程自动注入

發(fā)布時(shí)間:2025/3/14 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Aop面向切面编程自动注入 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.面向切面編程

  在程序原有縱向執(zhí)行流程中,針對(duì)某一個(gè)或某一些方法添加通知,形成橫切面的過(guò)程叫做面向切面編程

2.常用概念

  原有功能:切點(diǎn),pointcut

  前置通知:在切點(diǎn)之前執(zhí)行的功能,before advice

  后置通知:在切點(diǎn)之后執(zhí)行的功能,after advice

  如果切點(diǎn)執(zhí)行過(guò)程中出現(xiàn)異常,會(huì)觸發(fā)異常通知,throws advice

  所有功能的總稱叫做切面

  織入:把切面嵌入原有功能的過(guò)程叫做織入

3.Schema-based方式

  每個(gè)通知都需要實(shí)現(xiàn)接口或類(lèi)

  配置spring配置文件時(shí)在<aop:config>配置

4.AspectJ方式

  每個(gè)通知不需要實(shí)現(xiàn)接口或類(lèi)

  配置spring配置文件時(shí)在<aop:config>的子標(biāo)簽<aop:aspect>中配置

5.Schema-based

Demo.java

public class Demo {public void demo1(){System.out.println("demo1");}public void demo2(){System.out.println("demo2");}public void demo3(){System.out.println("demo3");} }

  (1)導(dǎo)入jar包

    aopalliance-1.0.jar

    aspectjweaver-1.9.2.jar

  (2)新建前置通知類(lèi)

  arg0:切點(diǎn)方法對(duì)象Method對(duì)象

  arg1:切點(diǎn)方法參數(shù)

  arg2:切點(diǎn)方法所在類(lèi)的對(duì)象

public class MyBeforeAdvice implements MethodBeforeAdvice{@Overridepublic void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {System.out.println("執(zhí)行前置通知");} }

  (3)新建后置通知類(lèi)

  arg0:切點(diǎn)方法返回值

  arg1:切點(diǎn)方法對(duì)象Method對(duì)象

  arg2:切點(diǎn)方法參數(shù)

  arg3:切點(diǎn)方法所在類(lèi)的對(duì)象

public class MyAfterAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {System.out.println("執(zhí)行后置通知");} }

  (4)配置spring配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 配置通知類(lèi)的對(duì)象,在切面中引入 --> <bean id="mybefore" class="com.mxj.advice.MyBeforeAdvice"></bean> <bean id="myafter" class="com.mxj.advice.MyAfterAdvice"></bean><!-- 配置切面 --><aop:config><!-- 配置切點(diǎn) *通配符:匹配任意方法名,任意類(lèi)名,任意一級(jí)包名;(..):任意類(lèi)型參數(shù)--><aop:pointcut expression="execution(* com.mxj.test.Demo.demo2())" id="mypoint"/><!-- 通知 --><aop:advisor advice-ref="mybefore" pointcut-ref="mypoint"/><aop:advisor advice-ref="myafter" pointcut-ref="mypoint"/></aop:config><!-- 配置Demo類(lèi) --><bean id="demo" class="com.mxj.test.Demo"></bean> </beans>

?6.配置異常通知的步驟(AspectJ方式)

  (1)只有切點(diǎn)報(bào)異常才能觸發(fā)異常通知

  (2)在spring中只有AspectJ方式提供了異常通知的方法

  (3)實(shí)現(xiàn)步驟

新建類(lèi),在類(lèi)中寫(xiě)任意名稱的方法

public class MyThrowAdvice {public void myexception(){System.out.println("執(zhí)行異常通知");} }

在spring配置文件中配置

  <aop:aspect>的ref屬性表示:方法在哪個(gè)類(lèi)中

  <aop:xxxx/>表示xxx通知

  method:當(dāng)觸發(fā)這個(gè)通知時(shí)調(diào)用哪個(gè)方法

  throwing:異常對(duì)象名,必須和通知中方法參數(shù)名相同(可以不在通知中聲明異常對(duì)象)

  <bean id="mythrow" class="com.mxj.advice.MyThrowAdvice"></bean><aop:config><aop:aspect ref="mythrow"><aop:pointcut expression="execution(* com.mxj.test.Demo.demo1())" id="mypoint"/><aop:after-throwing method="myexception()" pointcut-ref="mypoint" throwing="e"/></aop:aspect></aop:config><bean id="demo" class="com.mxj.test.Demo"></bean>

7.異常通知(Schema-based方式)

?  (1)新建一個(gè)類(lèi)實(shí)現(xiàn)throwsAdvice接口

public class MyThrow implements ThrowsAdvice{public void afterThrowing(Exception ex) throws Throwable {System.out.println("執(zhí)行異常通知:schema-base方式");} }

  (2)配置applicationContext.xml

<bean id="mythrow" class="com.mxj.advice.MyThrow"></bean><aop:config><aop:pointcut expression="execution(* com.mxj.test.Demo.demo1())" id="mypoint"/><aop:advisor advice-ref="mythrow" pointcut-ref="mypoint"/></aop:config><bean id="demo" class="com.mxj.test.Demo"></bean>

8.環(huán)繞通知(Schema-based方式)

  把前置通知和后置通知都寫(xiě)到一個(gè)通知中,就組成了環(huán)繞通知

  (1)新建一個(gè)類(lèi)實(shí)現(xiàn) MethodInterceptor(攔截器)

public class MyArround implements MethodInterceptor{@Overridepublic Object invoke(MethodInvocation arg0) throws Throwable {System.out.println("環(huán)繞-前置");Object result = arg0.proceed();System.out.println("環(huán)繞-后置");return result;} }

  (2)配置applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 異常通知 --><!-- <bean id="mythrow" class="com.mxj.advice.MyThrow"></bean><aop:config><aop:pointcut expression="execution(* com.mxj.test.Demo.demo1())" id="mypoint"/><aop:advisor advice-ref="mythrow" pointcut-ref="mypoint"/></aop:config><bean id="demo" class="com.mxj.test.Demo"></bean> --><bean id="myarround" class="com.mxj.advice.MyArround"></bean><aop:config><aop:pointcut expression="execution(* com.mxj.test.Demo.demo1())" id="mypoint"/><aop:advisor advice-ref="myarround" pointcut-ref="mypoint"/></aop:config><bean id="demo" class="com.mxj.test.Demo"></bean> </beans>

?9.AspectJ方式實(shí)現(xiàn)

類(lèi)中方法名任意

public class MyAdvice {public void mybefore(){System.out.println("前置");}public void myafter(){System.out.println("后置1");}public void myaftering(){System.out.println("后置2");}public void mythrow(){System.out.println("異常");}public Object myarround(ProceedingJoinPoint p) throws Throwable{System.out.println("執(zhí)行環(huán)繞");System.out.println("環(huán)繞-前置");Object result = p.proceed();System.out.println("環(huán)繞-后置");return result;} }

配置spring配置文件

  <aop:after/> 后置通知,是否出現(xiàn)異常都執(zhí)行

  <aop:after-returning/> 后置通知,只有當(dāng)切點(diǎn)正確執(zhí)行時(shí)執(zhí)行

  <aop:after/>、<aop:after-returning/>、<aop:after-throwing/>執(zhí)行順序和配置順序有關(guān)

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="demo" class="com.mxj.test.Demo"></bean> <bean id="myadvice" class="com.mxj.advice.MyAdvice"></bean><aop:config><aop:aspect ref="myadvice"><aop:pointcut expression="execution(* com.mxj.test.Demo.demo1())" id="mypoint"/><aop:before method="mybefore" pointcut-ref="mypoint"/><aop:after method="myafter" pointcut-ref="mypoint"/><aop:after-returning method="myaftering" pointcut-ref="mypoint"/><aop:after-throwing method="mythrow" pointcut-ref="mypoint"/><aop:around method="myarround" pointcut-ref="mypoint"/></aop:aspect></aop:config> </beans>

?10.AspectJ方式在通知中獲取切點(diǎn)參數(shù)

public class MyAdvice {public void mybefore(String name,int age){System.out.println("前置"+name+" "+age);} }

配置文件

  <bean id="demo" class="com.mxj.test.Demo"></bean> <bean id="myadvice" class="com.mxj.advice.MyAdvice"></bean><aop:config><aop:aspect ref="myadvice"><aop:pointcut expression="execution(* com.mxj.test.Demo.demo1(String,int)) and args(name,age)" id="mypoint"/><aop:before method="mybefore" pointcut-ref="mypoint" arg-names="name,age"/></aop:aspect></aop:config>

?11.使用注解配置AOP(基于Aspect)

  spring不會(huì)自動(dòng)尋找注解,必須告訴spring哪些包下類(lèi)可能有注解

  (1)引入xmlns:context

  (2)@Component

      相當(dāng)于<bean/>標(biāo)簽

      如果沒(méi)有參數(shù),把類(lèi)名首字母變小寫(xiě),相當(dāng)于<bean id=""/>

      @Component("自定義名稱")

  (3)實(shí)現(xiàn)步驟

    在spring文件中設(shè)置注解在哪些包中

<context:component-scan base-package="com.mxj.advice,com.mxj.test"></context:component-scan>    <!--
  proxy-target-classtrue:使用cglib動(dòng)態(tài)代理false:使用jdk動(dòng)態(tài)代理
--><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

    在Demo類(lèi)中添加@Componet

    在方法上添加@Pointcut("")定義切點(diǎn)

@Component public class Demo { @Pointcut("execution(* com.mxj.test.Demo.demo1())")public void demo1() throws Exception{System.out.println("demo1");} }

    在通知類(lèi)中配置

      @Component類(lèi)被spring管理

      @Aspect 相當(dāng)于<aop:aspect/>表示通知方法在當(dāng)前類(lèi)中

@Component @Aspect public class MyAdvice {@Before("com.mxj.test.Demo.demo1()")public void mybefore(){System.out.println("前置");}@After("com.mxj.test.Demo.demo1()")public void myafter(){System.out.println("后置");}@AfterThrowing("com.mxj.test.Demo.demo1()")public void mythrow(){System.out.println("異常通知");}@Around("com.mxj.test.Demo.demo1()")public Object myarround(ProceedingJoinPoint p) throws Throwable{System.out.println("環(huán)繞-前置");Object result = p.proceed();System.out.println("環(huán)繞-后置");return result;} }

?12.自動(dòng)注入

  在Spring配置文件中對(duì)象名和ref="id" id名相同使用自動(dòng)注入,可以不配置<property/>

  兩種配置方法:

  (1)在<bean>中通過(guò)autowire=""配置,只對(duì)<bean>生效

  (2)在<beans>中通過(guò)default-autowire=""配置,表示當(dāng)前文件中所有的<bean>都走全局配置

  (3)autowire=""可取值

    default:默認(rèn)值,根據(jù)全局default-autowire=""值,默認(rèn)全局和局部都沒(méi)有配置情況下,相當(dāng)于no

    no:不自動(dòng)注入

    byName:通過(guò)名稱自動(dòng)注入,在Spring容器中找類(lèi)的id

    byType:根據(jù)類(lèi)型注入

      spring容器中不可以出現(xiàn)兩個(gè)相同類(lèi)型的<bean>

    constructor:根據(jù)構(gòu)造方法注入

      提供對(duì)應(yīng)參數(shù)的構(gòu)造方法(構(gòu)造方法參數(shù)中包含注入對(duì)象)

      底層使用byName,構(gòu)造方法參數(shù)名和其他<bean>的id相同

13.Spring中加載properties文件

  (1)在src下新建xxx.properties文件

  (2)在spring配置文件中先引入xmlns:context

      如果需要記載多個(gè)文件逗號(hào)分割

<context:property-placeholder location="classpath:db.properties"/>

  (3)添加屬性文件加載,在<beans>中開(kāi)啟自動(dòng)注入需要注意的地方:

    SqlSessionFactoryBean的id不能叫做sqlSessionFactory

    修改:把原來(lái)通過(guò)ref引用替換成value賦值,自動(dòng)注入只能影響ref,不會(huì)影響value賦值

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.mxj.mapper"></property><property name="sqlSessionFactoryBeanName" value="factory"></property> </bean>

?14.Spring加載屬性文件

  在被Spring管理的類(lèi)中通過(guò)@Value("{key}")取出properties中內(nèi)容

  (1)添加注解掃描

<context:component-scan base-package="com.mxj.service.impl"></context:component-scan>

  (2)在類(lèi)中添加

    key和變量名可以不相同

    變量類(lèi)型任意,只要保證key對(duì)應(yīng)的value能轉(zhuǎn)換成這個(gè)類(lèi)型就可以

@Value("${my.demo}") private String test;

?15.scope屬性

  (1)<bean>的屬性

  (2)作用:控制對(duì)象有效范圍(單例,多例等)

  (3)<bean/>標(biāo)簽對(duì)應(yīng)的對(duì)象默認(rèn)是單例的,無(wú)論獲取多少次都是一個(gè)對(duì)象

  (4)scope可取值

    singleton:默認(rèn)值,單例

    prototype: 多例,每次獲取重新實(shí)例化

    request: 每次請(qǐng)求重新實(shí)例化

    session:每個(gè)會(huì)話對(duì)象內(nèi),對(duì)象是單例的

    application:在application對(duì)象內(nèi)是單例

    global session spring推出一個(gè)對(duì)象,依賴于spring-webmvc-portlet,類(lèi)似于session

      

轉(zhuǎn)載于:https://www.cnblogs.com/mxj961116/p/11265517.html

總結(jié)

以上是生活随笔為你收集整理的Spring Aop面向切面编程自动注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲免费视频一区二区 | 狠狠干狠狠插 | 国产乱子轮xxx农村 岛国久久久 | 成人3d动漫一区二区三区91 | 国产一区二区三区在线视频观看 | 性爱视频免费 | 国产激情视频在线 | 亚洲乱码中文字幕久久孕妇黑人 | 一级片啪啪 | 人人澡人人澡人人 | 九九九九久久久久 | 国产精品亚洲αv天堂无码 伊人性视频 | 法国空姐电影在线观看 | 天天摸天天射 | 海量av资源| 免费在线观看一区二区 | 亚洲GV成人无码久久精品 | 欧美高清性xxxx | 亚洲伦理一区二区 | 国内激情 | 毛片基地免费观看 | 国产黄色大片网站 | 亚洲天堂免费观看 | 中文字幕二区 | 久久777| 艹少妇视频 | 粉嫩av| 深夜成人福利视频 | 日本一区二区三区网站 | 在线观看精品视频 | 青青草视频免费播放 | 伊人色在线视频 | 国产免费一区二区三区在线观看 | 玖玖精品 | 色小姐综合网 | 老妇女av | 嫩色av | 日韩高清一二三区 | 老色批永久免费网站www | 三级做爰在线观看视频 | 日韩电影一区二区三区四区 | 日韩有码在线视频 | 我和岳m愉情xxxⅹ视频 | 欧美人体做爰大胆视频 | 男女被到爽流尿 | 一个色综合久久 | 波多野结衣欧美 | 成人自拍视频网站 | 久久1024 | 欧美一区二区三区小说 | 黑人巨大精品欧美一区二区免费 | 九九热精品在线视频 | 中文字幕一区二区三区手机版 | 精品国产一区二区三区四区精华 | 日韩在线不卡av | 男朋友是消防员第一季 | 国产精品久久久久久在线观看 | 99久久99久久精品国产片果冻 | 中文字幕无人区二 | 日韩欧美中文字幕精品 | 永久免费毛片 | 亲嘴扒胸摸屁股免费视频日本网站 | 落日余晖图片 | 国产精品嫩草69影院 | www.国产成人 | 国产日本在线观看 | 国产精品美女一区二区三区 | 欧美日韩一级二级 | 亚洲伦理一区 | 72种无遮挡啪啪的姿势 | 亚洲免费区 | 国产美女性生活 | 国产精品女人久久久 | 欧美黑人疯狂性受xxxxx野外 | 二区中文字幕 | 色啪视频| 69精品一区二区三区 | 久久婷婷五月国产色综合激情 | 四虎av网站 | 99国产在线观看 | 先锋资源网av | 国产又粗又猛又爽又黄的 | 中文天堂资源在线 | 操操色| 成人颜色网站 | 精品一区二区久久久久久久网站 | 亚洲国产欧美在线 | 97人妻一区二区精品免费视频 | 妖精视频污 | 日韩高清影视 | 色呦呦视频在线观看 | 色www.| 8x国产一区二区三区精品推荐 | 国产色图视频 | 邻居少妇张开双腿让我爽一夜 | 老牛影视av老牛影视av | 女女高潮h冰块play失禁百合 | 快色污| 精品国语对白 |