1. 程式人生 > >AOP-面向切面程式設計——AspectJ

AOP-面向切面程式設計——AspectJ

AOP-面向切面程式設計

——AspectJ

2016年3月23日

1 目標:在不改變原有程式的前題下,增加新的功能。

能夠為類、方法、jar包等增加新功能。

能夠為自己的程式增加新功能。

2 原理:使用aspectj代替java重新編譯和組織已有的基本功能類。

參考:Aspectj Cookbook中文版

aspectj將程式碼中的aspectj相關內容編譯為標準java程式。

使用時將編譯後的class檔案部署到相應的路徑使用。

2.1 aspectj指令碼:用於構造aspectj程式的語言,OO,類似Java。

this:使用thisJoinPoint作為aspectj中代理物件的this。由於切入點的資訊有些是靜態的(如getClass(),getSignature()等),可以使用thisJoinPoitStaticPart直接獲取。

3 流程:建立Aspectj工程,建立Java 業務,使用Apsectj擴充套件原Java業務。

3.1 安裝Aspect支援庫

下載aspectj.jar,解壓後,將lib中的jar複製到工程的lib資料夾中,將jar加入到classpath。

3.2 建立Aspectj工程:File->new->Aspectj Project。

3.3 建立Java業務:建立普通的Java應用。

//ISum.java

package lee;

public interface ISum {

      public int sum(int a,int b);

}

//Sum.java

package lee;

public class Sum implementsISum {

      publicSum() {

           super();

           // TODO Auto-generated constructor stub

           System.out.println("create a lee.Sum object.");

      }

      }

//Main.java

package lee;

public class Main {

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Sum s=new Sum();

           s.sum();

      }

}

3.4 使用Aspect擴充套件原Java業務:定義切入點,定義處理。

//TxAspect.aj

package lee;

public aspect TxAspect {

      pointcutmyPC():call(void Sum.sum());

      before():myPC(){

           System.out.println("before():myPC()");

      }

}

//結果

create a lee.Sum object.

before():myPC()

Sum.sum()

4 方法:AOP概念和配置

4.1 基本概念:aspect,pointcut,joinpoint,advice

連線點JoinPoint:原程式中具體需要被影響的函式、類、物件等位置點。

切入點pointcut:Aspectj對連線點的定義。具體指一個函式呼叫時機,可以設定多個,如servlet的url。可以在此切入點設定各種處理。

處理Advice:對切入點進行各種操作。可以在切入點之前、之後等多種時機設定處理。

引數arg-names:連線點的實參,可以在這裡指定名稱。

切面aspect:一個具體的工作流單位。其中包括切入點,各個切入點對應的處理。

4.2 AspectJ語法

4.2.1切入點定義:pointcut。

4.2.1.1  函式呼叫:pointcut 名稱(引數型別 值,…):call(許可權 返回值 方法(引數型別列表))

4.2.1.2  帶引數的函式呼叫:pointcut 名稱(引數型別 值,…):call(許可權 返回值 方法(引數型別列表))&&args(引數值列表)

pointcut myRPC(int a, intb):call(public int Sum.sum(int,int))&&args(a,b);

4.2.1.3  獲取呼叫函式時的物件:pointcut 名稱(呼叫者型別 值):call(許可權 返回值 方法(引數型別列表)) &&target(呼叫者值)

pointcut myTPC(Summ):call(void Sum.sum())&&target(m);

4.2.1.4  函式呼叫(類內部上下文):pointcut 名稱(引數型別 值,…):execution(許可權 返回值 方法(引數型別列表))

pointcutmyPCE():execution(void Sum.sum());

4.2.1.5  函式呼叫(類內部上下文)並顯示獲取this物件:pointcut 名稱(型別 值):execution(許可權 返回值 方法(引數型別列表))&&this(值)

pointcut myPCET(ISummySum):execution(void Sum.sum())&&this(mySum);

4.2.2切入點呼叫:處理advice。

4.2.2.1  呼叫前before():pointcut。

before():myPC(){…}

4.2.2.2  呼叫後after() returning(返回型別 值):pointcut。

after(int a,int b)returning(int rtn):myRPC(a,b){…}

