动态代理原理: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. 2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  2. three.js立方体

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - ge ...

  3. android studio 报错-----R全部显示红色 ---- .9图片报错

    导入android项目后,R全部变红,控制台有下面的提示 意思是缺少一些资源,比如说图片之类的,然后我发现确实少了一张图片资源,导入图片资源后,依旧报错,如下  Error:Execution fai ...

  4. Spring MVC篇一、搭建Spring MVC框架

    本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...

  5. js中函数的一些理论知识

      函数的一些理论知识 1. 函数:                执行一个明确的动作并提供一个返回值的独立代码块.同时函数也是javascript中的一级公民(就是函数和其它变量一样). 2.函数的 ...

  6. 关于dev无法更新、调试的问题

  7. 2.5美元每月的VPS, host1plus

    国内用的比较多的国外VPS应该算的上是Linode和DigitalOcean了,和他们相比Host1plus在价格上更有优势,最低每月2.5刀,也就相当于每月30多块的话费,而且Host1Plus支持 ...

  8. 最小生成树 prime poj1287

    poj1287 裸最小生成树 代码 #include "map" #include "queue" #include "math.h" #i ...

  9. 在手机网页上模拟 js 控制台

    在手机上模拟 console  做一些简单代码调试 在工作机上编辑好代码用QQ 之类的工具传到 手机上在调试当然你也可以尝试用一只手指写代码的壮举设置 window.console = mobiDeb ...

  10. 非常棒的Android对话框效果

    FlycoDialog_Master http://www.see-source.com/androidwidget/detail.html?wid=488 带有各种动画效果的弹出对话框控件.你也可以 ...