Java动态代理(三)——模拟AOP实现
以下案例模拟AOP实现
目录结构
接口PersonService
package com.ljq.service; public interface PersonService {
public void save(String name);
public void update(String name, Integer personId);
public String getPersonName(Integer personId);
}
实现类PersonServiceBean
package com.ljq.service.impl; import com.ljq.service.PersonService; public class PersonServiceBean implements PersonService {
private String user = null; public PersonServiceBean() {
super();
} public PersonServiceBean(String user) {
super();
this.user = user;
} public String getPersonName(Integer personId) {
System.out.println("我是getPersonName()方法");
return "get";
} public void save(String name) {
System.out.println("我是save()方法");
} public void update(String name, Integer personId) {
System.out.println("我是update()方法");
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
}
}
动态代理类JDKProxyFactory
package com.ljq.aop; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.ljq.service.impl.PersonServiceBean; public class JDKProxyFactory implements InvocationHandler {
//要代理的原始对象
private Object targer; /**
* 创建动态代理
*
* @param targer 要代理的原始对象
* @return
*/
public Object createProxyInstance(Object targer){
this.targer=targer;
return Proxy.newProxyInstance(
this.targer.getClass().getClassLoader(),
this.targer.getClass().getInterfaces(),
this);
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
PersonServiceBean bean = (PersonServiceBean) this.targer;
if (bean.getUser() != null) {
// 前置通知
doBefore();
try {
result = method.invoke(targer, args);
// 后置通知
doAfter();
} catch (Exception e) {
// 例外通知
doException();
} finally {
// 最终通知
doFinally();
}
}
return result;
} private void doBefore() {
System.out.println("我是前置通知");
} private void doAfter() {
System.out.println("我是后置通知");
} private void doException() {
System.out.println("我是例外通知");
} private void doFinally() {
System.out.println("我是最终通知");
} }
动态代理类CGlibProxyFactory:使用CGLIB技术
package com.ljq.aop; import java.lang.reflect.Method; import com.ljq.service.impl.PersonServiceBean; import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class CGlibProxyFactory implements MethodInterceptor{
private Object target; public Object createProxyInstance(Object target){
this.target=target;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(this.target.getClass());//非final
enhancer.setCallback(this);
return enhancer.create();
} public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object result=null;
PersonServiceBean bean=(PersonServiceBean)this.target;
if(bean.getUser()!=null){
// 前置通知
doBefore();
try {
result = methodProxy.invoke(target, args);
// 后置通知
doAfter();
} catch (Exception e) {
// 例外通知
doException();
} finally {
// 最终通知
doFinally();
}
}
return result;
} private void doBefore() {
System.out.println("我是前置通知");
} private void doAfter() {
System.out.println("我是后置通知");
} private void doException() {
System.out.println("我是例外通知");
} private void doFinally() {
System.out.println("我是最终通知");
} }
测试类AopTest
package com.ljq.test; import com.ljq.aop.CGlibProxyFactory;
import com.ljq.aop.JDKProxyFactory;
import com.ljq.service.PersonService;
import com.ljq.service.impl.PersonServiceBean; public class AopTest { public static void main(String[] args) {
proxyTest();
proxyTest2();
} private static void proxyTest() {
JDKProxyFactory jdkProxyFactory=new JDKProxyFactory();
PersonService personService=(PersonService)jdkProxyFactory.
createProxyInstance(new PersonServiceBean("zhangsan"));
personService.getPersonName(1);
} private static void proxyTest2() {
CGlibProxyFactory cglibProxyFactory=new CGlibProxyFactory();
PersonServiceBean bean=(PersonServiceBean)cglibProxyFactory.
createProxyInstance(new PersonServiceBean("lisi"));
bean.save("a"); }
}
运行结果
Java动态代理(三)——模拟AOP实现的更多相关文章
- java动态代理与老式AOP实现
JAVA的动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 ...
- 转:AOP与JAVA动态代理
原文链接:AOP与JAVA动态代理 1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代 ...
- java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))
1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...
- Java动态代理-->Spring AOP
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Jav ...
- java动态代理实现与原理详细分析(代码层面解释了AOP的实现)
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模式是常用的java设计模式, ...
- AOP面向切面编程JAVA动态代理实现用户权限管理(实现篇)
java动态代理机制的功能十分强大,使用动态代理技术能够有效的降低应用中各个对象之间的耦合紧密程度,提高开发的效率以及程序的可维护性,事实上Spring AOP就是建立在Java动态代理的基础之上.其 ...
- AOP与JAVA动态代理
1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2.AOP各种实现机制 ...
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...
- Java 动态代理及AOP实现机制
AOP实现机制http://www.iteye.com/topic/1116696 AOP: (Aspect Oriented Programming) 面向切面编程AOP包括切面(aspect).通 ...
- java动态代理——字段和方法字节码的基础结构及Proxy源码分析三
前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
随机推荐
- memcached内存管理机制分析
memached是高性能分布式内存对象系统,通过在内存中存储数据对象来减少对磁盘的数据读取次数,提高服务速度. 从业务需求出发.我们通过一条命令(如set)将一条键值对(key,value)插入mem ...
- python调用R语言,关联规则可视化
首先当然要配置r语言环境变量什么的 D:\R-3.5.1\bin\x64; D:\R-3.5.1\bin\x64\R.dll;D:\R-3.5.1;D:\ProgramData\Anaconda3\L ...
- [原创][C#.Winform 控件]Krypton Suite comments
命名空间:ComponentFactory.Krypton.Toolkit 最新版本:v4.4.0 官网状态:已停用 下载地址1:http://downloads.informer.com/krypt ...
- solr删除全部索引数据
SOLR 删除全部索引数据: <delete><query>*:*</query></delete><commit/>
- [nginx]lua操作redis
local redis = require "resty.redis" local red = redis:new() red:set_timeout() -- sec -- or ...
- centos7.3给搭建SVN服务器
centos7.3给搭建SVN服务器 1 安装svnserver yum install subversion 2 查看版本 svnserve --version 3 创建版本库 3.1 运行以下命令 ...
- python3.6编程第一课画个五角星
使用的是海龟图库 turtle import turtle turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.righ ...
- 「小程序JAVA实战」小程序的springboot后台拦截器(61)
转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudespringboothoutailanjieqi60/ 之前咱们把 ...
- sql中纵表变横表
纵表格式如图所示: 查询sql语句如下: ),content)content,Date from SummerChina ' 变成横表如图所示: 纵表变横表sql语句如下: select Time, ...
- 生产者消费者模式做一个golang的定时器
在主程序启动的时候开一个goroutine作为消费者,用管道连接生产者和消费者,消费者处于无限循环,从管道中获取channel传过来定时event 注意:channel在消费者创建的时候就连通生产者和 ...