SpringAOP之动态代理
一、动态代理:
1.在原有的静态代理的基础上进一步的完善,由于静态代理中,重复写了相同的代码使得代码的整体结构显得冗余,而且还不同的核心类还需要有不用的代理类,是写死了的具体的类。所以需要使用动态代理来代替静态代理。
2.具体实例:
⑴、业务介绍:
假定高三学生为核心类,学生的家人是代理类。高三学生需要做的核心业务有:在家学习(studyAtHome)、在学校学习(studyAtHome);家人需要做的非核心业务为:准备饭菜(买、洗、炒、煮饭)。准备补品(购买、熬制、加佐料)。
⑵、创建一个高三学生接口:G3Student
package aop_002; //首先定义一个接口,用来高三学生来是实现,
//在这个接口中声明一个在家学习和一个在学校学习的方法
public interface G3Student { public void studyAtHome(String core);
public void studyAtSchool(String core); }
⑶、创建一个高三学生(G3Student_boy),实现高三学生接口(G3Student),这个高三学生的类就是核心类。
package aop_002; /*
* 本例演示的是动态代理
*/ //定义一个高三学生的类(目标对象、核心对象、target对象),实现了高三学生的接口。
public class G3Student_boy implements G3Student { //高三学生 的第一个业务流程:在家学习
public void studyAtHome(String core) { //核心的事情是在家学习。
System.out.println(core+"在HOME学习"); } //高三学生 的第二个业务流程:在学校学习
public void studyAtSchool(String core) {
//核心的事情是在家学习。
System.out.println(core+"在SCHOOOL学习");
} }
⑷、创建一个高三学生的代理类(G3Student_handler),并且实现了InvocationHandler接口
package aop_002; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class G3Student_handler implements InvocationHandler { private Object g3Stu; public G3Student_handler(Object g3Stu) { this.g3Stu = g3Stu;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用代理的在核心对象处理核心业务之前的方法
before(); //核心对象的核心方法
Object returnValue = method.invoke(g3Stu, args); //调用代理的在核心对象处理核心业务之后的方法
after(); return returnValue;
} private void before(){ //这个是代理(G3Student_handler)准备饭菜的需要做的流程:
System.out.println("代理:准备买菜");
System.out.println("代理:准备洗菜");
System.out.println("代理:准备炒菜");
System.out.println("代理:准备煮饭");
System.out.println("-----------------"); } private void after(){ //这个是代理(G3Student_handler)准备补品的需要做的流程:
System.out.println("-----------------");
System.out.println("代理 :购买补品");
System.out.println("代理 :熬制部品");
System.out.println("代理 :加入佐料");
System.out.println(); } }
①、其中,和静态代理不同的是,动态代理的代理类中定义了一个以Object类型的属性,而静态代理定义的是具体的G3Student的接口类型的属性。所以,动态代理这样定义保证了,这个代理可以带不同的个核心类如:G3Student_boy、G3Student_girl。
②、这句代码意思:自动调用传入的核心类对象(G3Student_boy)的方法,并且传入参数args,返回一个Object类型的值。具体是调用什么方法,传入什么参数,都不需要我们具体关注,只需写上这条代码,并且把返回值返回即可。
⑸、创建一个测试类Test:
package aop_002; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { G3Student boy = new G3Student_boy(); InvocationHandler handler1 = new G3Student_handler(boy);
G3Student g3boy = (G3Student)Proxy.newProxyInstance(boy.getClass().getClassLoader(), boy.getClass().getInterfaces(),handler1); g3boy.studyAtSchool("小明");
g3boy.studyAtHome("小明"); } }
①、首先,需要创建一个高三学生对象,其次需要创建一个代理类对象,最后使用Proxy创建一个高三学生对象,再调用方法即可。
②、可能有的人会问,为什么不直接使用第一次创建的高三学生对象直接调用方法呢?如果使用第一次创建的高三学生对象直接调用方法,那么就没有代理做的事情显示,所以应该时候用Proxy创建的高三学生对象,Proxy等于是高三学生对象和代理对象进行一次整合,使它们两个有机结合在一起,各自做各自的事情。
测试结果:
谢谢浏览!
SpringAOP之动态代理的更多相关文章
- SpringAOP ApectJ 动态代理
参考链接:https://docs.spring.io/spring/docs/4.3.13.RELEASE/spring-framework-reference/htmlsingle/#aop ht ...
- xml文件的方式实现动态代理基于SpringAOP
1.配置spring容器 导入jar包 com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.j ...
- spring---aop(4)---Spring AOP的CGLIB动态代理
写在前面 前面介绍了Spring AOP的JDK动态代理的过程,这一篇文章就要介绍下Spring AOP的Cglib代理过程. CGLib全称为Code Generation Library,是一个强 ...
- spring---aop(2)---Spring AOP的JDK动态代理
写在前面 spring 事务是springAOP 的一个实现.我们以分析spring的事务,来分析spring的AOP实现. 基本知识 如果目标方法被spring的事务声明,则执行该目标方法的对象就会 ...
- Java Spring-AOP中的动态代理
2017-11-10 16:17:12 AOP中有两种代理方式,分别是JDK的动态代理和CGLib的动态代理. JDK的动态代理 Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创 ...
- spring-AOP动态代理,以及aspectJ的xml配置或注解配置方法,各个拦截器的使用顺序
package com.itheima.aspect; public class MyAspect { public void check_Permissions(){ System.out.prin ...
- SpringAOP用到了什么代理,以及动态代理与静态代理的区别
spring aop (面向切面)常用于数据库事务中,使用了2种代理. jdk动态代理:对实现了接口的类生成代理对象.要使用jdk动态代理,要求类必须要实现接口. cglib代理:对类生成代理对象. ...
- Spring-AOP动态代理技术(底层代码)
1.JDK代理:基于接口的动态代理技术 目标对象必须有接口,目标对象有什么方法,目标接口就有什么方法, 运行期间基于接口动态生成代理对象,所以代理对象也就有目标对象同样的方法. 注意:以下代码只是底层 ...
- [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- CodeForces336 A & B
第一题就是排序然后计算一下时间.没什么 package codeforces336; import java.io.InputStreamReader; import java.util.Scanne ...
- 解决svn uuid变更问题
简介: 今天在snv根目录下重新定位上传的url,更改后出现如下错误 .可以看到,原来Repository创建者的uuid是前者,而现在我操作的是后者的uuid.因此,目前的操作办法是 使用相关命令更 ...
- 深入探索RB-tree数据结构
引子 部门在各个团队推广软件通用技能矩阵工具,希望通过度量找到能力薄弱点,引导团队进行改进.从我们团队的数据上看,团队在数据结构和算法上的短板明显,需要加强,这也是写这篇文章的背后的初衷. 数据结构和 ...
- UTC时间和本地时间的区别
在用AS3的Date时,年月日都有两个api,带UTC和不带UTC的,比如fullYear,fullYearUTC 输出看一下: var date:Date = new Date; trace(dat ...
- css3复杂选择器+内容生成+Css Hack
1.复杂选择器2.内容生成3.多列4.CSS Hack(浏览器兼容性)=======================================1.复杂选择器 1.兄弟选择器 1.特点: 1.通过 ...
- Python 爬虫3——第一个爬虫脚本的创建
在进行真正的爬虫工程创建之前,我们先要明确我们所要操作的对象是什么?完成所有操作之后要获取到的数据或信息是什么? 首先是第一个问题:操作对象,爬虫全称是网络爬虫,顾名思义,它所操作的对象当然就是网页, ...
- 2014 summer training总结篇
还有一周暑期集训就要结束了,从7月份结束军训到现在一个多月的时间,收获也是有的只不过与之前预想的相比显得十分微薄. 无论是前两天的两场个人赛还是之前的组队赛自己始终是在ranklist的后半部分.一开 ...
- git学习笔记一
一.概念理解 1.理解工作区和暂存区以及版本库 工作区我理解就是我们创建的程序所在的文件夹,比如test文件夹.其中有个.git文件,这个就是版本库,其中版本库中有个区域叫暂存区或叫索引. 截自廖雪峰 ...
- linux下Vim的使用
在vim中移动光标跟其他的编辑器中有很大的区别,不过一旦学会了,就会飞速的在文本中移动 复制粘贴dd 删除光标所在行dw 删除一个字(word)x 删除当前字符X 删除前一个字符D 删除到行末yy 复 ...
- 模拟Post登陆带验证码的网站
前言: 作者在一个项目需求 模拟用户登陆,获取该用户的订单记录. 该系统需要用户名,密码,验证码 (验证码为正楷的数字4位),于是参考网络一些文章,并进行了很多测试,总结步骤如下: 步骤1 : 通过h ...