注解@Aspect,@Transaction 等 用到 动态代理 , JDK动态代理用到 反射
Spring IOC
1.IOC 与 DI 的区别
IOC是DI的原理。DI(依赖注入)是往某个类或方法注入一个值。其中用到的原理就是IOC(控制反转)
DI : 操作层面
IOC:原理层面
IOC的优点 : 降低项目耦合,提高延伸性。
ClassPathXmlApplicationContext是 IOC的核心。
ClassPathXmlApplicationContext 是 AbstractApplicationContext的子类
AbstractApplicationContext 是 ApplicationContext接口的实现
ApplicationContext 里 包含的 ListableBeanFactory 接口 ,是继承了 BeanFactory
BeanFactory :负责管理Bean的加载,生成,注入等。
ApplicationContext 是整个项目的配置类,Spring项目在启动或运行的时候都需要依赖到它。
2.Spring 启动 初始化Bean 到IOC容器中的BeanFactory, 到注入Bean的过程。
① 启动时初始化IOC容器
ClassPathXmlApplicationContext中,refresh()函数,是调用父类首先首先是 AbstractApplicationContext中的refresh()。refresh()里最核心的方法 :refreshBeanFactory()。
如果已有BeanFactory,先删除所有Bean,然后关闭BeanFactory。
然后创建一个新的 BeanFactory,这个工厂里会 通过 loadBeanDefinitions() 预先加载 xml 配置里 所有的Bean,还有注解 @Bean 的类。
② 注入Bean
通过注解@Autowire 注入对应的Bean ,其实是 从context中获取bean
这个过程是:从 已经加载好所有Bean的 BeanFactory 里遍历,通过 beanName 去找到对应的Bean,然后再 把这个 bean 设置进去。
Spring AOP
1.当一个bean加载到Spring后 ,会执行 自动代理器 的初始化方法 。
2.里边最核心的方法是:wrapIfNecessary(),是AOP的核心流程。
3.首先 从刚加载的Bean中扫描出所有的 advisor,其实就是 我们自定义的 : before(),around() 方法。
4.拿到所有的 advisor 后,调用createProxy(), 创建代理的流程。
5.首先要创建一个proxyFactory 对象。然后把 beanClass,targetSource,advisor 都丢进这个工厂,最后得到一个代理对象。在创建代理对象的时候,用的就是动态代理的来创建的。会判断目标类 是否有实现接口,有责使用JDK代理,没有则使用Cglib代理。
动态代理
Spring 项目中的 注解 , @Bean ,@Autowire,@Trasaction ,其实就是 : SpringAOP (切面编程),而SpringAop 底层用的都是 动态代理。
JDK动态代理 :
① 底层是 JAVA反射机制实现的
② 代理类要 实现 InvocationHandler,重写 invoke()方法,每次代理类调用方法的时候,都会默认先经过 invoke()方法。
调用JDK动态代理:
Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler );
Cglib动态代理:
① 底层是asm(java字节码操控框架)
② 代理类 依赖 cglib包下的 methodInterceptor ,实现这个拦截器,每次调用代理类的方法时,都会经过 intercept()方法。
Spring中使用了哪些设计模式
1.简单工厂设计模式
springIOC中的BeanFactory就是简单工厂模式的体现,传入 BeanName 就可以在加载了所有Bean的工厂里找到对应的bean 。
2.单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
springIOC中的BeanFactory就是一个单例的对象。
3. 适配器模式
在SpringAop中,使用的Advice(通知)来增强被代理类的功能。AOP功能的原理就使用动态代理模式对类进行方法级别的增强。就是生成代理类。
4.代理模式
为其他对象提供一种代理以控制对这个对象的访问。SpringAop中使用的 JDK代理,Cglib代理。