1、Spring是什么?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
2、spring有哪些模块组成
- Spring Core:核心类库,提供IOC服务;
- Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
- Spring AOP:AOP服务;
- Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
- Spring ORM:对现有的ORM框架的支持;
- Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
- Spring MVC:提供面向Web应用的Model-View-Controller实现。
2、什么是IOC、DI 及其两者的优点 、 有哪几种注入方式
IOC:控制反转,把创建对象的控制权利由代码转移到spring的配置文件中。
最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
DI:依赖注入,在程序运行期间,由外部容器动态地将依赖对象注入到组件中。简单定义就是当一个对象需要另一个对象时,可以把另一个对象注入到对象中去。
优点就是把应用的代码量降到最低,达到松散耦合度。
注入的方式:
- 构造注入
- Set注入
- 接口注入
Spring提供以下几种集合的配置元素:
<list>
<set>
<map>
<props>类型用于注入一组键值对,键和值都只能为String类型。
3、谈谈对AOP理解?
Spring AOP使用的动态代理,就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。动态代理可以减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证、日志、事务处理。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
JDK代理:基于接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler);
CGLIB动态代理:如果代理类没有实现 InvocationHandler 接口(或者说是基于父子类的),那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的
Enhancer是一个非常重要的类,它允许为非接口类型创建一个JAVA代理,Enhancer动态的创建给定类的子类并且拦截代理类的所有的方法,和JDK动态代理不一样的是不管是接口还是类它都能正常工作
sping的动态代理通过代理类为目标对象增加额外功能。
代理本质 = 目标对象+额外功能+代理对象的接口
开发步骤:
1,创建原始对象
2,提供额外功能(实现下面的接口)
- MethodBeforeAdvice 额外功能需要运行在原始方法之前执行.
- AfterReturningAdvice 额外功能需要运行在原始方法之后执行
- MethodInterceptor 额外功能需要运行在原始方法之前 后执行
- ThrowsAdvice 额外功能运行在原始方法抛出异常的执行
3,配置切入点
<aop:pointcut id="pc" expression="execution(* *(..))"/>
4,组装切入点和代理功能
<aop:advisor pointcut-ref="pc" advice-ref="代理功能的bean"/>