接下来我们来体会下动态代理带给我们的便利

package aop006;

public interface Girl {
public void KFC(String datetime);
public void meet(String datetime);
}
package aop006;

/*
*
*/
public class Girl1 implements Girl{ public void KFC(String datetime){ System.out.println("[核心业务逻辑]我是第一个女孩");
System.out.println("[核心业务逻辑]"+datetime+"吃肯德基");
} public void meet(String datetime){ System.out.println("[核心业务逻辑]我是第一个女孩");
System.out.println("[核心业务逻辑]"+datetime+"约会"); } }
package aop006;

/*
*
*/
public class Girl2 implements Girl { public void KFC(String datetime){
System.out.println("[核心业务逻辑]我是第二个女孩");
System.out.println("[核心业务逻辑]"+datetime+"吃肯德基");
} public void meet(String datetime){
System.out.println("[核心业务逻辑]我是第二个女孩");
System.out.println("[核心业务逻辑]"+datetime+"约会");
} }
package aop006;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class GirlHandler implements InvocationHandler {
/*
* 返回的是原来目标方法所返回的内容
*/
private Object target;
public GirlHandler(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//前置任务
before();
//具体业务逻辑代码
Object returnValue=method.invoke(target, args);
//后置任务
after();
return returnValue;
}
public void before(){
//前置任务
System.out.println("【代理前置】洗澡");
System.out.println("【代理前置】化妆");
System.out.println("【代理前置】穿衣服");
System.out.println("*****************");
}
public void after(){
//后置任务
System.out.println("*****************");
System.out.println("【代理后置】卸妆");
System.out.println("【代理后置】洗澡");
System.out.println("【代理后置】睡觉");
} }

从这个代理类我们可以发现如果我们要改非业务代码时只需要改一次。

package aop006;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; /*
* 增加一个代理类,类似与明星的经纪人
* 把核心的业务逻辑的代码 和 非核心的 分离
* 把非核心的代码交给经纪人(proxy)去管理,
* 注意:经纪人和要明星,必须实现同一个接口
*/
public class Test { public static void main(String[] args) {
//1.创建目标实现类的实例
Girl g1 = new Girl1();
Girl g2 = new Girl2(); //2.创建一个动态的代理类
InvocationHandler handler1=new GirlHandler(g1);
InvocationHandler handler2=new GirlHandler(g2); //创建一个动态代理
Girl girlProxy1=(Girl)Proxy.newProxyInstance(g1.getClass().getClassLoader(), g1.getClass().getInterfaces(),handler1);
girlProxy1.KFC("周六");
girlProxy1.meet("周六");
Girl girlProxy2=(Girl)Proxy.newProxyInstance(g1.getClass().getClassLoader(), g2.getClass().getInterfaces(),handler2);
girlProxy2.KFC("周日");
girlProxy2.meet("周日");
/*g1.KFC("周六");
g1.meet("周日"); g2.KFC("周六");
g2.meet("周日");*/
} }

运行结果如下:

截图没截完我相信聪明的你一定知道没截完的是如何的。

接下来会介绍使用配置文件实现动态代理。

spring动态代理的更多相关文章

  1. spring 动态代理

    突然想到AOP,就简单回忆一下动态代理.1.什么是动态代理? 假如有个用户有增删该查4个方法,如果要对用户操作后进行日志记录,可能会有人说直接在增删改查后做日志记录就行. 一旦我想在用户操作之前加一个 ...

  2. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  3. Spring 动态代理 之 but was actually of type 'com.sun.proxy.$Proxy14 Exception

    今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.Bea ...

  4. Spring动态代理及Spring Bean的生命周期

    数组添加值 public class DiTest { /** * 数组 */ private String [] arrays; /** * List:集合 */ private List<I ...

  5. Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

    前言 在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的. 同样在上一节留下了疑问: 循环依赖为什么要使用三级缓存?而不是使用二级缓存? ...

  6. Spring动态代理的生成-如何判断是使用JDK动态代理还是CGlib代理

    前言 在上一篇文章中讲到了Spring是如何获取对应的Bean的增强,然后本次主要讲解一下Spring如何在获取到增强后创建Spring代理的. 在步入正题之前先给大家看一下Spring创建代理的大致 ...

  7. Spring AOP动态代理原理与实现方式

    AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物   2.日志处理:3.安全验证 ...

  8. 【spring基础】AOP概念与动态代理详解

    一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  9. spring基础概念AOP与动态代理理解

    一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

随机推荐

  1. c coroutine

    今天看了下云风c coroutine  代码 博客,发现 coroutine 实现原理其实还比较简单,就用户态栈切换,只需要几十行汇编,特别轻量级. 具体实现 1. 创建一个coroutine: 也就 ...

  2. css单位盘点

    css单位有:px,em,rem,vh,vw,vmin,vmax,ex,ch 等等 1.px单位最常见,也最直接,这里不做介绍. 2.em:em的值并不是固定,它继承父级元素的字体大小,所以层数越深字 ...

  3. Ninject学习(一) - Dependency Injection By Hand

    大体上是把官网上的翻译下而已. http://www.ninject.90iogjkdcrorg/wiki.html Dependency Injection By Hand So what's Ni ...

  4. linux部署pxe+kickstart批量安装linux操作系统

    环境 系统 centos6.6 无图形界面 ip 192.168.2.1 系统 centos7.2 有图形界面 以下命令在centos6.6上执行 1. yum -y install dhcp* tf ...

  5. 3ds max 渲染清晰面片的边缘

    3ds max的菜单栏 -> 渲染 -> 材质编辑器->精简材质编辑器,将面状打勾,如下图,就能渲染出面片清晰的图形.

  6. Swift - 点击事件奇偶次判断

    // 按钮点击事件 func onTouchUpInside() { struct touchUpInside { static var count: Int = 0 } touchUpInside. ...

  7. net-force.nl/programming writeup

    从 wechall.net 到 net-force.nl 网站,发现网站的内容不错,里面也有不同类型的挑战题目:Javascript / Java Applets / Cryptography / E ...

  8. 【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

    一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需 ...

  9. 一.Timesten安装

    一,安装timesten IMDB并测试 1. 创建数据库相关用户和组 groupadd timesten useradd -g timesten -G dba timesten passwd tim ...

  10. 如何把Power BI嵌入到Web应用中

    (此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:这篇其实不是一个操作向导了,主要对Power BI的嵌入特性进行探讨. Power BI ...