IOC和AOP是Spring的两大核心特征,也是面试常考点。
Spring IOC
IOC即是控制反转,顾名思义是反转Spring中的控制过程,将对对象的控制交给外部容器来进行。简单来说就是将对象的创建-初始化-销毁等过程交给Spring来做,而不是由开发者进行管理。
在原来进行对象创建和使用时,需要开发者主动创建(new)对象,然后接着对其进行各种其他操作
但是如果使用IOC的方式,IOC的容器底层实现了对象工厂,它会进行如下过程:
1)向工厂请求获取对象,然后工厂为其创建对象,这一步是被动
2)使用xml配置文件,配置刚创建的对象,修改xml的bean路径
3)xml文件对路径进行解析
4)通过反射得到类的.class文件,从而得到类的内容
IOC实现了两个接口:一个是底层的对象工厂beanfactory接口,另一个是ApplicationContext接口。
beanfactory接口将注入的xml进行实例化,调用它会创建对象
ApplicationContext是beanfactory的子接口,一旦读取配置文件就会创建对象,它的实现类有两个,一个是从类的根路径加载配置文件ClasspathXmlApplicationContext,另一个是从磁盘路径加载配置文件FileSystemXmlApplicationContext
factorybean是bean的生成工具,会对beanfactory进行实例化
提到IOC就不得不提一下DI(依赖注入),控制反转就是将获取依赖对象的方式进行反转。Spring的依赖注入方式有四种:
1)构造器注入
2)setter方法注入
3)静态工厂注入
4)实例工厂注入
Spring AOP
Spring AOP是面向切面的技术。在系统中如果需要添加辅助功能如权限功能,日志功能等这些通常贯穿于系统的各个部分,如果使用普通方式进行添加,则会大大增加系统的复杂度,但这些功能却是与业务无关的。
AOP剖解开封装的对象内部,并将那些影响了多个类的公共模块进行封装,形成一个可重用的模块,并将其使用注解命名为Aspect,即切面。所谓切面,就是指那些与业务无关,却为业务代码所共同调用的逻辑,将这些封装起来,以减少系统的重复代码,降低模块之间的耦合度。
使用横切技术,AOP把系统分为两个部分,核心关注点和横切关注点。核心关注点是业务,与之关系不大的则是横切关注点。如:日志、权限认证、事务。AOP的作用在于分离软件系统的各种关注点。
AOP的两种代理方式:Spring提供了两种方式来生成代理对象:JDKProxy和Cglib。默认的策略是如果目标类是接口则使用JDKProxy,反之则使用Cglib