1.1:Spring的额概念
Spring是由Rod Johnson组织和开发的一个分成的Java一站式轻量级框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,在Sprig中,它会认为一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring所提供的IoC容器,所以Spring是一种基于Bean的编程,它深刻的改变着Java开发世界。
1.2:Spring的优点
Spring作为实现JavaEE的一个全方位应用程序框架,具有一下几个特点:
1.3:Spring的体系结构
Spring框架(Spring Framework)不断在发展和完善,目前Spring框架由20多个功能模块构成。
1.4:Spring的下载和结构
组成Spring框架的每个模块(或组件)可以单独存在,或者与其他一个或多个模块联合实现。
Spring的最新版本是5.0.4,本次的代码也是在基于该版本的Spring测试通过,建议也下载该版本。
Spring是一个独立的框架,它不需要依赖于任何Web服务器或容器,既可在独立的Java SE项目中使用,当然也可在Java Web项目中使用。下载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
"1.0" encoding="UTF-8"?>
"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创建其对象的实例 -->
"helloSpring" class="com.ssm.HelloSpring">
<!-- 给属性赋值-->
"userName" value="温彬"></property>
</bean>
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依赖注入的概念
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中添加:
"adminInfo" class="com.ssm.ectity.AdminInfo">
"id" value="5"/>
-arg name="name" value="admin"></constructor-arg>
-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空间命名空间简化注入 -->
"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依赖注入的示例
源码地址