源代码下载链接地址:
https://download.csdn.net/download/weixin_46411355/87546785
com.jt
SpringConfig.java
package com.jt.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@ComponentScan("com.jt")
@Configuration
public class SpringConfig {}
public interface UserDao {void addUser();
}
@Repository
public class UserDaoImpl implements UserDao{@Overridepublic void addUser() {System.out.println("完成用户新增操作");}
}
public interface UserService {void addUser();
}
@Service
public class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;@Overridepublic void addUser() {System.out.println("数据库事务开始");userDao.addUser();System.out.println("数据库事务提交");}
}
class Springdemo8ProxyApplicationTests {@Testvoid contextLoads() {ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean(UserService.class);userService.addUser();}}
测试结果如下:
如果将业务代码和事务代码都写到一起,则会造成代码的耦合性增加. 不方便程序的扩展.
特点:
1.代理对象是目标对象的子类.
由于特殊原因,Service中不能注入Dao. 暂时不管dao数据的实例化操作
package com.jt.service;import com.jt.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;@Overridepublic void addUser() {//System.out.println("数据库事务开始");//userDao.addUser();System.out.println("完成用户入库操作");//System.out.println("数据库事务提交");}
}
package com.jt.proxy;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class CglibProxy {public static Object getObject(Object target){//创建增强器对象Enhancer enhancer = new Enhancer();//设置父级enhancer.setSuperclass(target.getClass());enhancer.setCallback(getMethodInterceptor());return enhancer.create();}public static MethodInterceptor getMethodInterceptor(){return new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("数据库事务开始");//执行父类的方法Object proxy = methodProxy.invokeSuper(obj,objects);System.out.println("数据库事务提交");return proxy;}};}}
@Testvoid testCGB(){ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean(UserService.class);//使用代理对象 调用方法UserService proxy = (UserService) CglibProxy.getObject(userService);proxy.addUser();}