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,對我來說是迷糊哈。上半段正常,下半段有點難理解,操作是沒問題。多看幾遍再消