spring代理对象都是代理对象吗spring动态代理
最近看到一个比较有意思的问题,springIoc 产生的对象是否都是代理对象?答案是:spring ioc默认的都是原生对象 只有通过aop增强的对象才是代理对象。有@Transactional 注解或者配置文件:
1.<aop:config> 2. <aop:pointcut id="txPointcut" expression="execution(* com..service.impl.*.*(..))" /> 3. <aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice" /> 1.</aop:config>说到代理,又分为静态代理和动态代理。 静态代理
首先定义一个接口:
1.public interface Iuser { 2. void save(); 3.}接口实现:
1.public class UserService implements Iuser { 2. @Override 3. public void save() { 4. System.out.println("save user 1"); 5. } 6.}代理类:
1.public class UserServiceProxy implements Iuser{ 2. 3. Iuser iuser; 4. 5. public UserServiceProxy(Iuser iuser) { 6. this.iuser = iuser; 7. } 8. 9. @Override 10. public void save() { 11. System.out.println("save user before"); 12. iuser.save(); 13 System.out.println("save user after"); 14 } 15 测试: 16 public static void main(String[] args) { 17 Iuser iuser = new UserService(); 18. System.out.println("save user before"); 19 iuser.save(); 20 System.out.println("save user after"); 21 } 22 输出: 23. save user before 24 .save user 1 25 save user after优点:
缺点:
每一个真实类都需要一个创建新的代理类。 动态代理
实现方式有两种,一个是JDK原生动态代理这个必须是接口,还有一种就是cglib来实现。
还有几个比较经典的面试题:
这个就因为B方法是通过this调用的,this代表的是当前的原生对象,以至于事务不起作用。
2 . 为什么jdk动态代理必须基于接口 ? 生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口实现 从代理模式的设计来说,充分利用了java的多态特性,也符合基于接口编码的规范 。
3.spring 默认是哪种代理方式?
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )动态代理是代理模式吗
Java的三种代理模式(Spring动态代理对象)java动态代理
Spring入门第三讲 Spring中的代理 静态代理 动态代理(JDK代理) cglib代理(字节码增强) Spring中的AOPspring的静态代理和动态代理
spring aop proxy 静态代理和动态代理spring动态代理
代理模式-静态代理模式 代理模式-动态代理(基于接口,JDK动态代理)动态代理是代理模式吗