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