<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
IOC:控制反轉,把物件建立和物件之間的呼叫過程,交給Spring進行管理。使用IOC的目的是為了降低耦合度。
AOP:面向切面程式設計,通過預編譯方式和執行期間動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。AOP的底層實現是基於動態代理(實現方式是當切入介面時,使用JDK原生動態代理;當切入普通方法時,使用cglib動態代理)。
隨著業務的不斷擴充套件:
(1)紀錄檔功能:如果紀錄檔程式碼修改,需要修改多處。
(2)校驗功能:如果多處需要校驗,需要修改多處。
這時就需要使用動態代理來解決問題,動態代理的實現方式有兩種:
[1]JDK原生動態代理:缺點是必須基於介面完成
[2]cglib動態代理:他可以不用基於介面完成
public interface MathService { //+ public Double add(double a,double b); //- public Double sub(double a,double b); //* public Double mul(double a,double b); /// public Double div(double a,double b); }
public class MathServiceImpl implements MathService{ @Override public Double add(double a, double b) { Double result=a+b; return result; } @Override public Double sub(double a, double b) { Double result=a-b; return result; } @Override public Double mul(double a, double b) { Double result=a*b; return result; } @Override public Double div(double a, double b) { Double result=a/b; return result; } }
public class ProxyFactory { //被代理物件 private Object target; public ProxyFactory(Object target) { this.target = target; } //獲取代理物件 public Object getProxy(){ /** * ClassLoader loader, 被代理物件的類載入器 * Class<?>[] interfaces, 被代理物件實現的介面 * InvocationHandler h: 當代理物件執行被代理的方法時,會觸發該物件中的invoke功能 */ ClassLoader loader=target.getClass().getClassLoader(); Class<?>[] interfaces=target.getClass().getInterfaces(); InvocationHandler h=new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //可以加上需要的非業務程式碼 //method.getName()獲取方法名 // Arrays.asList(args)獲取輸入值 System.out.println("this is "+method.getName()+" method begin with"+ Arrays.asList(args)); //method:表示代理物件要代理的方法 //invoke:回撥該函數 //args:方法需要的引數 Object result = method.invoke(target, args);//代理物件回撥該方法 return result; } }; //先寫此處方法,才可找到上述三個方法填寫方式 Object o = Proxy.newProxyInstance(loader, interfaces, h); return o; } }
public class Test01 { public static void main(String[] args) { MathServiceImpl target=new MathServiceImpl(); ProxyFactory proxyFactory=new ProxyFactory(target); MathService proxy = (MathService) proxyFactory.getProxy(); Double add = proxy.add(15.0, 5.0); System.out.println(add); } }
public class MathServiceImpl{ public Double add(double a, double b) { Double result=a+b; return result; } public Double sub(double a, double b) { Double result=a-b; return result; } public Double mul(double a, double b) { Double result=a*b; return result; } public Double div(double a, double b) { Double result=a/b; return result; } }
注意:
(1)引入cglib的jar包.
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.5</version>
</dependency>
(2)建立一個代理類工廠並實現介面MethodInterceptor
public class ProxyFactory implements MethodInterceptor { private Object target; public ProxyFactory(Object target) { this.target = target; } //獲取代理物件 public Object getProxy(){ Enhancer enhancer=new Enhancer(); //指定被代理物件的父類別 enhancer.setSuperclass(target.getClass()); //指定回撥類 enhancer.setCallback(this); //建立代理物件 return enhancer.create(); } //當代理物件執行代理方法時觸發的方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // System.out.println("before++++++++++++++++++++"); // Object result = method.invoke(target, args); //可以加上需要的非業務程式碼 //method.getName()獲取方法名 // Arrays.asList(args)獲取輸入值 System.out.println("this is "+method.getName()+" method begin with"+ Arrays.asList(args)); //method:表示代理物件要代理的方法 //invoke:回撥該函數 //args:方法需要的引數 Object result = method.invoke(target, args);//代理物件回撥該方法 return result; } }
public class Test01 { public static void main(String[] args) { MathServiceImpl target=new MathServiceImpl(); ProxyFactory proxyFactory=new ProxyFactory(target); MathServiceImpl proxy = (MathServiceImpl) proxyFactory.getProxy(); Double add = proxy.add(1, 2); System.out.println(add); } }
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.15.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.2.15.RELEASE</version> </dependency>
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--包掃描--> <context:component-scan base-package="com.qy151wd.proxy.proxy.aop"/> <!--開啟aop註解--> <aop:aspectj-autoproxy/> </beans>
public interface MathService { public Double add(double a, double b); public Double sub(double a, double b); public Double mul(double a, double b); public Double div(double a, double b); }
@Service public class MathServiceImpl implements MathService { @Override public Double add(double a, double b) { Double result=a+b; return result; } @Override public Double sub(double a, double b) { Double result=a-b; return result; } @Override public Double mul(double a, double b) { Double result=a*b; return result; } @Override public Double div(double a, double b) { Double result=a/b; return result; } }
@Service //若是使用@component也可以 @Aspect //表示該類為切面類 public class LogAspect { //任意返回型別 aop包下的所有類都有切面紀錄檔 使用萬用字元 //第一個*:修飾符和返回值型別 //第二個*:所有類 //第三個*:所有方法 @Before("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))") public void before(){ System.out.println("方法執行前的紀錄檔"); } @After("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))") //總會被執行,不管有沒有異常 public void after(){ System.out.println("方法執行後的紀錄檔"); } @AfterReturning("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")//只有碰到return後才會執行 public void afterReturning(){ System.out.println("碰到return後執行"); } @AfterThrowing("execution(* com.qy151wd.proxy.proxy.aop.*.*(..))")//異常通知 public void afterThrowing(){ System.out.println("出現異常了"); } }
public class Test01 { public static void main(String[] args) { //從spring容器中獲取 ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml"); MathService mathService = (MathService) app.getBean("mathServiceImpl"); Double add = mathService.add(10, 5); System.out.println(add); } }
到此這篇關於Java AOP動態代理詳細介紹的文章就介紹到這了,更多相關Java AOP動態代理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45