使用jdk和cglib实现spring的aop功能
2012-08-05 16:24
736 查看
spring中aop功能的实现实际上是用cglib和jdk实现的,如果目标对象实现了接口那么用的是Jdk的方式实现,如果目标对象没有实现接口那么用的是cglib的方式实现。
*******************
PersonService.java
*******************
*******************
PersonServiceBean.java
*******************
*******************
JDKProxyFactory.java
*******************
*******************
CglibProxyFactory.java
*******************
*******************
AOPTest.java
*******************
*******************
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"); } }
相关文章推荐
- 使用jdk和cglib实现spring的aop功能
- ITCAST视频-Spring学习笔记(使用CGLIB实现AOP功能与AOP概念解释)
- ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能
- (8) 使用JDK中的Proxy技术实现AOP功能 以及 CGLIB生成代理
- Spring学习笔记(14)----使用CGLIB实现AOP功能
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能 2
- 15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能 3
- 16_传智播客Spring2.5视频教程_使用CGLIB实现AOP功能与AOP概念解释
- Spring的AOP实现使用的JDK的动态代理必须使用接口
- spring aop提供了两种实现方式jdk和cglib
- Spring-JDK与CGlib代理实现AOP简单实例
- jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- 使用Spring AOP注解方式实现表单重复提交验证功能
- Spring整理12 -- 面对切面(AOP)3 -- 使用CGLIB实现AOP
- Spring中AOP实现的两种方式之JDK和cglib的动态代理
- 使用CGLIB实现AOP功能
- 使用CGLIB实现AOP功能与AOP概念解释
- 利用JDK提供的Proxy类和cglib.jar实现Aop功能