1.Spring简介
Spring是一个基于IOC【Inverse Of Control:反转控制】和Aop【Aspect Oriented Programing:面向切面编程】的企业级开发框架,框架都是半成品,是用来简化开发的。
Spring的官网:https://spring.io/projects/spring-framework#learn
1.1Spring在软件三层架构中的位置
1.2Spring的模块介绍[面试题]![在这里插入图片描述](https://img-blog.csdnimg.cn/20200224204701942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE0MDA5Nw==,size_16,color_FFFFFF,t_70)
Spring框架大约有20个模块,而这20个模块又被重组为几个模块:
Core Container: 主要是IOC的一些相关概念、操作,其它模块都依赖了核心模块
AOP: 面向切面编程
Aspects: 和切面相关
Data Access/Integeration:和数据库打交道
Web模块:和请求相关的
Test: 和测试相关
1.3Spring重要知识点
1.4Spring插件安装
插件地址:
https://spring.io/tools/sts/all
http://dist.springsource.com/release/TOOLS/update/e4.5/
1.5Spring的第一个案例
第一步:导入jar包
第二步:创建一个类,并提供属性的getter、setter方法
第三步:在src目录下配置spring的配置文件【beans.xml或者applicationContext.xml】
第四步:在spring配置文件中配置一个类对象
第五步:写测试代码
1).根据配置文件获取容器对象
2).从容器对象中获取bean对象
2.Spring的IOC【面试题】
2.1简介
IOC:Inverse Of Control:反转控制
定义:具体指的是:将bean对象的创建、bean对象关联关系的维护由原来我们自己去创建,自己去维护关联关系 反转给了spring的容器,由spring的容器来创建并维护对象之间的关联关系。
解决:解决了上层建筑严重依赖下层建筑的问题,实现了上层建筑对下层建筑的控制。
具体实现:xml解析+反射+容器+设计模式
2.2获取容器的三种方式
获取容器的三种方式:
* 1.ClassPathXmlApplicationContext:只是加载类路径【src目录】下的xml配置文件【掌握】
* 2.FileSystemXmlApplicationContext:默认是从本地磁盘加载某个配置文件
* 3.XmlBeanFactory的方式:过时了,了解即可
2.3Bean标签
bean标签:生成类对象
class:指定生成类对象的类,根据这个类,生成该类的对象
id:identifier,表示该bean对象在spring的核心容器中的唯一标识,
name:bean对象的别名,该值也是唯一的
问题1:spring的容器是通过反射,调用无参构造器创建类对象的
问题2:容器中的bean对象默认是在我们创建容器对象的时候就已经创建了,注意:不是在获取该bean对象的时候才创建
问题3:bean对象会创建几次呢?1次,也即:默认容器中的对象都是单例的
2.4bean对象的scope属性
scope:属性:可以指定当前类对象是单例的还是多例的
singleton:表示该类对象是单例的,是随着容器的创建而创建,
prototype:表示该类对象是多例的,获取的时候再创建,获取几次就创建几次,structs2
request:表示每一次请求都会创建一个当前类对象
session:表示每一个会话都会创建一个当前类对象
2.5从容器中获取bean对象的两种方式及区别
从容器中获取bean对象的两种方式:
* 1.通过字节码的方式
* 2.通过容器中bean对象的id值的方式
这两种方式的区别:
* 1.参数不同,一个是字节码类型,一个是字符串类型
* 2.返回值不同:一个是具体的某个字节码类型的对象,另一个是Object类型
* 3.通过字节码的方式获取容器中的bean对象时,要求容器中有该类型的唯一Sbean对象【没有不行、有两个及两个以上也不行】
2.6容器中bean对象的创建时机、底层原理、是否单例
容器中bean对象的创建时机、底层原理、是否单例
* 1.创建时机:容器中的对象默认是在容器加载的时候,容器中的bean对象按着从到下的顺序创建的
* 2.底层原理:反射
* 3.是否单例:默认容器中的对象是单例的,如果想设置成多例的,可以设置bean标签的scope属性
我们把对象放入到容器中不是目的,目的是使用容器中的对象[尤其是交给Java应用程序来使用],那容器中有那么多对象,那么程序怎么能知道该将容器中的哪个对象赋值给该属性呢?这里肯定要遵循一套原则,这套原则就是:依赖注入
注入的原则就是:依赖注入【Dependency Injection】
<bean id="userServlet" class="com.offcn.crm.servlet.UserServlet">
<!-- property属性赋值实际上是调用的该属性的set方法 -->
<property name="userService" ref="userService"></property>
</bean>
从上面可以看出IOC实际上是更为宽泛的概念、思想、而具体实现是DI,DI实现的仅仅是对象关系的维护!而对象本身的创建则属于IOC的范畴!
IOC有DL和DI两种实现方式,但是DL已经被抛弃,因为它需要用户自己去实现API