一、Spring的概述
- 什么是Spring
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的java开发框架,简单来说,Spring是一个分层的java SE/EE一站式轻量级开源框架。
一站式框架:有EE开发的每一层解决方案
web层:SpringMVC
Service层:Spring的Bean管理,Spring声明式事务
Dao层:Spring的jdbc模板,Spring的ORM模板 - Spring的版本
Spring3.X和Spring4.X
二、Spring的IOC
- Spring的入门(IOC)
什么是IOC
IOC:Inversion of Control(控制反转),将对象的创建权反转给Spring
Spring的开发包
解压后是如下目录
docs: Spring的开发规范和API
libs: Spring的开发的jar和源码
schema: Spring的配置文件的约束 - 创建web项目,引入jar包
- 对于IOC的理解,我认为是在java中免去了实例化对象(new 类名)的步骤,把这一步转交给了一个xml配置文件(就是交给Spring),具体步骤如下。
- 创建一个接口UserDAO,并且创建类UserDAOImpl实现该接口。
- 在src文件夹里面创建一个applicationContext.xml文件。这个文件就是要配置类对象。在Spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html导入下列代码。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
在这个xml文件中的中加入以下代码,注意这个userDAO的id,以及class属性中选中的是UserDAOImpl类。
<bean id="userDAO" class="com.zjw.spring.spring01.impl.UserDAOImpl"></bean>
- 编写测试类,注意测试类中的getBean函数的参数userDAO,对应的是xml中的id,所以创建的是UserDAOImpl的对象。
- 现在是有类的实例化对象了,但是对象的属性能不能也写在配置文件中?
这就需要引入DI的概念,DI,依赖注入,前提是必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
现在在UserDAOImpl类中加入一个属性name,创建name属性的setName。
在配置文件xml中还要加入属性,在原来的标签中加入标签,该标签是在对象中加入值为“郑经纬”的name属性。这样在测试类中创建UserDAOImpl的对象时,对象就会带有该name属性,执行结果如下。
<!--spring的入门配置-->
<bean id="userDAO" class="com.zjw.spring.spring01.impl.UserDAOImpl">
<property name="name" value="郑经纬"></property>
</bean>
- Bean标签中有id和name的配置
id:使用了约束中的唯一约束,里面不能出现特殊字符的。
name:并非使用约束中的唯一约束。(理论上可以出现重复的,但是实际开发不能出现的)里面可以出现特殊字符。 - Bean的生命周期的配置
init-method:Bean被初始化的时候执行的方法
destroy-method:Bean被销毁的时候执行的方法
<!--Spring的Bean生命周期的配置,其中的scope是作用范围,作用范围默认是单例模式-->
<bean id="customerDAO" class="com.zjw.spring.spring01.impl.CustomerDAOImpl" scope="singleton" init-method="setup" destroy-method="destory"></bean>
- Bean的作用范围的配置
scope:Bean的作用范围
- singleton:默认的,Spring会采用单例模式创建这个对象,在单例模式下,创建的对象都是同一个,无论是创建几个对象,其地址都是相同的。创建多个对象只会触发一次init-method函数。
- prototype:多例模式,创建的多个对象其地址都不一样,而且每创建一次对象,都会触发init-method函数。
- request:应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session:应用在web项目中,Spring创建这个类以后,将这个类存入到session范围内。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
- Spring的属性注入
构造函数的方式的属性注入
创建Car类,在Car类中有两个name和price属性,并且有构造函数
xml文件的配置,并不是使用set方法创建属性时的标签,而是使用标签,用法都差不多,只是标签不一样,set方法属性赋值使用,构造方法属性赋值使用。
<!--Spring的属性注入方式-->
<!--构造方法方式-->
<bean id="car" class="com.zjw.spring.spring01.domain.Car">
<constructor-arg name="name" value="陆地巡洋舰"></constructor-arg>
<constructor-arg name="price" value="800000"></constructor-arg>
</bean>
set函数的方式的属性注入
普通属性注入:
<!--set方法的方式-->
<bean id="car02" class="com.zjw.spring.spring01.domain.Car02">
<property name="name" value="普拉多"/>
<property name="price" value="700000"/>
</bean>
对象类型属性的注入,注意ref属性:
<!--set方法注入对象类型的属性-->
<bean id="employee" class="com.zjw.spring.spring01.domain.Employee">
<!--value:设置普通类型的值, ref设置其他的类的id或name-->
<property name="name" value="憨憨"/>
<property name="car02" ref="car02"/>
</bean>
P名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入,在原来xml文件中加入这一句:
普通属性 p:属性名=“值”
<bean id="car02" class="com.zjw.spring.spring01.domain.Car02" p:name="帕拉梅拉" p:price="3000000"></bean>
对象属性 p:属性名-ref=“值”
<bean id="employee" class="com.zjw.spring.spring01.domain.Employee" p:name="信球" p:car02-ref="car02"></bean>
SqEL的属性注入(Spring3.0以后)
SpEL:Spring Expression Language,Spring的表达式语言。在中括号中可以添加字符串,表达式,对象,函数等
用法:#{SqEL}
<!--SpEL的注入方式-->
<bean id="carInfo" class="com.zjw.spring.spring01.domain.CarInfo"></bean>
<bean id="car02" class="com.zjw.spring.spring01.domain.Car02">
<property name="name" value="#{carInfo.getName()}"/>
<property name="price" value="#{carInfo.calculatorPrice()}"/>
</bean>
<bean id="employee" class="com.zjw.spring.spring01.domain.Employee">
<property name="name" value="#{'一男'}"/>
<property name="car02" value="#{car02}"/>
<!--引用对象不加单引号-->
</bean>
集合类型的属性注入