动态代理原理: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. 微服务中的netty

    一般使用netty主要是整个netty流程的理解,实际开发中服务端.客户端参数的配置,以及连接 handle的管理是关键,再有就是encode和decode编码.解码. 服务端流程图 客户端流程图包含 ...

  2. C语言中使用系统自带的快排函数

    题目 . 德才论 () 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取 ...

  3. SpringMVC -- 注解

    @Entity -- 实体类@Table(name = "hat_province", catalog = "news") -- 对应的表name -- 表名c ...

  4. MD5加密的Java实现

    在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...

  5. web.xml配置错误导致applicationContext.xml配置重复加载

    web.xml相关配置 <context-param><param-name>log4jRefreshInterval</param-name><param- ...

  6. 在linux下Ant的环境配置

    Ant(英文全称为another neat tool,另一个简洁的工具)是一个基于Java的生成工具,Ant将会被应用到Java项目中. 同样的,现在要来安装Ant(最近要安装的东西还蛮多的=m=), ...

  7. HUD--递增数

    递增数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. 基于TCP协议的socket通信

    一.服务器端 1.创建serverSocket,即服务器端的socket,绑定指定的端口,并侦听此端口 ServerSocket server = new ServerSocket(8888); 2. ...

  9. mysql不能插入中文

    mysql不能插入中文 解决办法: 1.打开终端,连接数据库  mysql -u root -p; 2.输入 satus; 查看状态 3.输入 set char set 'gbk'; 4.如果是已有的 ...

  10. Java json串生成及转bean

      package com; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import j ...