您的位置:首页 > 编程语言 > Java开发

使用jdk和cglib实现spring的aop功能

2012-08-05 16:24 736 查看
spring中aop功能的实现实际上是用cglib和jdk实现的,如果目标对象实现了接口那么用的是Jdk的方式实现,如果目标对象没有实现接口那么用的是cglib的方式实现。







*******************

PersonService.java

*******************

package blog.service;

public interface PersonService {
public String save(String name);
public String update(String name,Integer userId);

}


*******************

PersonServiceBean.java

*******************

package blog.service.impl;

import blog.service.PersonService;

public class PersonServiceBean implements PersonService {
private String username = null;

public String getUsername() {
return username;
}

public PersonServiceBean(){}

public PersonServiceBean(String username) {
this.username = username;
}

@Override
public String save(String name) {
System.out.println("in save method!" + name);
return null;
}

@Override
public String update(String name, Integer userId) {
System.out.println("in update method! name = " + name + " id = " + userId + " username = " + username) ;
return null;
}

}


*******************

JDKProxyFactory.java

*******************

package blog.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import blog.service.impl.PersonServiceBean;

public class JDKProxyFactory implements InvocationHandler{
private  Object target;

public JDKProxyFactory(){
}

public JDKProxyFactory(Object target){
this.target = target;
}

public  Object creatProxyFactory(Object target){
this.target = target;
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {//环绕通知
PersonServiceBean personServiceBean = (PersonServiceBean)this.target;
String username = personServiceBean.getUsername();
Object object = null;
if (username != null && !"".equals(username.trim())) {
try {
//......advice()-->前置通知
object = method.invoke(this.target, args);
//......afteradvice()-->后置通知
} catch (Exception e) {
//......exceptionadvice()-->例外通知
}finally{
//......finallyadvice()-->最终通知
}
}
return object;
}

}


*******************

CglibProxyFactory.java

*******************

package blog.aop;

import java.lang.reflect.Method;

import blog.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 crateProxyFactory(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());//非final
enhancer.setCallback(this);
return enhancer.create();
}

@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
PersonServiceBean bean = (PersonServiceBean)target;
Object result = null;
if (bean.getUsername() != null && !"".equals(bean.getUsername())) {
result = methodProxy.invoke(bean, args);
}
return result;
}

}


*******************

AOPTest.java

*******************

package junit.test;

import org.junit.BeforeClass;
import org.junit.Test;

import blog.aop.CglibProxyFactory;
import blog.aop.JDKProxyFactory;
import blog.service.PersonService;
import blog.service.impl.PersonServiceBean;

public class AOPTest {

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@Test
public void proxyTest(){
JDKProxyFactory proxy = new JDKProxyFactory();
PersonService service = (PersonService)proxy.creatProxyFactory(new PersonServiceBean("dfds"));
service.save("sdfgsdf");
}

@Test
public void proxyTest2(){
CglibProxyFactory factory = new CglibProxyFactory();
PersonServiceBean bean = (PersonServiceBean) factory.crateProxyFactory(new PersonServiceBean("dsfds"));
bean.save("56546fgfd");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: