本文章主要介绍了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 " );
}
}
运行结果
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/228188.html