使用jdk和cglib实现spring的aop功能
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"); } }