spring aop 是由动态代理来是实现的,其中包含jdk的代理实现和cglib的实现,两者之间的差别在于jdk是依靠接口实现的,而cglib是针对类来实现代理。
动态代理实例代码:
public interface People{
public void run();
}
public class Student implement People{
@Override
public void run(){
System.out.println("学生跑");
}
}
/**
*jdk 动态代理必须实现InvocationHandler接口
*/
public class StudentProxy implement InvocationHandler{
private Object target;
/**
* 返回一个代理对象
* @param target
* @return
*/
public Object bind(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object rest=null;
System.out.println("之前。。。。。");
rest=method.invoke(target, args);
System.out.println("之后。。。。。");
return rest;
}
}
public class TestProxy{
public static void main(String[] args){
StudentProxy proxy=new StudentProxy();
People ta=(People) proxy.bind(new Student());
ta.run();
}
}
/**
*cglib 动态代理必须实现MethodInterceptor接口
*/
public class StudentProxy implements MethodInterceptor{
/**
* 返回一个代理对象
* @param target
* @return
*/
public Object getProxy(Object target){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] arg2,
MethodProxy methodProxy) throws Throwable {
Object rest=null;
System.out.println("之前。。。。。");
rest=methodProxy.invokeSuper(obj, arg2);
System.out.println("之后。。。。。");
return rest;
}
}
public class TestProxy{
public static void main(String[] args){
StucentProxy cglib=new StucentProxy();
Student stu=(Student)cglib.getProxy(new Student());
stu.run();
}
}
spring 代码实例
代码段一:
@Repository("mybatisDaoImp")
public class MyBatisDaoImp implement BaseDao<MyBatis>{
@Transactional
public void te(){
}
}
代码段二:
@Repository("orderService")
public class OrderService {
@Autowired
private OrderMapper mapper;
@Transactional
public void insertOrder(List<Order> orders) {
}
针对上面两个代码段分别调用spring的getBean()方法来获取实例时因为MyBatisDaoImp实现了接口BaseDao,Srping 会用jdk来实现它的事务代理类,而OrderService 没有实现任何接口,srping 会用cglib来实现 它的事务代理。
注意:由jdk实现的代理类不能强转为实现类,而cglib实现的代理类可以强转为实现类