4.2.2.3  指定呼叫時機around():必須指定返回值型別。使用proceed()呼叫原函式。around()將生成一個override函式替換原函式,因此返回值型別必須相容。

返回值型別around(引數):pointcut

int around(int a,intb):myRPC(a,b){…}

4.2.2.4  示例:before()和after()呼叫

//ISum.java

package lee;

public interface ISum {

      public int sum(int a,int b);

}

//Sum.java

package lee;

public class Sum implementsISum {

      public Sum() {

           super();

           // TODO Auto-generated constructor stub

           System.out.println("create a lee.Sum object.");

      }

      void sum(){

           System.out.println("Sum.sum()");

      }

      @Override

      public int sum(int a, int b) {

           // TODO Auto-generated method stub

           System.out.println("lee.Sum.sum(int a,int b).");

           return a+b;

      }

}

//Main.java

package lee;

public class Main {

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Sum s=new Sum();

           s.sum();

System.out.println("s.sum(3,5)="+s.sum(3,5));

      }

}

//TxAspect.aj

package lee;

public aspect TxAspect {

      pointcutmyPC():call(void Sum.sum());

      before():myPC(){

           System.out.println("before():myPC()");

      }

      after():myPC(){

           System.out.println("after():myPC()");

      }

      // arguments

      pointcutmyRPC(int a, int b):call(public int Sum.sum(int,int))&&args(a,b);

      before(inta, int b):myRPC(a,b){

           System.out.println("before(int a,intb):myRPC(a,b)");

      }

      after(inta,int b) returning(int rtn):myRPC(a,b){

           System.out.println("after(int a,int b) returning(intrtn):myRPC(a,b)="+rtn);

      }

}

//結果

create a lee.Sum object.

before():myPC()

Sum.sum()

after():myPC()

before(int a,intb):myRPC(a,b)

lee.Sum.sum(int a,int b).

after(int a,int b)returning(int rtn):myRPC(a,b)=8

s.sum(3,5)=8

4.2.2.5  示例:around()呼叫,呼叫環境訪問

//ISum.java

package lee;

public interface ISum {

      public int sum(int a,int b);

}

//Sum.java

package lee;

public class Sum implementsISum {

      public Sum() {

           super();

           // TODO Auto-generated constructor stub

           System.out.println("create a lee.Sum object.");

      }

      void sum(){

           System.out.println("Sum.sum()");

      }

      @Override

      public int sum(int a, int b) {

           // TODO Auto-generated method stub

           System.out.println("lee.Sum.sum(int a,int b).");

           return a+b;

      }

}

//Main.java

package lee;

public class Main {

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Sum s=new Sum();

           s.sum();

System.out.println("s.sum(3,5)="+s.sum(3,5));

      }

}

//TxAspect.aj

package lee;

public aspect TxAspect {

      // arguments

      pointcut myRPC(int a, int b):call(public intSum.sum(int,int))&&args(a,b);

      int around(int a,int b):myRPC(a,b){

           System.out.println("around()...0");

           int rtn=proceed(a,b);

           System.out.println("around()...1");

           return rtn+5;

      }

      //target object

      pointcutmyTPC(Sum m):call(void Sum.sum())&&target(m);

      before(Sum m):myTPC(m){

           System.out.println("before(Sum m):myTPC(m)" +m);

      }

      // class context call method

      pointcutmyPCE():execution(void Sum.sum());

      before():myPCE(){

           System.out.println("before():myPCE()=" + thisJoinPoint.getKind() + "," +thisJoinPoint.toLongString() + ","

                      +thisJoinPoint.toShortString() + "," + thisJoinPoint.toString() +"," + thisJoinPoint.getTarget() + ","

                      + thisJoinPoint.getThis());

      }

      // class context call method with this object

      pointcutmyPCET(ISum mySum):execution(void Sum.sum())&&this(mySum);

      before(ISum mySum):myPCET(mySum){

           System.out.println("before(ISummySum):myPCET(mySum)=" + thisJoinPoint.getKind() + ","

                      + thisJoinPoint.toLongString() + ","+ thisJoinPoint.toShortString() + "," + thisJoinPoint.toString()

                      + "," + thisJoinPoint.getTarget() +"," + thisJoinPoint.getThis());

           System.out.println("thisJoinPoint.getThis() ==mySum:" + (thisJoinPoint.getThis() == mySum));

      }

}

