- IOC
IOC即为控制反转,Spring不再需要我们手动new新对象,而是交给Spring容器,由容器统一管理对象的生命周期和对象的依赖关系。
IOC实现最主要的方式为依赖注入(DI), 容器在创建对象时会将其所依赖的其他对象注入进去,比如Controller中需要Dao对象,容器会直接将Dao提供给Controller。
IOC容器是实现控制反转的核心载体,像管理对象的生命周期和依赖关系等任务都是由其来完成的,ApplicationContext就是Spring的IOC容器。
依赖注入(DI)实现的核心方式为 通过构造器注入,Setter方法注入,字段注入(通过注解注入)。
IOC实现原理:
- Spring会通过读取配置信息(XML,注解)获得其所需的Bean的类名,依赖关系等。
- 解析 Bean 定义 配置信息被解析为 BeanDefinition 对象,封装了 Bean 的元数据信息,如类路径、作用域、依赖关系等。
- 实例化 Bean 根据 BeanDefinition 中的类名,容器使用反射机制调用类的构造方法创建对象。
- 依赖注入 容器解析 Bean 的依赖关系,并通过构造方法、Setter 方法或字段注入,将依赖的对象注入到目标对象中。
- 执行初始化方法(如@PostConstruct标注的方法),完成 Bean 的最终准备。
- 将初始化完成的 Bean 存入容器的缓存(如 Map),供后续获取使用。
2.AOP
AOP即为面向切面编程,AOP可以在不修改代码的前提下,为代码统一新增功能,常用在事务管理,日志记录等场景。我们只需要定义好切入点,普通业务组件,增强处理。
AOP实现原理:
AOP可以通过两种方式实现,一种是JDK动态代理,另一种是CGLib动态代理。
1.JDK动态代理:
Spring默认通过JDK动态代理实现AOP,需要两个组件,一个是InvocationHandler接口,我们需要编写了一个类来实现这个接口然后重写invoke方法,这个类就是我们提供的代理方法,第二个是Proxy类,我们可以通过这个类的newProxyInstance方法返回一个代理对象,生成的代理类实现了原来那个类的所有接口,并对接口的方法进行了代理,我们通过代理对象调用这些方法时,底层将通过反射,调用我们实现的invoke方法。
2.CGLib动态代理
Cglib的实现是在字节码的基础上的,并且使用了开源的ASM读取字节码,对类实现增强功能的。