String Aop 动态代理例子
动态代理原理:spring AOP采用动态代理来实现
(1)定义一个接口Boy
package aop001; public interface Boy {
public void beat(String time); public void play(String time);
}
(2)定义两个类实现Boy接口:
Boy_1
package aop001; public class Boy_1 implements Boy { @Override
public void beat(String time) {
System.out.println("我是boy1");
System.out.println(time+"敲代码");
} @Override
public void play(String time) {
System.out.println("我是boy1");
System.out.println(time+"玩游戏");
} }
Boy_2
package aop001; public class Boy_2 implements Boy{ @Override
public void beat(String time) {
System.out.println("我是boy2");
System.out.println(time+"敲代码");
} @Override
public void play(String time) {
System.out.println("我是boy2");
System.out.println(time+"玩游戏");
} }
(3)定义一个动态代理类并实现InvocationHandler接口
package aop001; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class BoyInvocationHandler implements InvocationHandler {
//定义一个Object对象,保存目标
private Object targer;// 目标是不固定 //添加构造方法,可以通过构造方法给target赋值
public BoyInvocationHandler(Object targer) {
this.targer = targer;
} //非核心业务的代码由动态代理来管理
//定义一个前置任务的方法
private void before(){
// 前置任务
System.out.println("[代理执行前置]起床");
System.out.println("[代理执行前置]刷牙洗脸");
System.out.println("[代理执行前置]吃饭");
System.out.println("*****************");
} //定义一个后置任务的方法
private void after(){
// 后置任务
System.out.println("*****************");
System.out.println("[代理执行后置]洗澡");
System.out.println("[代理执行后置]睡觉");
System.out.println("");
} //调用invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//调用前置任务的方法
before();
//获取类里面的方法的返回值
Object returnValue=method.invoke(targer, args);
//调用后置任务的方法
after(); return returnValue;
} }
(4)新建一个Test测试类
package aop001; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) {
//第一步:创建目标实现类的实例
Boy b1=new Boy_1();
Boy b2=new Boy_2(); //第二步:创建一个动态代理类(CEO 首席执行官)
BoyInvocationHandler handler1 = new BoyInvocationHandler(b1);
BoyInvocationHandler handler2 = new BoyInvocationHandler(b2); //第三步:创建动态代理(跟静态代理一样,申明的变量仍然是目标的接口)
Boy girlProxy1 = (Boy) Proxy.newProxyInstance(
b1.getClass().getClassLoader(),
b1.getClass().getInterfaces(),
handler1);
//调用方法
girlProxy1.beat("周六");
girlProxy1.play("周日"); Boy girlProxy2 = (Boy) Proxy.newProxyInstance(
b2.getClass().getClassLoader(),
b2.getClass().getInterfaces(),
handler2);
girlProxy2.beat("周六");
girlProxy2.play("周日"); } }
(5)运行结果:
[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy1
周六敲代码
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉
[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy1
周日玩游戏
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉
[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy2
周六敲代码
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉
[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy2
周日玩游戏
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉
(6)当我们需要更改非核心代码时,我们只要更改一处就可以了。
谢谢!
String Aop 动态代理例子的更多相关文章
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- jdk动态代理与cglib动态代理例子
1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- spring aop,静态及动态代理例子
@Aspect@Componentpublic class AopText { @Pointcut("execution(public * com.llf.service.*Service. ...
- Java 静态代理和动态代理例子
代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委 ...
- spring源码-aop动态代理-5.3
一.动态代理,这是一个很强大的东西哦.研发过程中我们会常用很多业务类,但是存在一个问题.如何在不修改源码逻辑的情况下,加入自己的相关逻辑.比如异常处理,日志记录等! 二.Java动态代理的两种方式JD ...
- AOP动态代理解析4-代理的创建
做完了增强器的获取后就可以进行代理的创建了 AnnotationAwareAspectJAutoProxyCreator->postProcessAfterInitialization-> ...
- spring源码学习之【准备】jdk动态代理例子
一:被代理的对象所要实现的接口 package com.yeepay.testpoxy; import java.util.Map; /** * 被动态代理的接口 * @author shangxia ...
- JDK动态代理例子
JDK动态代理的代理类必须实现于接口.如果要代理类,则使用CGLIB代理. 先定义一个接口: public interface Character { public void show(); } 接着 ...
随机推荐
- [NHibernate]查看NHibernate生成的SQL语句
最近接触到一个用Spring.Net结合NHIbernate的项目,第一次使用,有很多配置,数据操作一旦出问题,很难找到原因,那么如何查看NHibernate发送给数据库的SQL语句呢? 当然我们可以 ...
- 爬虫研究-主要针对ali
公司一个同事想爬取ali的网页受挫,自己跟着尝试了下,发现存在anti-spdier.准备了解下反爬虫,看怎么处理ali. http://www.freebuf.com/news/topnews/96 ...
- SVN出现Invalid authz configuration解决方案
思路: 1.检查是否为不存在的用户组或用户设置了权限(大部分为此问题,调整用户权限或删除账号后,但忘了去掉某个文件夹的权限) 2.检查authz文件的编码: 3.更改权限后是否未重启svn. 4.按照 ...
- 使用IHTMLDocument2解决弹出"为了让该网站给你提供个人化信息,是否允许在你计算机放置cookie?"
mshtml可以说是一个不错的解析html利器,对于像我这样一直都是不用webbrowser,直接用socket或者WebRequest进行HTTP通讯 然后再用IHTMLDocument2.writ ...
- Linux下uniq命令的详解
-c 在输出行前面加上每行在输入文件中出现的次数. -d 仅显示重复行. -u 仅显示不重复的行. 示例 1.去重,有多行一样的只显示一行cat 4.txt |sort - ...
- Salesforce学习笔记(一)
Force平台简介 一.Force平台应用程序的优点1.以数据为中心的应用程序(一个对象就是一个数据库表) 由于该平台以数据库为中心,它让你能够编写以数据为中心的应用程序.以数据为中心的应用程序是基于 ...
- struts2 框架处理流程
struts2 框架处理流程 流程图如下: 注意:StrutsPrepareAndExecuteFilter替代了2.1.3以前的FilterDispatcher过滤器,使得在执行Action之前可以 ...
- FTP命令 - Size的问题
今天发现一个服务从某一个外接系统(Linux)FTP取到的文件大小和下载后的文件大小总是不一致. 开始以为是程序那里出错了.但是找来找去发现不了原因.后来用FTP工具上去执行SIZE命令,终于发现返回 ...
- 一些gcd计数问题
数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...
- Servlet解决参数乱码问题
为什么会产生乱码? 之所以会产生乱码,是由于服务器端和客户端的编码方式不一致造成的.客户端与服务器端的交互过程中,存在着两次数据交换:第一次,客户端向服务器端发起请求,第二次数据交换,服务器端响应客户 ...