随笔 - 1357  文章 - 0  评论 - 1104  阅读 - 1941万

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");

}
}
复制代码

运行结果

 

posted on   Ruthless  阅读(2888)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
< 2011年2月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 1 2 3 4 5
6 7 8 9 10 11 12

点击右上角即可分享
微信分享提示