//結果

create a lee.Sum object.

before(Summ):myTPC(m)[email protected]

before():myPCE()=method-execution,execution(voidlee.Sum.sum()),execution(Sum.sum()),execution(voidlee.Sum.sum()),[email protected],[email protected]

before(ISummySum):myPCET(mySum)=method-execution,execution(voidlee.Sum.sum()),execution(Sum.sum()),execution(voidlee.Sum.sum()),[email protected],[email protected]

thisJoinPoint.getThis() ==mySum:true

Sum.sum()

around()...0

lee.Sum.sum(int a,int b).

around()...1

s.sum(3,5)=13

5 Spring和AspectJ整合。

5.1 目標:使用Spring管理Bean和AOP,抽象ApsectJ的實現。

5.2 原理:Spring將指定的bean重寫生成AspectJ指令碼。

Spring將為指定的bean提供JoinPoint引數,提供AspectJ需要的資料。

注意:Spring的AOP使用JDK動態代理的基於介面程式設計和CGLIB基於類程式設計兩種實現。預設情況下,如果有介面則使用JDK,否則使用CGLIB。

使用JDK時,不能直接轉換為類,所有的Bean獲取都是基於介面的代理類。

使用proxy-target-class="true"指定為CGLIB,預設是false。

5.3 流程:配置切入點及操作,切入點執行時自動執行相應切入點操作。

5.3.1安裝AOP支援庫:aspectj.jar,aopalliance.jar

下載aspectj.jar,解壓後,將lib中的jar複製到工程的lib資料夾中,將jar加入到classpath。

下載aopalliance.jar,複製到工程的lib資料夾中,將jar加入到classpath。

aopalliance是AOP的標準介面。

5.3.2建立目標Bean:各種進行基礎處理的Bean。

基本的Bean,執行常規操作。

//Sum.java

package lee;

public class Sum implementsISum {

      public Sum(){

           System.out.println("lee.Sum.Sum ().");

      }

      @Override

      public int sum(int a, int b) {

           // TODO Auto-generated method stub

           System.out.println("lee.Sum.sum(a,b)");

           return a+b;

      }

      public void init(){

           System.out.println("lee.Sum.init().");

      }

      public void destroy(){

           System.out.println("lee.Sum.destroy().");

      }

}

5.3.3建立切面Bean:進行切面操作的Bean。

用於執行各個切入點的操作,接收JoinPoint提供切入點資料。

//Person.java

package lee;

importorg.aspectj.lang.JoinPoint;

importorg.aspectj.lang.ProceedingJoinPoint;

public class Person {

      public Person() {

           super();

           // TODO Auto-generated constructor stub

           System.out.println("Person ().");

      }    

      public void beforeAop(JoinPoint jp){

           System.out.println("beforeaop..."+jp.getTarget());

      }

      public void afterAop(JoinPoint jp){

           System.out.println("afteraop..."+jp.getTarget());

      }

}

5.3.4配置AOP:bean.xml中配置AOP。

配置切入點和切入操作。

//bean.xml

<?xml version="1.0"encoding="UTF-8"?>

<beansxmlns="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/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd

           http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

      <bean id="person"class="lee.Person"></bean>

      <bean id="sum" name="sum1"class="lee.Sum" init-method="init"

           destroy-method="destroy">

      </bean>

      <aop:config>

           <aop:aspectref="person" id="afterAdviceAspect">

                 <aop:pointcutid="sumAop" expression="execution(* *.*(..))" />

                 <aop:beforemethod="beforeAop" pointcut-ref="sumAop" />

                 <aop:aftermethod="afterAop" pointcut-ref="sumAop" />

           </aop:aspect>

      </aop:config>

</beans>

5.4 方法:aop配置

5.4.1組織結構:根aop:config,其中包括各個aspect。

    aop:config

    -|aop:aspect:id(標識),ref(指定的aspect類)

    --|aop:pointcut:id(標識),expression(匹配型別)

--|aop:before:method(aspect類中指定的處理函式) pointcut-ref(指定切入點)

