二.spring ioc 、aop、DI
1.谈谈对spring ioc和aop的理解
(1)ioc
概念:ioc-控制反转,ioc是一种设计思想,spring中对应ioc容器的实现,主要功能就是将创建对象和对象调用交给spring的对象工厂帮忙创建和管理。
原理:ioc容器就是一个对象工厂,它基于工厂模式利用反射创建对象。
好处:有了ioc,我们不用考虑创建对象时复杂的构造器方法参数该如何填,只需描述需要什么样的对象,配置好配置文件和注解,ioc就会帮我们创建并进行依赖的注入。实际项目中,一个类底层可能依赖几百个类,如果想要示例化该类,需要知道底层类的构造函数是很麻烦的,而使用ioc只要配置好,在该引用的地方引用就行,使得耦合性降低,增强项目可维护性,降低开发难度。
(2)aop
概念:aop-面向切面编程,主要功能是在不改变主干功能代码的前提下,增加额外的功能,对业务逻辑进行解耦合。
原理:spring aop利用动态代理模式,有接口创建接口实现类的代理对象;没有接口创建子类的代理对象。
好处:aop的功能使得代码的可重用性增强,耦合度降低。
2.spring aop和aspectj aop有什么区别
(1)原理
spring aop是基于动态代理,如果要代理的对象实现某个接口,那么spring aop就会用jdk proxy去创建对象,没有的用cglib生成子类的代理对象。
aspectj aop是静态代理的方式
(2)spring aop属于运行时增强,aspectj aop属于编译时增强
(3)使用情况
aspectj框架是java系统中较为完整的aop框架,目前spring5已经整合了aspectj框架,aspectj功能更强大,spring aop相对简单,切面多的时候用aspectj,少的时候二者性能差不多。
3.aop有哪些实现方式
实现aop的技术有两种:
(1)静态代理
编译时就可以生成代理类
(2)动态代理
运行时生成动态代理类:
jdk动态代理-被代理类实现一个接口,spring aop就会用jdk proxy去创建对象
cglib动态代理-被代理类没有实现一个接口,spring aop就会用cglib proxy去创建对象,cglib是一个代码生成的类库,会在运行时生成某个类的子类,他是通过继承方式做的动态代理,如果某个类为fianl,无法使用cglib做动态代理的。
4.什么是依赖注入,可以通过多少种方式完成依赖注入
(1)概念
由容器动态的将依赖关系注入到组件中,将组件和服务连接起来,
通过依赖注入机制,只需要在配置文件中描述出哪些组件需要服务,ioc容器会将他们装配起来;
(2)方式
依赖注入有三种方式:构造函数、set方法、接口;
在spring中用到构造函数和set方法的依赖注入
5.区分构造函数注入和setter注入
xml配置文件中bean的属性注入为<constrution-arg>为构造函数注入,<propertys>为set注入;
构造函数注入不会覆盖set属性,set注入会覆盖set属性;
构造函数任意修改都会创建一个新实例,set不会;
适用设置很多属性,适用设置少量属性
6.区分beanfactory和applicationcontext
二者都是ioc容器的实现,beanfactory接口是懒加载的形式,创建该类型的ioc容器时不会创建对象,而是在第一次调用getbean()时才进行对象的创建,一般供内部开发人员使用;applicationcontext接口是beanfactory的子接口,系统启动的时候对象就进行了加载,调用对象时直接获取就行,供外部人员使用。