框架:具有约束性的支撑我们完成各种功能的半成品项目,缺乏业务逻辑。
第1章 Spring概述
1.1Spring概述
1)Spring是一个开源框架
2) Spring为简化企业级开发而生,使用Spring,JavaBean就可以实现很多以前要靠EJB才能实现的功能。同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能够实现,而在Spring中却非常的优雅和简 洁。
3) Spring是一个IOC(DI)和AOP容器框架。
4) Spring的优良特性
① 非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API *****用了这种技术后对原来的不造成影响。
② 依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。
③ 面向切面编程:Aspect Oriented Programming——AOP *****OOP是面向对象编程,因为OOP存在某些缺陷,就有了AOP去对OOP进行补充。
④ 容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期
⑤ 组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。 *****把项目中的类交给Spring来管理,降低程序中的耦合
⑥ 一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。
5) Spring模块
1.2 搭建Spring运行时环境
1) 加入JAR包
① Spring自身JAR包:spring-framework-4.0.0.RELEASElibs目录下
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELE2ASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
② commons-logging-1.1.1.jar
2) 在Spring Tool Suite工具中通过如下步骤创建Spring的配置文件
① File->New->Spring Bean Configuration File
② 为文件取名字 例如:applicationContext.xml
第2章 IOC容器和Bean的配置
2.1 IOC和DI
2.1.1 IOC(Inversion of Control):反转控制
****把原来我们对都对象的管理反转给程序本身,让程序管理。
应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
传统方式: 我想吃饭 我需要买菜做饭
反转控制: 我想吃饭 饭来张口
2.1.2 DI(Dependency Injection):依赖注入
****注入就是赋值,依赖比如车类要有方向盘类
IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。
总结: IOC 就是一种反转控制的思想, 而DI是对IOC的一种具体实现。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- 7 <bean>:定义spring所管理的一个对象 8 id:该对象的唯一标示,注意:不能重复,在通过类型获取bean的过程中可以不设置 9 class:此对象所属类的全限定名 10 --> 11 <bean id="personOne" class="com.atguigu.spring.mod.Person"> 12 <!-- 13 <property>:为对象的某个属性赋值 14 name:属性名 15 value:属性值 16 --> 17 <property name="id" value="1111"></property> 18 <property name="name" value="小明"></property> 19 </bean> 20 21 <bean id="personTwo" class="com.atguigu.spring.mod.Person"> 22 <property name="id" value="2222"></property> 23 <property name="name" value="小红"></property> 24 </bean> 25 26 </beans>
2.3 给bean的属性赋值
2.3.1 依赖注入的方式
1. 通过bean的setXxx()方法赋值
2. 通过bean的构造器赋值
1) Spring自动匹配合适的构造器
1 <bean id="book" class="com.atguigu.spring.bean.Book" > 2 <constructor-arg value= "10010"/> 3 <constructor-arg value= "Book01"/> 4 <constructor-arg value= "Author01"/> 5 <constructor-arg value= "20.2"/> 6 </bean >
2) 通过索引值指定参数位置
1 <bean id="book" class="com.atguigu.spring.bean.Book" > 2 <constructor-arg value= "10010" index ="0"/> 3 <constructor-arg value= "Book01" index ="1"/> 4 <constructor-arg value= "Author01" index ="2"/> 5 <constructor-arg value= "20.2" index ="3"/> 6 </bean >
3) 通过类型区分重载的构造器
1 <bean id="book" class="com.atguigu.spring.bean.Book" > 2 <constructor-arg value= "10010" index ="0" type="java.lang.Integer" /> 3 <constructor-arg value= "Book01" index ="1" type="java.lang.String" /> 4 <constructor-arg value= "Author01" index ="2" type="java.lang.String" /> 5 <constructor-arg value= "20.2" index ="3" type="java.lang.Double" /> 6 </bean >
2.3.2 p名称空间
为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息。Spring 从2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性。
使用p命名空间后,基于XML的配置方式将进一步简化。
1 <bean 2 id="studentSuper" 3 class="com.atguigu.helloworld.bean.Student" 4 p:studentId="2002" p:stuName="Jerry2016" p:age="18" />
2.3.3 可以使用的值
1. 字面量 (能把这个值写成字符串的形式就是字面量比如说所有的基本数据类型和他们对应的包装类)
1) 可以使用字符串表示的值,可以通过value属性或value子节点的方式指定
2) 基本数据类型及其封装类、String等类型都可以采取字面值注入的方式
3) 若字面值中包含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来
ref属性
给bean的级联属性赋值 teacher.tname
1 <bean id="s4" class="com.atguigu.spring.di.Student" p:id="10033" p:name="赵六" p:age="26" p:sex="男" p:teacher-ref="teacher"></bean>
2
3 <bean id="s5" class="com.atguigu.spring.di.Student">
4 <property name="id" value="10055"></property>
5 <property name="name" value="张三三"></property>
6 <property name="age" value="23"></property>
7 <property name="sex" value="男"></property>
8 <property name="teacher" ref="teacher"></property>
9 <property name="teacher.tname" value="小红"></property>
10 </bean>
11
12 <bean id="teacher" class="com.atguigu.spring.di.Teacher">
13 <property name="tid" value="10000"></property>
14 <property name="tname" value="小明"></property>
15 </bean>
1. 内部bean
当bean实例仅仅给一个特定的属性使用时,可以将其声明为内部bean。内部bean声明直接包含在<property>或<constructor-arg>元素里,不需要设置任何id或name属性
内部bean不能使用在任何其他地方,
1 <bean id="s6" class="com.atguigu.spring.di.Student"> 2 <property name="id" value="10066"></property> 3 <property name="name" value="崔八"></property> 4 <property name="age" value="18"></property> 5 <property name="sex" value="男"></property> 6 <property name="teacher"> 7 <bean id="tt" class="com.atguigu.spring.di.Teacher"> 8 <property name="tid" value="2222"></property> 9 <property name="tname" value="admin"></property> 10 </bean> 11 </property> 12 </bean>
<!-- 定义在某个bean内部的bean,只能在当前bean中使用 -->
2.4 集合属性
在Spring中可以通过一组内置的XML标签来配置集合属性,例如:<list>,<set>或<map>。
1 <bean id="t1" class="com.atguigu.spring.di.Teacher"> 2 <property name="tid" value="10001"></property> 3 <property name="tname" value="佟刚"></property> 4 <property name="cls"> 5 <list> 6 <value>A</value> 7 <value>B</value> 8 <value>C</value> 9 </list> 10 </property> 11 </bean> 12 13 <bean id="t2" class="com.atguigu.spring.di.Teacher"> 14 <property name="tid" value="10002"></property> 15 <property name="tname" value="婷姐"></property> 16 <property name="students"> 17 <list> 18 <ref bean="s1"/> 19 <ref bean="s2"/> 20 <ref bean="s3"/> 21 </list> 22 </property> 23 </bean>
2.4.2 Map
Java.util.Map通过<map>标签定义,<map>标签里可以使用多个<entry>作为子标签。每个条目包含一个键和一个值。
必须在<key>标签里定义键。
因为键和值的类型没有限制,所以可以自由地为它们指定<value>、<ref>、<bean>或<null/>元素。
可以将Map的键和值作为<entry>的属性定义:简单常量使用key和value来定义;bean引用通过key-ref和value-ref属性定义。
1 <bean id="t3" class="com.atguigu.spring.di.Teacher"> 2 <property name="tid" value="10003"></property> 3 <property name="tname" value="admin"></property> 4 <property name="bossMap"> 5 <map> 6 <entry> 7 <key> 8 <value>10001</value> 9 </key> 10 <value>佟老师</value> 11 </entry> 12 <entry> 13 <key> 14 <value>10002</value> 15 </key> 16 <value>陈老师</value> 17 </entry> 18 </map> 19 </property> 20 </bean>
2.4.3 集合类型的bean
如果只能将集合对象配置在某个bean内部,则这个集合的配置将不能重用。我们需要 将集合bean的配置拿到外面,供其他bean引用。
配置集合类型的bean需要引入util名称空间
1 <bean id="t4" class="com.atguigu.spring.di.Teacher"> 2 <property name="tid" value="10004"></property> 3 <property name="tname" value="root"></property> 4 <property name="students" ref="students"></property> 5 </bean> 6 7 <util:list id="students"> 8 <ref bean="s4"/> 9 <ref bean="s5"/> 10 <ref bean="s6"/> 11 </util:list> 12 13 <util:map id="map"> 14 <entry> 15 <key> 16 <value>1</value> 17 </key> 18 <value>张三</value> 19 </entry> 20 </util:map> 21 </beans>