5.4.1.1  示例:匹配lee.Sum.sum()的呼叫的前置處理

      <aop:config>

           <aop:aspectid="MyAspect" ref="MyPerson">

                 <aop:pointcutexpression="execution(public void lee.Sum.sum())"id="MyRPC" />

                 <aop:beforemethod="beforeAop" pointcut-ref="MyRPC" />

           </aop:aspect>

      </aop:config>

5.4.2切面aop:aspect:需要指定標識id和處理的bean ref。

示例:<aop:aspect id="MyAspect"ref="MyPerson">

5.4.3切入點aop:pointcut:僅支援execution,可以使用萬用字元和組合表示式。

其它AspectJ切入點型別,如call,get,set等Spring暫不支援。

萬用字元*:任意數量字元。

萬用字元..:任意重複字元、任意引數、任意子包。

萬用字元+:擴充套件到子型別。

組合表示式:and,or,not(代替&&,||,!)。

引數args:只新增引數型別列表。

示例:execution(public int lee.Sum.sum(int,int)) andargs(int,int)

5.4.4處理:aop:before/after/around/after-returning/after-throwing。

5.4.4.1  around:指定整個切入點呼叫的處理。使用指定ProceedingJoinPoint作為引數。

proceed()將執行切入點呼叫。

      public Object aroundAop(ProceedingJoinPoint jp) throwsThrowable{

           System.out.println("aroundaop:before..."+jp.getTarget());

           Objectobj=jp.proceed();

           System.out.println("aroundaop:after..."+jp.getTarget());

           return obj;

      }

5.4.4.2  返回值處理:注意,需要增加一個returning指定返回值的引數名(在處理函式中使用)。

                 <aop:after-returning method="afterRet"pointcut-ref="sumAop"

                      returning="ret" />

      public void afterRet(JoinPoint jp,Object ret){

           System.out.println("afterRetaop..."+jp.getTarget()+"="+ret);

      }

5.4.4.3  異常處理:注意,需要增加一個throwing指定丟擲的異常引數名(在處理函式中使用)。

                 <aop:after-throwingmethod="afterThrowing"

                      pointcut-ref="sumAop" throwing="ex"/>

      public void afterThrowing(JoinPoint jp,Throwable ex) throws Throwable{

           System.out.println("throwingaop..."+jp.getTarget()+"="+ex.getMessage());

      }

5.5 方法:aop自動管理事務

5.6 示例

5.6.1示例:AOP控制不帶引數切入點和帶引數切入點,before,after,around

//Sum.java

package lee;

public class Sum{

      public Sum() {

           super();

           // TODO Auto-generated constructor stub

           System.out.println("create a lee.Sum object.");

      }

      public void sum(){

           System.out.println("lee.Sum.sum().");

      }

//    @Override

      public int sum(int a, int b) {

           // TODO Auto-generated method stub

           System.out.println("lee.Sum.sum(int a,int b).");

           return a+b;

      }

}

//Person.java

package lee;

importorg.aspectj.lang.JoinPoint;

public class Person {

      publicvoid beforeAop(JoinPoint jp){

           System.out.println("beforeAop:"+"sig="+jp.getSignature()+",args="+jp.getArgs()+",target="+jp.getTarget());

      }

      publicvoid afterAop(JoinPoint jp){

           System.out.println("afterAop:"+"sig="+jp.getSignature()+",args=["+jp.getArgs()[0]+","+jp.getArgs()[1]+"],target="+jp.getTarget());

      }

      public intaroundAop(ProceedingJoinPoint jp) throws Throwable{                                  System.out.println("aroundAop...0:"+"sig="+jp.getSignature()+",args=["+jp.getArgs()[0]+","+jp.getArgs()[1]+"],target="+jp.getTarget()+",sourceloc="+jp.getSourceLocation());

           int rtn=(int) jp.proceed();

           System.out.println("aroundAop...1:"+rtn);

           return 13;

      }

}

//beans.xml

<?xmlversion="1.0" encoding="UTF-8"?>

