1、什么是Spring
Spring是分层的、JavaSE/EE一站式(full-stack)、轻量级开源框架。
2、Spring的核心
IoC(Inverse of Control 控制反转): 将对象创建权利交给Spring工厂进行管理。 比如说 Book book = new Book();
现在: Book book = Spring工厂.getBook();
AOP(Aspect Oriented Programming 面向切面编程),基于动态代理的功能增强方式。
3、Spring 架构图
1) Spring core:核心容器,提供了 Spring 框架的核心功能。BeanFactory 是 Spring 核心
容器的主要组件。它通过控制反转将应用程序的配置和依赖性规范与实际的应用程序代
码分开,这是整个 spring 的基础。
2) Spring Context:通过配置文件,向 spring 框架提供上下文信息。它构建在 Bean Factory
之上,另外增加了国际化,资源访问等功能。
3) Spring AOP:Spring 提供了面向方面编程的功能,因为 Spring 的核心是基于控制反转
的,所以可以很容易的使用 spring 的依赖注入为 AOP 提供支持。
4) SpringDAO:提供了一个简单而又有效的 JDBC 应用,使用它的 DAO 就足以应付开发人员
的日常应用。
5) Spring ORM:Spring 除了有自己的 JDBC 应用之外,还提供了对其他一些 ORM(对象关
系映射)框架的支持,如:JDO、Hibernate 和 ibatis 等。基于 Spring 的良好设计,这
些开源框架都可以和 Spring 进行良好的结合。
6) Spring Web:提供了简化的处理多部分请求以及请求参数绑定到域对象的任务。
7) Spring MVC:Spring 提供了 MVC 模式的实现,使用起来非常方便,但不强迫开发人员使
用。如果开发人员对其他的 MVC 框架比较熟悉,仍然可以使用它们,Spring 对此提供了
很好的支持,例如:Spring 和 Struts 集成在一起。
4、spring核心API
BeanFactory:bean工厂,上产任意bean。
ApplicationContext:所有配置对象的主接口
ClassPathXmlApplicationContext:加载类路径下的配置文件
FileSystemXmlApplicationContext:加载文件系统下的配置文件
5、Spring IoC快速入门
传统三层架构之间都是一层调用一层,若三层之间任意一层出错,那么另外两层也会相继报错,这充分的体现了三层之间的耦合性很深。为了解决这个难题,Spring为我们提供了很好的解决方式,将创建对象这个功能交给Spring自身提供的配置,只要我们在配置中做一些配置,就可以免去手动创建对象,从而避免三层之间的耦合性。
6、DI依赖注入的实现
在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件(简单的说,可以将另外一个bean对象动态的注入到另外一个bean中。)
Di的做法是:由Spring容器创建了Service、Dao对象,并且在配置中将Dao传入Servcie,那么Service对象就包含了Dao对象的引用。
步骤一:将service对象也交给spring容器管理
applicationContext.xml:
步骤二:在程序中定义属性提供setter方法:
UserServiceImpl.java
步骤三:测试运行,此时获取对象必须从spring工厂获取(在spring容器配置中才有依赖注入,自己创建的对象没有注入依赖关系)
运行结果:
小结:
IOC:控制反转,将对象创建管理的权利交给spring容器,获取对象通过spring工厂创建
DI:在spring容器中创建管理多个对象,通过 property标签将对象注入到需要依赖的对象中
7、【面试题】 BeanFactory和FactoryBean的区别?
BeanFactory:是一个工厂(其实是构建了一个spring上下文的环境,容器),用来管理和获取很多Bean对象。
FactoryBean:是一个Bean生成工具,是用来获取一种类型对象的Bean,它是构造Bean实例的一种方式。
8、Spring单例是默认值,如果需要单例对象,则不需要配置scope=“prototype”。
注意:单例,在容易初始化的时候就初始化了,只创建一次对象
多例:执行getBean的时候才初始化,并且创建多个对象
9、Bean的生命周期
通过spring工厂,可以控制bean的生命周期。
在xml配置Bean的初始化和销毁方法
第一步:创建LifeCycleBean,指定一个init的方法,和一个destroy的方法。
第二步:Spring的核心容器,applicationContext.xml的配置
第三步:SpringTest.java测试代码:
测试时查看控制台打印,发现销毁方法没有执行。
原因:销毁方法的执行必须满足两个条件:
- 单例(singleton)的bean才会可以手动销毁。
- 必须手动关闭容器(调用close的方法)时,才会执行手动销毁的方法。
10、setter方法属性注入 property
【示例】
第一步:创建Person.java,定义id、name、car属性
第二步:配置spring容器applicationContext.xml
第三步:使用SpringTest.java测试:
11、AOP面向切面编程的相关概念
什么是OCP:即开闭原则。
AOP思想:基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强 !
切面:需要代理一些方法和增强代码 。
12、AOP思想编程的机制
AOP的相关术语
Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能
joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些joinpoint进行拦截的定义.
通知定义了切面的”什么”和”何时”,切入点就定义了”何地”.
Advice(通知):所谓通知是指拦截到joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Target(目标对象):代理的目标对象
(织入):是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象
Introduction(引入):在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.