Spring AOP(1),静态代理
来源:互联网 发布:赵薇资本控制舆论知乎 编辑:程序博客网 时间:2024/05/22 07:58
Spring的核心之一AOP,面向切面的编程和OOP相比较,优势在与AOP是对程序的横向的增强。
把程序比方成一个圆柱,AOP则是能横向把程序切开,再把自己无缝的织入,实现程序的横向增强。而OOP对程序的增强则需要以继承的方式,是把程序整体增强,AOP则只需要针对某一个点,对切入点进行增强。
Spring实现AOP是以代理的方式实现的,下面以两个例子,来讲解静态代理和动态代理。
静态代理,的原理是,面向接口的,代理对象,必须包含真实对象的引用,在执行真实对象的时候实现增强例如
定义一个借口
package com.yc.biz;public interface ProductBiz { public void addProduct();}
实现一个真实类
package com.yc.biz.impl;import com.yc.biz.ProductBiz;public class ProductBizImpl implements ProductBiz { public void addProduct() { System.out.println("**********************************"); System.out.println("添加产品"); System.out.println("**********************************"); }}
这一步是关键,建立代理类,上文提到了,代理类必须有真实类的引用如下
package com.yc.biz.impl;import com.yc.biz.ProductBiz;public class ProductBizRightProxy implements ProductBiz { //代理类中必须有真实对象的引用 **private ProductBiz productBiz;** **public ProductBizRightProxy(ProductBiz productBiz) { this.productBiz = productBiz; }** public void addProduct() { check(); productBiz.addProduct(); } //增强功能 private void check(){ System.out.println("权限"); System.out.println("*****************************"); }}
测试代码
import com.yc.biz.ProductBiz;import com.yc.biz.impl.ProductBizImpl;import com.yc.biz.impl.ProductBizLogProxy;import com.yc.biz.impl.ProductBizRightProxy;public class Test1 { public static void main(String[] args) { ProductBiz pb=new ProductBizImpl(); pb.addProduct(); ProductBiz pbl=new ProductBizRightProxy(pb); pbl.addProduct();}执行的结果是**********************************添加产品**********************************权限***************************************************************添加产品**********************************
其中,执行代理类的时候就执行了真实类,同时执行了check()方法,即对真实类,进行了check()的增强。
由于是面向接口的,在传递引用时,可以把代理类也看作真实类,传递过去,就实现了多功能增强
这是一个日志代理
package com.yc.biz.impl;import com.yc.biz.ProductBiz;public class ProductBizLogProxy implements ProductBiz { //代理类中必须有真实对象的引用 private ProductBiz productBiz; public ProductBizLogProxy(ProductBiz productBiz) { this.productBiz = productBiz; } public void addProduct() { productBiz.addProduct(); log(); } public void log(){ System.out.println("日志功能"); }}
测试
package com.yc.test;import com.yc.biz.ProductBiz;import com.yc.biz.impl.ProductBizImpl;import com.yc.biz.impl.ProductBizLogProxy;import com.yc.biz.impl.ProductBizRightProxy;public class Test1 { public static void main(String[] args) { ProductBiz pbl=new ProductBizLogProxy(new ProductBizImpl()); ProductBiz pb=new ProductBizRightProxy(pbl); pb.addProduct(); }}执行结果:权限***************************************************************添加产品**********************************日志功能
可以看出来,实现了权限和日志的两项增强功能
0 0
- Spring AOP(1),静态代理
- 【spring 3】AOP:静态代理
- Spring(AOP静态代理)
- Spring AOP 静态代理与动态代理
- spring AOP 静态代理和动态代理
- Spring AOP 学习之静态代理
- Spring模拟aop静态代理案例<一>
- spring 源码探索-- 静态AOP代理
- spring-aop入门之静态代理模式
- spring aop学习5:jdk静态代理
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- 动态代理和静态代理以及spring的aop
- jdk 静态代理、动态代理、cglib、spring AOP
- spring aop proxy 静态代理和动态代理
- 动态代理和静态代理以及spring的aop
- web学习笔记19-静态代理,动态代理,spring AOP
- Spring -AOP -java静态代理和动态代理实例
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
- 听课练习(五)
- 简单的抓包演示程序
- java自定义注解的方式连接MySQL数据库来走进注解
- 广告计划
- volatile关键字
- Spring AOP(1),静态代理
- Java线程:新特征-线程池
- (15.1.11)英语听力之短对话
- 我是如何向老婆解释MapReduce的?
- xcode工程添加预定义编译宏
- JAVA之编码/解码-文件输入输出流——转载
- 不要62
- maven依赖学习
- JAVA新特征