<beansxmlns="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/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd

           http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

      <bean id="MySum" name="sum"class="lee.Sum" scope="prototype"></bean>

      <bean id="MyPerson" name="person"class="lee.Person" scope="prototype"></bean>

      <aop:config proxy-target-class="true">

           <aop:aspect id="MyAspect"ref="MyPerson">

                 <aop:pointcutexpression="execution(public void lee.Sum.sum())" id="MyPC"/>

                 <aop:beforemethod="beforeAop" pointcut-ref="MyPC" />

                 <aop:pointcutexpression="execution(public int lee.Sum.sum(int,int)) andargs(int,int)" id="MyAPC" />

                 <aop:aftermethod="afterAop" pointcut-ref="MyAPC" />

<aop:around method="aroundAop"pointcut-ref="MyAPC" />

           </aop:aspect>

      </aop:config>

</beans>

//Main.java

package lee;

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           ApplicationContext ctx=newClassPathXmlApplicationContext("beans.xml");

           Sum sum=(Sum)(ctx.getBean("MySum"));

           sum.sum();

           System.out.println("1+2="+sum.sum(1,2));

      }

}

//結果

create a lee.Sum object.

create a lee.Sum object.

beforeAop:sig=voidlee.Sum.sum(),args=[Ljava.lang.Object;@436daf20,[email protected]

lee.Sum.sum().

aroundAop...0:sig=intlee.Sum.sum(int,int),args=[1,2],[email protected],sourceloc=org.springframework.aop[email protected]51b30472

lee.Sum.sum(int a,int b).

aroundAop...1:3

afterAop:sig=intlee.Sum.sum(int,int),args=[1,2],[email protected]

1+2=13

5.6.2示例:AOP控制基本Bean的流程

//bean.xml

<?xmlversion="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/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsd

           http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

      <bean id="person" class="lee.Person">

      </bean>

      <bean id="sum" name="sum1"class="lee.Sum" init-method="init"

           destroy-method="destroy">

      </bean>

      <aop:config>

           <aop:aspect ref="person"id="afterAdviceAspect">

                 <aop:pointcut id="sumAop"expression="execution(* *.*(..))" />

                 <aop:before method="beforeAop"

                      pointcut="execution(int lee.Sum.sum(..));args(int,int)" />

                 <aop:after method="afterAop"pointcut-ref="sumAop" />

                 <aop:aroundmethod="aroundAop" pointcut-ref="sumAop" />

                 <aop:after-returningmethod="afterRet" pointcut-ref="sumAop"

                      returning="ret" />

                 <aop:after-throwingmethod="afterThrowing"

                      pointcut-ref="sumAop"throwing="ex" />

           </aop:aspect>

      </aop:config>

</beans>

//Person.java

package lee;

importorg.aspectj.lang.JoinPoint;

importorg.aspectj.lang.ProceedingJoinPoint;

public class Person {

      public Person() {

           super();

           // TODO Auto-generated constructor stub

           System.out.println("Person ().");

      }

      public ICalc createCalc(String msg) {

           System.out.println("createCalc="+msg);

           if (msg.equals("sum2")) {

                 System.out.println("createCalc=createsum2");

                 return new Calc(new Sum2());

           } else {

                 System.out.println("createCalc=createsum");

                 return new Calc(new Sum());

           }

      }

      public void beforeAop(JoinPoint jp){

           System.out.println("beforeaop..."+jp.getTarget()+"="+jp.getArgs().length+",0="+jp.getArgs()[0]);

      }

      public void afterAop(JoinPoint jp){

           System.out.println("afteraop..."+jp.getTarget());

      }

      public Object aroundAop(ProceedingJoinPoint jp) throwsThrowable{

           System.out.println("aroundaop:before..."+jp.getTarget());

           Object obj=jp.proceed();

           System.out.println("aroundaop:after..."+jp.getTarget());

           return obj;

      }

      public void afterThrowing(JoinPoint jp,Throwable ex) throwsThrowable{

           System.out.println("throwingaop..."+jp.getTarget()+"="+ex.getMessage());

      }

      public void afterRet(JoinPoint jp,Object ret){

           System.out.println("afterRetaop..."+jp.getTarget()+"="+ret);

      }

}

//ISum.java

package lee;

public interface ISum {

      public int sum(int a,int b);

}

//Sum.java

package lee;

public class Sum implementsISum {

      public Sum(){

           System.out.println("lee.Sum.Sum ().");

      }

      @Override

      public int sum(int a, int b) {

           // TODO Auto-generated method stub

           System.out.println("lee.Sum.sum(a,b)");

           return a+b;

      }

      public void init(){

           System.out.println("lee.Sum.init().");

      }

      public void destroy(){

           System.out.println("lee.Sum.destroy().");

      }

}

//Hello.java

package lee;

import java.io.IOException;

import java.io.PrintWriter;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.support.ClassPathXmlApplicationContext;

public class Hello extendsHttpServlet {

      protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

           // TODO Auto-generated method stub

       System.out.println("Hello,Servlet!");//write to server

        //write to client

      response.setContentType("text/html");

           PrintWriter pw=response.getWriter();

           pw.println("<h1>Hello,I amServlet.</h1>");

           //spring

           ApplicationContext ctx=newClassPathXmlApplicationContext("bean.xml");

           ISum sum=ctx.getBean("sum",ISum.class);

           System.out.print("1+2="+sum.sum(1, 2));

           pw.println("<h1>Spring="+sum.sum(1,2)+"</h1>");

           ((ClassPathXmlApplicationContext)ctx).close();

      }

}

