spring

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
    6
    spring-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
    2
    XMl:
    <bean i’d=“UserDao” class=“Use3rDaoImpl”></bean>
  • 引入约束

    1
    2
    spring-framework-4.2.4.RELEASE-dist\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html:
    beans schema
  • IOC和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相当于session

    Spring属性注入(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
    配置ContextLoaderListener

    1
    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");
    }