一.Spring概述:
1.1:Spring的额概念
Spring是由Rod Johnson组织和开发的一个分成的Java一站式轻量级框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,在Sprig中,它会认为一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring所提供的IoC容器,所以Spring是一种基于Bean的编程,它深刻的改变着Java开发世界。
1.2:Spring的优点
Spring作为实现JavaEE的一个全方位应用程序框架,具有一下几个特点:
- 非侵入式
- 容器
- IoC
- 依赖注入
- AOP
1.3:Spring的体系结构
Spring框架(Spring Framework)不断在发展和完善,目前Spring框架由20多个功能模块构成。
1.4:Spring的下载和结构
组成Spring框架的每个模块(或组件)可以单独存在,或者与其他一个或多个模块联合实现。
- Core Container,核心容器提供了Spring的基本功能,它主要由Beans模块,Core模块、Context模块和Spring EL模块组成。
- Data Access/Integration,数据访问/继承层包括JDBC、ORM\OXM\JMS和Transactions模块。
- Web,Web层包括webSocket\Serblrt\Web和Portlet模块。
- 其他模块,Spring的其他模块还有AOP、Aspects、Instrumentation以及Test模块。
Spring的最新版本是5.0.4,本次的代码也是在基于该版本的Spring测试通过,建议也下载该版本。
Spring是一个独立的框架,它不需要依赖于任何Web服务器或容器,既可在独立的Java SE项目中使用,当然也可在Java Web项目中使用。下载Spring框架可按如下步骤进行:
二.搭建Spring的入门程序
(1)登录https://repo.spring.io/webapp/#/artifacts/
browse/tree/General/libs-release-local/ 或者登录http://repo.springsource.org/libs-release-local/,依次找到org–>springframework–>spring的路径进入,既可看到Spring框架各版本的压缩包的下载链接,这里我们选择5.0.4 RELEASE的版本,点击spring-framework-5.0.4.RELEASE-dist.zip下载该文件。
(2)下载完成后,将压缩文件解压缩后得到一个名为spring-framework-5.0.4.RELEASE的文件夹,目录结构如图所示。
(3)在libs目录中,有四个Spring的基础包,分别对应Spring核心容器的四个模块,分别是spring-core-5.0.4.RELEASE.jar、spring-beans-5.0.4.RELEASE.jar、spring-context-5.0.4.RELEASE.jar、spring-expression-5.0.4.RELEASE.jar。
(4)除此之外,使用Spring开发,除使用自带的jar包外,还要依赖于commons-logging的jar包文件,可通过http://commons.apache.org/proper/commons-logging/download_logging.cgi 网址下载。下载完成得到一个commons-logging-1.2-bin.zip的压缩包。将该压缩包解压后,即可找到commons-logging-1.2.jar。
下面通过示例程序来演示Spring框架的简单应用,只用到了 Spring框架而没有使用其它技术,实现步骤如下所示:
(1) 在Eclipse中,创建一个名为“spring-1”的Java项目。
(2) 复制前面叙述的四个Spring的基础包。
(3) 复制日志包commons-logging-1.2.jar。
(4) 将jar包添加到项目的构建路径中。
(5) 在项目中创建com.ssm包,并创建HelloSpring类。
(6) 在项目src目录下创建applicationContext.xml文件。
(7) 在com.ssm包中创建测试类TestHelloSpring。
(8)在Idea中创建spring项目不需要导入基础包
HelloSpring:
package com.ssm;
public class HelloSpring {
private String username;
public void setUserName(String username) {
this.username=username;
}
public void show() {
System.out.println(username+":欢迎来学习Java spring框架");
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置一个bean,将指定类配置给Spring,让spring创建其对象的实例 -->
<bean id="helloSpring" class="com.ssm.HelloSpring">
<!-- 给属性赋值-->
<property name="userName" value="温彬"></property>
</bean>
<beans>
TestHelloSpring
package com.ssm;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TextHelloSpring {
public static void main(String[] args){
//初始化spring容器,加载applicationcontext.xml配置
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取配置中的helliSpring的实例
HelloSpring helloSpring= (HelloSpring) context.getBean("helloSpring");
helloSpring.show();
}
}
在这里插入代码片
## 三.Spring的核心机制:依赖注入/控制反转
3.1依赖注入的概念
- Spring的核心机制就是IoC(控制反转)容器,IoC的另外一个称呼是依赖注入(DI),只不过这两个称呼是从两个角度描述的同一个概念。通过依赖注入,Java EE应用中的各种组件不需要以硬编码的方法进行耦合,当一个Java实例需要其他Java实例时,系统自动提供需要的实例,无需程序显式获取。因此,依赖注入实现了组件之间的解耦
- 依赖注入和控制反转含义相同,当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,传统的方法是由调用者采用“new 被调用者”的方式来创建对象,这种方式会导致调用者和被调用者之间的耦合性增加,对项目的后期升级和维护不利
- 在使用Spring框架后,对象的实例不在由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用程序代码转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转
- 从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这就相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入
- Spring提倡面向接口的编程,依赖注入的基本思想是:明确地定义组件接口,独立开发各个组件,然后根据组件的依赖关系组装运行
3.2依赖注入的类型
(1)构造方法注入:
指Spring容器使用构造方法注入被依赖的实例,构造方法可以是有参数的或者是无参的。在大多数情况下,我们都是通过构造方法来创建类对象,Spring也可以采用反射的方式,通过使用带参数的构造方法来完成注入,每个参数代表着一个依赖,这就是构造方法注入的原理。这种注入方式,如果参数比较少,可读性还是不错的,但参数很多,那么这种构造方法就比较复杂了,这个时候应该考虑属性setter方法注入
package com.ssm.ectity;
public class AdminInfo {
private int id;
private String name;
private String pwd;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public AdminInfo(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public AdminInfo(){
}
public void print(){
System.out.println(id+" -- "+name+" -- "+pwd);
}
}
向applicationContext.xml中添加:
<bean id="adminInfo" class="com.ssm.ectity.AdminInfo">
<property name="id" value="5"/>
<constructor-arg name="name" value="admin"></constructor-arg>
<constructor-arg name="pwd" value="120831"></constructor-arg>
</bean>
TestSpringConstructor测试类:
package com.ssm;
import com.ssm.ectity.AdminInfo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpringConstructor {
public static void main(String[] args){
//加载applicationContext.xml
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取实例
// AdminInfo adminInfo= (AdminInfo) context.getBean("adminInfo");
AdminInfo adminInfo= (AdminInfo) context.getBean("admin");
adminInfo.print();
}
}
运行后控制台输出:
5–admin–120831
(2)属性setter方法注入
指Spring容器使用setter方法注入被依赖的值或对象,是常见的一种注入方式,这种注入方式具有高度灵活性。该方式要求Bean提供一个默认的构造方法,并为需要注入的属性提供对应的setter方法。Spring先调用Bean的默认构造方法实例化Bean,然后通过反射的方式调用setter方法注入属性值。这种方式是Spring最为主要的方式,在实际工作中使用广泛
示例:
<!-- p空间命名空间简化注入 -->
<bean id="admin" class="com.ssm.ectity.AdminInfo" p:id="8"
p:name="yzpc" p:pwd="120831"></bean>
package com.ssm.ectity;
public class AdminInfo {
private int id;
private String name;
private String pwd;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public AdminInfo(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public AdminInfo(){
}
public void print(){
System.out.println(id+" -- "+name+" -- "+pwd);
}
}
3.3依赖注入的示例