相關推薦

AOP-面向切面程式設計——AspectJ

AOP-面向切面程式設計 ——AspectJ 2016年3月23日 1 目標:在不改變原有程式的前題下,增加新的功能。 能夠為類、方法、jar包等增加新功能。 能夠為自己的程式增加新功能。 2 原理:使用aspectj代替java重新編譯和組織已有的基本功能類。 參考:

Spring AOP面向切面程式設計詳解(基於XML方式 註解方式 注入Aspectj方式)

前言 AOP即面向切面程式設計,是一種程式設計思想,OOP的延續。在程式開發中主要用來解決一些系統層面上的問題,比如日誌,事務,許可權等等。在閱讀本文前希望您已經對Spring有一定的瞭解 注:在能對程式碼進行添加註解方式實現AOP的話,並不推薦使用XML方

AspectJ教程--AOP面向切面程式設計框架(Android)

AOP的概念很久前就接觸過了,不過沒有真正寫過專案,甚至Demo都沒有,今天把這點缺陷補上。 推薦兩篇文章(本文部分圖片引自這兩篇文章): 1. 【翻譯】Android中的AOP程式設計 2. 【深入理解Android之AOP】

3.AOP面向切面程式設計

1. 首先我要控制事務,要想控制事務就得使用一個connection 所以只能提取出來connection 所以注重物件的注入 這個重點就是怎麼注入的問題? 重點:加強聯絡 IOC 2. 1.怎麼踢掉重複程式碼? 2.動態代理!AOP 作用就是在

Spring Boot實戰系列(3)AOP面向切面程式設計

AOP是一種與語言無關的程式思想、程式設計正規化。專案業務邏輯中,將通用的模組以水平切割的方式進行分離統一處理,常用於日誌、許可權控制、異常處理等業務中。 快速導航 引入AOP依賴 AOP常用註解解析 實現日誌分割功能 @Pointcut 新增切入點 @Be

第二天 : AOP 面向切面程式設計 、 JdbcTemplete 工具類使用

AOP 面向切面程式設計 、 JdbcTemplete 工具類使用 目錄 一、 什麼是 AOP ***** 二、 AOP 的底層實現 1、 JDK動態代理 2、 使用CGlib 完成動態代理 三、 Spring AOP 1、 傳統Spring AOP 提供

Spring之註解實現aop(面向切面程式設計)

1:Aop(aspect object programming)面向切面程式設計,名詞解釋:     1.1:功能:讓關注點程式碼與業務邏輯程式碼分離     1.2:關注點       

Spring(2)之 (AOP 面向切面程式設計)(AOP目錄)

Spring Core: Spring的核心功能即IOC容器,解決物件的建立及物件之間的依賴關係 Spring WEB: Spring對WEB模組的支援 Spring AOP: 面向切面程式設計 AOP的概述 AOP的底層實現 Spring AOP開發

