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。
从上图可看出Spring Framework Runtime中包含很多模块,Spring的核心是IoC和AOP,相关的模块解释如下:
- 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支持。
- AOP and Instrumentation
l spring-aop:提供AOP支持
l spring-aspects:支持AspectJ的集成
l spring-instrument:对特定应用服务器的代理接口
- Messaging
l spring-messaging:为基于消息的应用提供服务。
- 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服务,包含了对消息的生产和消费相关功能。
- 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实现
- Test
l spring-test:支持对spring组件的单元测试和集成测试。
注入Bean对象的4种方式
- Spring注入Bean对象可通过以下4种方式实现
- 构造方法注入Bean
- Set方法注入Bean
- 静态工厂注入Bean
- 实例工厂注入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三者的作用如下图所示
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三者的作用如下图所示
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对象。