Spring概述
- 是一个开源框架,于2003年兴起的一个java轻量级开发框架,是一个分层的java se/ee开发的一站式开源框架
- 优点:轻量,控制反转(IOC),面向切面,容器,框架,MVC
- Spring三层:
WEB层:SpringMVC
Service层:Spring的Bean管理,Spring声明式事务
Dao层:Spring的JDBC模板,Spring的ORM模块
Spring优点
- 方便解耦合
- AOP的开发:对程序进行扩展
- 轻量级框架
- 方便与其他框架整合
Spring包
- Spring-framework-4.X.XRELEASE-dependencies.zip:Spring依赖库
- Spring-framework-4.X.XRELEASE-dist.zip:核心包
Spring-framework-4.X.XRELEASE-dist/docs:开发规范和API
Spring-framework-4.X.XRELEASE-dist/libs:核心jar包和源码
Spring-framework-4.X.XRELEASE-dist/schema:配置文件的约束 - Spring-framework-4.X.XRELEASE-docs.zip:文档
- Spring-framework-4.X.XRELEASE-schema.zip:约束
SpringIOC的XML开发(IOC:Inversion of Control(控制反转))
包、依赖
- 通过xml文件,将对象的创建权反转给(交给)Spring
相关包文件:
1
2
3
4
5
6spring-beans-4.2.4.RELEASE.jar(实体类包)
spring-context-4.2.4.RELEASE.jar(核心扩展包)
spring-core-4.2.4.RELEASE.jar(核心包)
spring-expression-4.2.4.RELEASE.jar(Spring el表达式包)
com.springsource.org.apache.commons.logging-1.1.1.jar(日志接口)
com.springsource.org,apache.log4j-1.2.15.jar(log4j日志记录工具包)通过BeanFactory(工厂)切换底层实现类,消除哦耦合
BeanFactory对Xml进行解析,通过xml中的id找到其实现类进行反射,返回实例
1
2XMl:
<bean i’d=“UserDao” class=“Use3rDaoImpl”></bean>引入约束
1
2spring-framework-4.2.4.RELEASE-dist\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html:
beans schemaIOC和DI
DI:依赖注入,前提是必须有IOC的环境,Spring管理这个类的时候将类的依赖注入(设置property属性)
Spring的工厂类
BeanFactory(老版本工厂类)
- BeanFactory:调用个体Bean的时候,才会生成类的实例
ApplicationContext(新版本工厂类)
- ApplicationContext底层继承了BeanFactory
- ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化
- ApplicationContext有两个实现类
ClassPathXmlApplicationContext:加载类路径下的配置文件(src路径下)
FileSystemXmlApplicationContext:加载文件系统下的配置文件(磁盘路径下)
Spring Bean管理
id、name
- id :使用了约束中的唯一约束,不能出现特殊字符
name :没有使用约束中的唯一约束,可以出现特殊字符(理论上可以出现重复,但实际开发不能出现)
Spring和struts1框架整合的时候(struts1中action注入id名必须加上斜杠)
1
<bean id="/user" class=''>
class:需要生成的实例类的全路径
Bean生命周期的配置
- init-method :Bean被初始化时执行的方法
- destroy-method :Bean被销毁时执行的方法,需要从实体类中调用(Bean作为单例模式创建时)
Bean作用范围的配置
- scope :Bean的作用范围
singleton :默认的,Spring会采用单例模式创建这个对象
prototype :多例模式(struts2与Spring整合时,action采用多例模式)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中
session :用用在web项目中,Spring创建这个类以后,将这个类存入到session范围中
globalsession(全局session) :应用到web项目中,必须在porlet环境下使用,如果没有这种环境,globalsession相当于sessionSpring属性注入(DI)
- 三种注入方式
构造方法方式
1
2
3
4
5
6 public class user{
private String name;
public user(String name){
this.name = name;
}
}
set方法方式
1
2
3
4
5
6 public class user{
private String name;
public void setName(String name){
this.name = name;
}
}
接口注入方式
1
2
3
4
5
6
7
8
9 public interface user{
public void setName(String name);
}
public class userImpl implements user{
private String name;
public void setName(String name){
this.name = name;
}
}
- Spring支持构造方法注入和set方法注入
构造方法属性注入
1
2
3
4
5
6
7
8
9
10
11
12 <!-- 构造属性注入的方式 -->
<bean id="car" class="com.zfhzxg.spring.demo3.Car">
<constructor-arg name="name" value="zfhzxg"/>
<constructor-arg name="p" value="BMW"/>
</bean>
<!-- 构造对象属性注入的方式 -->
<!-- value用来设置普通属性值,ref用来设置其他的类的id和name -->
<bean id="emp" class="com.zfhzxg.spring.demo3.Emp">
<constructor-arg name="name" value="zfhzxg"/>
<constructor-arg name="car2" ref="car2"/>
</bean>
set方法属性注入
1
2
3
4
5
6
7
8
9
10
11
12 <!-- set属性注入的方式 -->
<bean id="car2" class="com.zfhzxg.spring.demo3.Car2">
<property name="name" value="zhxzgd"/>
<property name="p" value="BMW"/>
</bean>
<!-- set对象属性注入的方式 -->
<!-- value用来设置普通属性值,ref用来设置其他的类的id和name -->
<bean id="emp" class="com.zfhzxg.spring.demo3.Emp">
<property name="name" value="zhxzgd"/>
<property name="car2" ref="car2"/>
</bean>
P名称空间属性注入(通过引入P名称空间来完成该属性的注入,Spring2.5之后)
1
2
3
4
5
6 xmlns:p="http://www.springframework.org/schema/p"
<!-- 不能输用构造函数-->
<!-- 普通属性 P:属性名="值"; -->
<!-- 对象属性 P:属性名-ref="值"; -->
<!-- p名称空间注入方式 -->
<bean id="car2" class="com.zfhzxg.spring.demo3.Car2" p:name="zfhzxg" p:p="BMW"></bean>
SpEL的属性注入(Spring Expression Language,Spring3.0之后)
1
2
3
4
5
6
7
8
9
10
11
12 语法:
#{SpEL}//可以进行逻辑运算,调用对象和方法的值
<!-- SpEL的属性注入方式 -->
<bean id="carInfo" class="com.zfhzxg.spring.demo3.CarInfo"></bean>
<bean id="car2" class="com.zfhzxg.spring.demo3.Car2">
<property name="name" value="#{carInfo.name}"/>
<property name="p" value="#{carInfo.calculaorPrice()}"/>
</bean>
<bean id="emp" class="com.zfhzxg.spring.demo3.Emp">
<property name="name" value="#{'zhxzgd'}"/>
<property name="car2" value="#{car2}"/>
</bean>
集合类型属性注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 <!-- Spring集合属性注入 -->
<bean name="collectionBean" class="com.zfhzxg.spring.demo4.CollectionBean">
<!-- 注入数组类型和list一样 -->
<property name="arrs" >
<list>
<!-- 对象用ref -->
<value>zfhzxg</value>
<value>zhxzgd</value>
</list>
</property>
<property name="list" >
<list>
<!-- 对象用ref -->
<value>123</value>
<value>321</value>
</list>
</property>
<property name="set" >
<list>
<!-- 对象用ref -->
<value>abc</value>
<value>cba</value>
</list>
</property>
<!-- 此处面向对象使用value-ref -->
<property name="map" >
<map>
<entry key="aaa" value="111"></entry>
<entry key="bbb" value="222"></entry>
</map>
</property>
</bean>
分模块开发配置
1
2
3
4
5 一、直接加载多文件:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext1.xml","applicationContext2.xml");
二、在applicationContext1.xml中引入其他配置文件:
<import resource="applicationContext2.xml"/>
<import resource="applicationContext3.xml"/>
SpringIOC的注解
- 在Spring4的版本中,除了需要引入基本的四个开发包意外,还需要引入aop的包
Spring的web项目资源浪费(与struts2整合)
- web每次请求都会创建Spring的工厂,浪费服务器资源
- 解决:
在服务器启动的时候创建Spring的工厂
将工厂保存到ServletContext中
每次获取工厂都从ServletContext中获取 - 整合:
引入spring_web.jar
配置ContextLoaderListener1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<!-- 配置Spring的核心监听器 -->
<!-- ContextLoaderListener底层实现ServletContextListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 默认加载的是/WEB-INF/applicationContext.xml -->
<!-- 修改加载配置文件的路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
获取工厂:
public String getApplicationContext() {
ServletContext serviceContext = ServletActionContext.getServletContext();
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(serviceContext);
CustomerService customerService = (CustomerService)applicationContext.getBean("customerService");
}