從原始碼入手,一文帶你讀懂Spring AOP面向切面程式設計

基於這兩者的實現上,這次來探索下Spring的AOP原理。雖然AOP是基於Spring容器和動態代理,但不瞭解這兩者原理也絲毫不影響理解AOP的原理實現,因為大家起碼都會用。 AOP,Aspect Oriented Programming,面向切面程式設計。在很多

瞭解AOP(面向切面程式設計)與OOP(面向物件程式設計

AOP,他是一種思想,是OOP的延展。 1, 說OOP就來說下之前的OPP,最早開始的程式,一個函式(方法)或者說是功能做一個事情,這種思想劃分的是一個功能一個功能的來組合解決問題。 後來人們發現,功能解決問題是解決了,但是功能太多了,人腦實在是有限,

spring aop(面向切面程式設計)

aop分為兩種,一種是靜態代理(不常用),另一種是動態代理  。 靜態代理的優點,及缺點: 優點:代理是客戶端不需要知道實現類是什麼,怎麼做的,客戶只需要知道代理就可以了。缺點:代理類和委託類都實現了相同的介面,代理類通過委託類實現了相同的方法,這樣就出現了大量的程式碼重

Spring AOP面向切面程式設計:理解篇(一看就明白)

一、到底什麼是AOP(面向切面程式設計)? 無論在學習或者面試的時候,大家都會張口說spring的特性AOP和IOC(控制反轉咱們下一篇講),有些大神理解的很到位,但是對於大多數初中級工程師來講還是模糊階段,但是為什麼會有AOP這種技術呢?傻瓜都知道:為了開發者的方便!

Spring詳解篇之 AOP面向切面程式設計

Aop(aspect oriented programming面向切面程式設計),是spring框架的另一個特徵。AOP包括切面、連線點、通知(advice)、切入點(pointCut) 。 1.aop幾個概念: 橫切關注點: 對哪些方面進行攔截,攔截後怎麼處理。 切面

AOP面向切面程式設計的應用

前兩年看書的時候,瞭解到了面向切面程式設計方法(AOP)。對這個技術印象最深刻的特點就是可以實現業務邏輯和許可權、異常處理等的分離。正好在做專案的時候,有些場景可以借鑑這個思想,於是在專案中借用開源的.net環境的KingAOP實現了選單按鈕許可權控制、上下游

Java框架之Spring AOP 面向切面程式設計 有哪幾種實現方式?如何選擇適合的AOP實現方式?

文章目錄 1. 實現方式 2. JDK動態代理如何實現? 2.1 主要的實現過程 3. 如何選擇? 1. 實現方式 JDK 動態代理實現和 cglib 實現 2. JDK

Spring Boot之AOP面向切面程式設計-實戰篇

目錄 前言 程式設計正規化主要有以下幾類 引入pom依賴 aop註解 實現日誌分割功能 前言 AOP是一種與語言無關的程式思想、程式設計正規化。專案業務邏輯中,將通用的模組以水平切割的方式進行分離統一處理,常用於日誌、許可權控制、異常處理等業務中。 程式設計正規化主

Spring AOP面向切面程式設計之日誌記錄

實際專案中我們往往需要將一些重要的操作,以日誌的形式進行儲存,當機器宕機的時候,可以通過查詢日誌,定位出錯位置,方便恢復。 1:首先匯入spring支援的AOP架包 2:編寫將要進行切面工作的類 /** * */ package com.zhiyou100.aspect; i

Spring框架之AOP面向切面程式設計

package com.jredu.aop.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; im

從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面程式設計淺解析:簡單日誌記錄 + 服務切面快取

  今天的講解就到了這裡了,通過這兩個小栗子,大家應該能對面向切面程式設計有一些朦朧的感覺了吧

core學習歷程五 從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面程式設計淺解析:簡單日誌記錄 + 服務切面快取 從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定義篩選,Redis入門 11.1

繼續學習 “老張的哲學”博主的系列教程,感謝大神們的無私分享 從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面程式設計淺解析:簡單日誌記錄 + 服務切面快取 說是朦朧,,emmm,對我來說是迷糊哈。上半段正常,下半段有點難理解,操作是沒問題。多看幾遍再消