Java框架–Spring (一)(实战开发)

Spring简介

  • Spring是JavaEE应用程序框架,是轻量级的IoC(Inversion of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,Hibernate框架等组合使用。
  • 官方网址是https://spring.io,从官网网站可以下载Spring框架相关的文件。
  • Spring 框架由Rod Johnson编写并在2003年6月首次发布。经过多年的迭代,Spring经历了多个版本,本书讲解的是4.3.10版本。Spring提供了模块化的组件,开发中可根据需要选择相应的模块。下图是Spring官方的Spring Framework Runtime。

java cs端开发 框架_实例化

从上图可看出Spring Framework Runtime中包含很多模块,Spring的核心是IoC和AOP,相关的模块解释如下:

  1. Core Container

Core Container是Spring的核心模块,该模块实现了Ioc和DI,该模块包括Beans、Core、Context、SpEL。

l spring-core,spring-beans:提供基础功能,包括IoC和DI等特性。对依赖起到解耦作用。

l spring-context:上下文模块,基于core和beans构建,用于访问beans对象,支持国际化、事件传播、资源加载,并且还包含ApplicationContext。

l spring-expression:提供SpEL支持。

  1. AOP and Instrumentation

l spring-aop:提供AOP支持

l spring-aspects:支持AspectJ的集成

l spring-instrument:对特定应用服务器的代理接口

  1. Messaging

l spring-messaging:为基于消息的应用提供服务。

  1. Data Access/Integration

l spring-jdbc:提供对JDBC的支持。

l spring-tx:对编程式和声明式事务管理的支持。

l spring-orm :提供对ORM(JPA, JDO, Hibernate)的支持。

l spring-oxm:对Object/XML映射的集成支持。

l spring-jms:JMS服务,包含了对消息的生产和消费相关功能。

  1. spring-web

l spring-web提供基本的面向web应用的特性,例如文件上传、面向web的Ioc容器和context、HTTP client、web相关的远程调用。

l spring-webmvc:包含了用于web应用的spring的MVC和REST Web Service实现。

l spring-websocket:WebSocket和SockJS的实现,包含了对STOMP的支持

l spring-webmvc-portlet:提供用于portlet环境的的MVC实现

  1. Test

l spring-test:支持对spring组件的单元测试和集成测试。

注入Bean对象的4种方式

  • Spring注入Bean对象可通过以下4种方式实现
  1. 构造方法注入Bean
  2. Set方法注入Bean
  3. 静态工厂注入Bean
  4. 实例工厂注入Bean

1.构造方法注入Bean

构造方法注入Bean是指Spring容器在创建Bean对象时,通过构造方法将被依赖的对象注入给属性。

第一步:将Boy类重构,添加构造方法

package it.spring;
public class Boy {
    IPet pet; //构造方法 
    public Boy(IPet pet) {
        this.pet = pet; 
    } 
    //省略部分代码
}

第二步:修改Bean配置

<bean id="boy" class="it.spring.Boy"> 
    <constructor-arg index="0" type="it.spring.IPet" ref="cat"> </constructor-arg>
</bean>

说明:

  • constructor-arg:配置构造方法的参数
  • index:构造方法参数的下标
  • type:构造方法参数的类型
  • ref:向构造方法注入的对象名
  • 如果被创建的Bean对象的构造方法是无参数的,则省略节点。

2 . set方法注入Bean

set方法注入Bean是指调用对象的set方法,将被注入的对象传给方法的形参,在方法内部将传入的形参注入给属性。

第一步:定义set方法

本例中定义了setPet(IPet pet)方法

package it.spring;
public class Boy { 
    private IPet pet; //set方法注入Bean
    public void setPet(IPet pet) { 
        this.pet = pet;
    }
}

第二步:定义Bean配置

说明:

  • 将cat对象注入给pet属性。
  • name属性的值是set方法的名称去掉set后首字母小写的方法名称。本例中的pet是setPet()方法的名称去掉set后首字母小写的名称。

3.静态工厂注入Bean

静态工厂注入Bean是指先定义一个专门类,该类中定义静态方法,静态方法负责创建和注入Bean对象。把这个创建Bean对象的类称为静态工厂类。

第一步:定义静态工厂类

package it.spring.factory;
import it.spring.Boy;
/**** 静态工厂类*/
public class BoyStaticFactory{ 
    /** * 静态工厂方法 * @return Boy对象 */ 
    public static Boy createInstance() { 
        return new Boy();
    }
}

说明:

  • BoyStaticFactory类是静态工厂类,用于生产Bean对象。
  • createInstance()方法是生产Bean对象的静态方法。
  • 复杂的bean创建使用使用实例工厂。

第二步:修改Bean配置

<bean id="boy" class="it.spring.factory.BoyStaticFactory" factory-method="createInstance"> 
    <property name="pet" ref="cat"></property>
</bean>

说明:

  • id是被创建的Bean名称
  • class:创建Bean的静态工厂类
  • factory-method:创建Bean的静态工厂方法
  • id,class,factory-method三者的作用如下图所示

java cs端开发 框架_java cs端开发 框架_02

4.实例工厂注入Bean

实例工厂注入Bean是指先定义一个专门类,该类中定义实例方法,实例方法负责创建和注入Bean对象。把这个创建Bean对象的类称为实例工厂类。

第一步:定义实例工厂类

package it.spring.factory;
import it.spring.Boy;
/*** 实例工厂类*/
public class BoyInstanceFactory {
    /** * 实例工厂方法 * @return Boy对象 */
    public Boy createInstance() { 
        return new Boy();
    }
}

说明:

  • BoyInstanceFactory是实例工厂类,用于生产Bean对象。
  • createInstance()方法是生产Bean对象的实例方法。
  • 复杂的bean创建使用使用实例工厂。

第二步:修改Bean配置

<bean id="factory"  class="it.spring.factory.BoyInstanceFactory"></bean>
<bean id="boy" factory-bean="factory" factory-method="createInstance"> 
    <property name="pet" ref="cat"></property>
</bean>

说明:

  • 首先通过Spring容器创建实例工厂对象factory
  • id是被创建的Bean名称
  • factory-bean:创建Bean的实例工厂类对象
  • factory-method:创建Bean的实例工厂方法
  • id, factory-bean,factory-method三者的作用如下图所示

java cs端开发 框架_java cs端开发 框架_03

Bean的作用域

Bean对象的作用域是指Bean对象的使用范围。在Spring的配置文件中使用scope属性设置Bean的作用域。例如:

<bean id="cat" class="it.spring.Cat" scope="singleton"></bean>

scope的值可以是singleton、prototype、request、session中的任意一个,区别如下:

1.singleton:当一个bean的作用域为singleton,表示bean对象是单例模式的。Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton作用域是Spring中的默认作用域。

2.prototype:当一个bean的作用域为prototype,表示bean对象是原型模式的。prototype作用域的bean会导致在每次对该bean请求时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

3.request:当一个bean的作用域为request,表示bean对象是请求模式的。在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。针对每次HTTP请求,Spring容器都会创建一个全新的bean实例,且该bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

4.session:当一个bean的作用域为session,表示bean对象是会话模式的。在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。针对某个HTTP Session,Spring容器会根据bean定义创建一个全新的bean实例,且该bean仅在当前HTTP Session内有效。与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

懒加载

  • 懒加载(Lazy)是指在启动Spring容器时不实例化bean对象,而是在需要对象时实例化bean对象。懒就是不提前准备好bean对象,需要bean对象时才实例化bean对象,有懒惰的表现。
  • 当Scope="singleton"时,表示Spring容器启动时实例化Bean对象;Scope="prototype"时,表示调用getBean()时初实例化Bean对象,而不是在容器启动时实例化Bean对象。

Bean的生命周期

懒加载

  • 懒加载(Lazy)是指在启动Spring容器时不实例化bean对象,而是在需要对象时实例化bean对象。懒就是不提前准备好bean对象,需要bean对象时才实例化bean对象,有懒惰的表现。
  • 当Scope="singleton"时,表示Spring容器启动时实例化Bean对象;Scope="prototype"时,表示调用getBean()时初实例化Bean对象,而不是在容器启动时实例化Bean对象。

Bean的生命周期

Bean的生命周期是指Bean从实例化到销毁的过程。Spring容器在实例化对象时会调用init-method属性指定的方法,进行一些初始化操作,如连接数据库。Bean对象销毁时会调用destroy-method属性指定的方法,做一些释放资源的操作。当spring容器关闭时,对象会被销毁,注意这种方式销毁的是singleton模式的bean对象。