动态代理原理: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 动态代理例子的更多相关文章

  1. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  2. jdk动态代理与cglib动态代理例子

    1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...

  3. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  4. spring aop,静态及动态代理例子

    @Aspect@Componentpublic class AopText { @Pointcut("execution(public * com.llf.service.*Service. ...

  5. Java 静态代理和动态代理例子

    代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委 ...

  6. spring源码-aop动态代理-5.3

    一.动态代理,这是一个很强大的东西哦.研发过程中我们会常用很多业务类,但是存在一个问题.如何在不修改源码逻辑的情况下,加入自己的相关逻辑.比如异常处理,日志记录等! 二.Java动态代理的两种方式JD ...

  7. AOP动态代理解析4-代理的创建

    做完了增强器的获取后就可以进行代理的创建了 AnnotationAwareAspectJAutoProxyCreator->postProcessAfterInitialization-> ...

  8. spring源码学习之【准备】jdk动态代理例子

    一:被代理的对象所要实现的接口 package com.yeepay.testpoxy; import java.util.Map; /** * 被动态代理的接口 * @author shangxia ...

  9. JDK动态代理例子

    JDK动态代理的代理类必须实现于接口.如果要代理类,则使用CGLIB代理. 先定义一个接口: public interface Character { public void show(); } 接着 ...

随机推荐

  1. shr 右移测试

    fdword :DWORD; procedure TForm10.btn1Click(Sender: TObject); var temp:DWORD; begin fdword :=; //7866 ...

  2. Linux查看系统运行情况

    http://elinux.org/Runtime_Memory_Measurement

  3. iOS 使点击事件穿透透明的UIView

    如图: 悬浮的三个按钮下方有一个可以点击的灰色区域,但是点击按钮之间的透明区域, 这三个按钮的contentView会响应这个点击事件,这时候需要让这个contentView不响应这个点击事件. 解决 ...

  4. GitHub托管项目

    1.进入Repositories->点击 new repositories; 2.输入Repository name 直接创建项目: 3.记录你的项目地址,如:https://github.co ...

  5. debian下使用Sphinx异常“Could not import extension sphinx.builders.linkcheck (exception: cannot import name SSLError)”的解决

    最近使用到Sphinx编译文档,出现如下异常: Extension error:Could not import extension sphinx.builders.linkcheck (except ...

  6. java基础2_运算符,选择语句

    算数运算符  +    相加  字符串的连接  正数 -    相减  负数 *    相乘 /    相除    10 / 3 ==> 3  两个操作数中精度最高的是int 结果也是int % ...

  7. oracle触发器和存储过程的格式

    最近接到一个任务要根据一个表来转移另一个表的数据到第三个表.想了想,用决定用触发器+存储过程的方式来做.有些时间没有写存储过程和触发器了,查了一下资料,确定了oracle的触发器和存储过程的格式. 触 ...

  8. SQL基本语句汇总

    语句:CREATE TABLE 作用:创建表格 格式:CREATE TABLE tableName (columnName1 columnDataType1, columnName2 columnDa ...

  9. HDU3465 树状数组逆序数

    Life is a Line Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)T ...

  10. C#_技巧:真伪随机数

    使用 Random 产生随机数.(这是一种伪随机数,需要seed,同一个seed后,采用某种算法产生的数字序列都是一样的) 两种写法 错误 for(int i=0;i<100;i++) {    ...