spring ioc默认的都是原生对象(动态创建原生对象) 只有通过aop增强的对象才是代理对象(动态创建代理对象)
ioc创建的对象是单例的
aop的对象是用一次创建一次
@Async、@Transactional、@Cacheable等注解标注的方法都会被spring中的aop创建动态代理对象
那么aop创建动态代理对象是通过什么方式呢--------Cglib
简单理解:CGLIB的动态代理,是基于现有类创建一个子类(所以在springboot异步调用的文中提到使用@asyno 要单独写在一个类中),并实例化子类对象(动态代理对象)。在调用动态代理对象方法时,都是先调用子类方法,子类方法中使用方法增强Advice或者拦截器MethodInterceptor处理子类方法调用后,选择性的决定是否执行父类方法。
在springboot项目中@Configuration也是利用cglib创建
这也是@Configuration和@Component的区别
Component注解也会当做配置类,但是并不会为其生成CGLIB代理Class,用一次new创建一次对象,所以是不同的对象。当时Configuration注解时,生成当前对象的子类Class,并对方法拦截,第二次调用时直接从BeanFactory之中获取对象,所以得到的是同一个对象。
也可以这样理解:@Configuration是随容器启动开始加载的,始终存在的单例模式。 @Component是使用一次即实例化一次