Spring简介
Spring概述:
Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
Spring的优点:
- 降低了组件间的耦合,实现了应用个层次的解耦;
- 可以使用提供的众多服务,例如事务管理、消息服务等;
- 容器提供了单例模式;
- 容器提供了AOP技术,很容易实现日志跟踪和权限控制等;
- Spring对主流的框架进行了集成,例如mybatis、hibernate、structs等;
- Spring的高度开放性,让应用可以选择不完全依赖Spring,可以自由选择部分或者全部;
Spring的目的:
就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置,内部通过反射去动态的组装对象)。Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。 Spring里用的最经典的一个设计模式就是:模板方法模式。
DI原理
DI的定义:
依赖注入(Dependency Injection),有三种方式: 1) 接口注入 2) Construct注入 3) Setter注入IOC原理
IOC的定义:
控制反转(Inversion of Control)。应用本身不依赖对象的创建和维护,而是将这种权利交给spring容器来做,将应用和对象进行解耦。对于某个具体的对象而言,以前是对象控制其他对象,现在是所有对象都被spring容器控制,所以叫控制反转。在系统运行中,动态地向某个对象提供他所需要的对象。
IOC的实现:
依赖注入(控制反转)的思想是通过反射机制实现的(在运行时动态的去创建、调用),在实例化一个类时,通过反射调用类中的set方法将实现保存在HashMap中的类属性注入到类中。总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在Spring中创建被调用者的工作由Spring来完成,然后注入调用者,这就是依赖注入或者控制反转。
IOC的优点:
- 降低了组件(类)之间的耦合;
- 倡导面向接口编程、实施依赖倒换原则;
- 降低了业务对象之间替换的复杂性,能灵活的管理对象;
AOP原理
AOP定义:
AOP即面向切面编程,与之对应的是OOP(面向对象编程)。基于IOC,是对OOP的补充。把一些贯穿在各个模块之间相同的功能抽象出来,然后封装成一个面(aspect)。
AOP概念:
- 连接点(JoinPoint):被拦截到的点。程序执行过程中的行为,如方法的调用或特定的异常被抛出,在代码上有JoinPoint类和ProceedingJoinPoint类,如下所示,可以通过JoinPoint获取很多参数,JoinPoint一般用在Advice实现方法中作为参数传入,ProceedingJoinPoint用于实现围绕Advice的参数传入。 通过下面JoinPoint的接口可以看出通过JoinPoint可以得到代理对象和Target对象。
- 通知(Advice):拦截JoinPoint之前与之后要做的事;
- 切入点(PointCut):对JoinPoint进行拦截的定义;
- 目标对象(Target):代理的目标对象;
- 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现,可以通过@Aspect注解或者在applicationContext.xml中配置:<aop:aspect id="xxx" ref="xxx"/>
AOP使用场景:
权限控制、日志记录/跟踪、异常处理、延迟加载、事务处理等。
Spring实现AOP:
- JDK动态代理:其代理对象必须是某个接口的实现,通过在运行期间创建一个接口的实现类来完成对目标对象的代理,核心类是InvocationHandler和Proxy;
- CGLIB动态代理:实现原理与JDK动态代理类似,只是在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是搞笑的代码生成包,底层是ASM(Java字节码编辑类库)操作字节码实现的,性能比JDK强,需要asm.jar和cglib.jar;
- 使用AspectJ和@AspectJ底层也是通过动态代理实现;