spring动态代理
接下来我们来体会下动态代理带给我们的便利
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动态代理的更多相关文章
- spring 动态代理
突然想到AOP,就简单回忆一下动态代理.1.什么是动态代理? 假如有个用户有增删该查4个方法,如果要对用户操作后进行日志记录,可能会有人说直接在增删改查后做日志记录就行. 一旦我想在用户操作之前加一个 ...
- Java的三种代理模式(Spring动态代理对象)
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Spring 动态代理 之 but was actually of type 'com.sun.proxy.$Proxy14 Exception
今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.Bea ...
- Spring动态代理及Spring Bean的生命周期
数组添加值 public class DiTest { /** * 数组 */ private String [] arrays; /** * List:集合 */ private List<I ...
- Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?
前言 在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的. 同样在上一节留下了疑问: 循环依赖为什么要使用三级缓存?而不是使用二级缓存? ...
- Spring动态代理的生成-如何判断是使用JDK动态代理还是CGlib代理
前言 在上一篇文章中讲到了Spring是如何获取对应的Bean的增强,然后本次主要讲解一下Spring如何在获取到增强后创建Spring代理的. 在步入正题之前先给大家看一下Spring创建代理的大致 ...
- Spring AOP动态代理原理与实现方式
AOP:面向切面.面向方面.面向接口是一种横切技术横切技术运用:1.事务管理: (1)数据库事务:(2)编程事务(3)声明事物:Spring AOP-->声明事物 2.日志处理:3.安全验证 ...
- 【spring基础】AOP概念与动态代理详解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- spring基础概念AOP与动态代理理解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
随机推荐
- ubuntu 16.04安装docker
环境 操作系统:ubuntu 16.04 64位,默认安装 准备 1. 添加GPG key: $ sudo apt-key adv --keyserver hkp://p80.pool.sks-key ...
- POJ 1144
http://poj.org/problem?id=1144 题意:给你一些点,某些点直接有边,并且是无向边,求有多少个点是割点 割点:就是在图中,去掉一个点,无向图会构成多个子图,这就是割点 Tar ...
- 数据库如何生成sql语句
以SQL SERVER 2008为例子. 1.启动客户端管理器,连接到要生成脚本的数据库. 2.在左边的”对象资源管理器“中,右键选择该数据库打开菜单.选择”任务“,”生成脚本“菜单,打开对话框. 3 ...
- debian命令行删除postgresql数据库
创建数据库 $ createdb odoo-test 删除数据库 $ dropdb odoo-test
- java注解处理
1.自定义注解类型 package com.yc.annotation; import java.lang.annotation.ElementType; import java.lang.ann ...
- 浅谈display:flex
display:flex 意思是弹性布局 首先flex的出现是为了解决哪些问题呢? 一.页面行排列布局 像此图左右两个div一排显示 可以用浮动的布局方式 html部分 css部分 这种布局有两个缺点 ...
- Lintcode 150.买卖股票的最佳时机 II
------------------------------------------------------------ 卧槽竟然连题意都没看懂,百度了才明白题目在说啥....我好方啊....o(╯□ ...
- net-force.nl/steganography writeup
做CTF题好长一段时间了,真的可以学到很多东西.这次,我们开启 net-force.nl 的 Steganography之旅,所谓的隐写术. level 801: Training - Can you ...
- 改变linux默认配色方案(dircolors和dircolors-solarized使用)
前言 前几天刚买了阿里云的云服务器,今天使用putty进入服务器,发现linux默认的bash配色实在太丑. 特别是文件夹显示为深蓝色,到了白天,和黑色背景一搭配,根本看不清文字. 好在在github ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...