思想:
和上一篇面向切面编程之手动JDK代理方式上的需求和开发模式一样。不同的是目标类没有接口,只有实现类,采用的是spring中提供的Enhancer类继承目标类实现的代理方式。
需要导入的jar包:
spring的core包,详细看代码。
代码:
UserDaoImpl实现类
package com.xx.cglibproxy; /** * 用户Dao实现类 * @author phoebe * */ public class UserDaoImpl { //增 void addUser(){ System.out.println("增"); } //删 void deleteUser(){ System.out.println("删"); } //改 void updateUser(){ System.out.println("改"); } }
切面类:
package com.xx.cglibproxy; /** * 切面类 * @author phoebe * */ public class MyAspect { //开启事物 public void before(){ System.out.println("开启事物"); } //提交事物 public void after(){ System.out.println("提交事物"); } }
cglib代理工厂类:
package com.xx.cglibproxy; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; /** * Cglib代理工厂 * @author phoebe * */ public class MyCglibProxyFactory { //被代理类 private static UserDaoImpl userDaoImpl=new UserDaoImpl(); //切面类 private static MyAspect myAspect = new MyAspect(); //创建代理对象 public static UserDaoImpl createUserDao(){ //定义代理对象 Enhancer enhancer = new Enhancer(); //继承UserDaoImpl enhancer.setSuperclass(UserDaoImpl.class); //设置回调函数 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //执行切面方法 myAspect.before(); //执行目标方法 Object object = method.invoke(userDaoImpl, args); myAspect.after(); return object; } }); //创建代理 UserDaoImpl userDaoImpl = (UserDaoImpl) enhancer.create(); return userDaoImpl; } }
测试类:
package com.xx.cglibproxy; /** * 代理类测试 * @author phoebe * */ public class CglibProxyTest { public static void main(String[] args) { UserDaoImpl userDaoImpl = MyCglibProxyFactory.createUserDao(); userDaoImpl.addUser(); userDaoImpl.deleteUser(); userDaoImpl.updateUser(); } }