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

}
}
運行結果
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章