1、AOP:html
補充:spring
使用Spring AOP,要成功運行起代碼,只用Spring提供給開發者的jar包是不夠的,須要額外上網下載兩個jar包:app
一、aopalliance.jar測試
二、aspectjweaver.jarthis
網上看到一個寫的很好的博客,博文地址:http://www.cnblogs.com/xrq730/p/4919025.html;代理
2、AOP核心概念xml
一、橫切關注點htm
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之爲橫切關注點對象
二、切面(aspect)blog
類是對物體特徵的抽象,切面就是對橫切關注點的抽象
三、鏈接點(joinpoint)
被攔截到的點,由於Spring只支持方法類型的鏈接點,因此在Spring中鏈接點指的就是被攔截到的方法,實際上鍊接點還能夠是字段或者構造器
四、切入點(pointcut)
對鏈接點進行攔截的定義
五、通知(advice)
所謂通知指的就是指攔截到鏈接點以後要執行的代碼,通知分爲前置、後置、異常、最終、環繞通知五類
六、目標對象
代理的目標對象
七、織入(weave)
將切面應用到目標對象並致使代理對象建立的過程
八、引入(introduction)
在不修改代碼的前提下,引入能夠在運行期爲類動態地添加一些方法或字段。
3、代碼演示:
一、 準備bean:
package cn.lsp.bean; /** * @author lisp * @ClassName TestBean * @Date 2019/5/22 12:18 */ public class TestBean { private String testStr = "testStr"; public String getTestStr() { return testStr; } public void setTestStr(String testStr) { this.testStr = testStr; } public void test() { System.out.println("test"); } }
二、切面類
package cn.lsp.bean; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * @author lisp * @ClassName AspectJTest * @Date 2019/5/22 12:20 */ @Aspect public class AspectJTest { @Pointcut("execution(* *.test(..))") public void test(){ } @Before("test()") public void beforeTest(){ System.out.println("beforeTest"); } @After("test()") public void afterTest(){ System.out.println("afterTest"); } @Around("test()") public Object arountTest(ProceedingJoinPoint p) { System.out.println("before1"); Object object = null; try { object = p.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } System.out.println("after1"); return object; } }
三、配置文件 application-context.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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- spring 是否支持註解的 AOP 是由一個配置文件控制的,也就是 <aop:aspectj-autoproxy/> 當配置文件中聲明瞭這句配置的時候 spring就會支持註解的 AOP (解析 AOP 的源碼能夠從這切入) --> <aop:aspectj-autoproxy/> <bean id="test" class="cn.lsp.bean.TestBean"/> <bean class="cn.lsp.bean.AspectJTest"/> </beans>
四、啓動測試類
package cn.lsp.bean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author lisp * @ClassName AspecTest * @Date 2019/5/23 8:55 */ public class AspecTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml"); TestBean testBean = (TestBean) applicationContext.getBean("test"); testBean.test(); } }