以下案例模拟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实现的更多相关文章

  1. java动态代理与老式AOP实现

    JAVA的动态代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会 ...

  2. 转:AOP与JAVA动态代理

    原文链接:AOP与JAVA动态代理 1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代 ...

  3. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  4. Java动态代理-->Spring AOP

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Jav ...

  5. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  6. AOP面向切面编程JAVA动态代理实现用户权限管理(实现篇)

    java动态代理机制的功能十分强大,使用动态代理技术能够有效的降低应用中各个对象之间的耦合紧密程度,提高开发的效率以及程序的可维护性,事实上Spring AOP就是建立在Java动态代理的基础之上.其 ...

  7. AOP与JAVA动态代理

    1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代理类的字节码 2.AOP各种实现机制 ...

  8. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  9. Java 动态代理及AOP实现机制

    AOP实现机制http://www.iteye.com/topic/1116696 AOP: (Aspect Oriented Programming) 面向切面编程AOP包括切面(aspect).通 ...

  10. java动态代理——字段和方法字节码的基础结构及Proxy源码分析三

    前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

随机推荐

  1. Asp.net MVC 出现“Failed to map the path '/'.”错误

    Server Error in '/' Application. Parser Error Description: An error occurred during the parsing of a ...

  2. 机房用ROS创建时间服务器

    发现机房里的服务器时间老是不同步,虽然都设置为time-a.nist.gov和time-b.nist.gov,仍然有失败的概率.可能是因为国外服务器的缘故.所以打算在机房里创建一个时间服务器.正好RO ...

  3. 20181123_SQL Server 2008_找出以逗号分隔的字符串中最大的数字

    --select [dbo].[Fun_GetMaxNum]('棉 20%,麻 190%,涤纶60%') CREATE FUNCTION [dbo].[Fun_GetMaxNum] ( @StrAll ...

  4. struts1的一个简单登陆功能

    Login.jsp: <form action="<%= request.getContextPath() %>/login.do" method="p ...

  5. Python普通方法、静态方法、类方法

    开始 # -*-coding:utf-8-*- # 普通方法,类方法,静态方法的区别 __metaclass__ = type class Tst: name = 'tst' data = 'this ...

  6. zoj-3410-Layton's Escape

    /* ZOJ Problem Set - 3410Layton's Escape ----------------------------------------------------------- ...

  7. 并发服务器和HTTP协议

    单进程服务器 1. 完成一个简单的TCP服务器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) # 重复使用绑定的信息 se ...

  8. Django学习---jsonp跨域请求

    jsonp跨域请求 我们通过ajax进行跨域请求的时候,请求发送过去,但是在接受返回数据的时候浏览器会进行拦截. 这是由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源 ...

  9. pandas的数据结构

    要使用pandas,需要熟悉它的两个主要的数据结构,Series和DataFrame. Series series是一种类似于以为数组的对象,它由一组数据(各种numpy的数据类型)以及一组与之相关的 ...

  10. Python unittest excel数据驱动

    安装xlrd 下载地址:https://pypi.python.org/pypi/xlrd 安装ddt 下载地址:https://pypi.python.org/pypi/ddt/1.1.0 clas ...