Spring
Spring是一个轻量级框架,可以一站式构建你的企业级应用。
Spring的模块大概分为6个。分别是:
1、Core Container(Spring的核心)【重要】
2、AOP(面向切面变成)【重要】
3、Messaging(消息发送的支持)
4、Data Access/Integration(数据访问和集成)
5、Web(主要是SpringWeb内容,包括MVC)【重要】
6、Test(Spring测试支持,包含JUint等测试单元的支持) 7、Instrumentation(设备支持,比如Tomcat的支持)
两个核心部分:IOC(控制反转)、AOP(面向切面编程)
IOC:
IOC:IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”。
引入IOC的目的:
(1)脱开、降低类之间的耦合;
(2)倡导面向接口编程、实施依赖倒换原则;
(3)提高系统可插入、可测试、可修改等特性。
两种实现: 依赖查找(DL)和依赖注入(DI)
DL 已经被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。即有侵入性。
DI 是 Spring 使用的方式,容器负责组件的装配。
Spring 的 IoC 设计支持以下功能:
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化方法和销毁方法
- 支持回调某些方法(但是需要实现 Spring 接口,略有侵入)
DI依赖注入三种方式:
-
setter注入:
在依赖类中有一个setter函数,该函数实现将被依赖对象赋值为依赖对象
比较灵活,可以有选择性地注入需要的对象
这种方式学霸和学渣只是暂时的合作关系,如果学渣赖上了另一个学霸(调用set()方法传入了另一个对象),那么学渣和学霸的合作关系就结束了。
在依赖对象初始化完成后,它的需要注入的属性值还未赋值,所以暂时不可使用 -
构造器注入 :
将被依赖对象通过构造函数的参数注入给依赖对象,在依赖对象初始化的时候实现注入。
在对象初始化完成后就获得了可以使用的对象。
依赖对象的属性值,就一直是被依赖对象的值了,建立了长期的关系。
当需要注入的对象很多时,构造器的参数列表会很长
通过反射构造对象的时候,构造方法无法被继承,无法设置默认值。
不够灵活。在有很多中注入方式的时候,每种方式只需注入指定几个依赖,(对于非必须的依赖处理)那么就需要提供多个重载的构造函数,比较麻烦。 -
接口注入:依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象。
采用这种注入方式,学渣只是在做作业时,才临时抱佛脚地找一下学霸。
接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。
侵入行太强,不建议使用。(如果类A要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入性。)
自动注入:
- no:不进行自动装配,手动设置Bean的依赖关系。
- byName:根据Bean的名字进行自动装配。(@Resource默认方式)
- byType:根据Bean的类型进行自动装配。(@AutoWired默认方式)
- constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。
- autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配
AOP
如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。
b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译期(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。
f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。