文章目录
一、Spring框架因何而来
- Spring
Framework的发明与Java规范的变迁有着千丝万缕的联系,在Java规范的早期版本中,Sun公司针对不同的开发场景创建了不同的规范,以此帮助Java开发者更高效、更专注地开发业务逻辑,这些规范包括J2SE、J2ME及专门为企业级应用打造的J2EE,而EJB规范又是当时J2EE规范中最核心的部分。 - EJB
1.0发布于1999年,它最初由IBM提出,之后由Sun公司(Java语言创建公司,现已由Oracle收购)将其吸收进Java官方体系,最后由JCP(Java
Community
Process,是一个开放的国际组织,主要由Java开发者及被授权者组成)正式将其规范化。由于当时Java在业界风头正劲,各大公司都广泛地使用EJB规范来进行应用开发,在这种环境下,EJB规范几乎成了Java企业级应用开发的代名词。 - 但是任何技术都不是完美的,EJB自身存在各种问题,要求革新EJB技术的呼声一浪高过一浪,无论是当时的学术界还是企业界都没有符合要求的技术出现。一位名为Rod
Johnson的开发者,结合自己扎实的理论知识和丰富的实践经验写出了对当时及后来的Java开发者影响深远的两本著作Expert
One-on-One J2EE Design andDevelopment和J2EE without
EJB,他通过这两本书阐述了一种与当时主流EJB截然不同的开发方式,这两本书也可以视为Spring Framework的起源。 - 从设计思想来看,Rod
Johnson认为当时的EJB框架太过繁重,程序员需要花费大量的时间和精力来实现EJB规范所要求的各种类,并且还要管理他们的生命周期,这完全违背了EJB提出时的初衷——“让大部分程序员把精力都用在业务功能本身上”。为了解决这种本末倒置的问题,RodJohnson提出了轻量级框架的概念,并将这种思想完全贯彻于Spring
Framework。这也是此框架被称为Spring的原因:传统的J2EE开发让开发者走进了冬天(Winter),而春天(Spring)将会是一个全新的开始
。
- Spring公开可查的最初版本成型于RodJohnson的Expert One-on-One J2EE Designand
Development一书,其1.0版本于2004年正式开源(其开源许可证为Apache 2.0
License),正式开源版本的Spring Framework以其独特的开发方式和全新的设计理念震撼了整个Java开发者生态圈。
二、Spring容器演示
(一)创建Maven项目
- 创建Maven项目 - SpringDemo,设置项目位置以及组ID
- 单击【Finish】按钮
- 修改项目的Maven配置
(二)添加依赖
- 在pom.xml文件添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.lj.Spring</groupId>
<artifactId>SpringDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--Spring核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.20</version>
</dependency>
<!--Spring实体-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.20</version>
</dependency>
<!--Spring容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
<!--Spring Web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.20</version>
</dependency>
<!--Spring MVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<!--Spring测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.20</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
![请添加图片描述](https://img-blog.csdnimg.cn/3e3af41090cd48d2aa55474799e122f4.png)
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 下载依赖
(三)创建杀龙任务类
- 创建net.fhl.spring.day01包,然后在包里面创建SlayDragonQuest类
package net.fhl.spring.day01;
public class SlayDragonQuest {
public void embark(){
System.out.println("执行杀龙任务...");
}
}
(四)创建勇敢骑士类
- 在net.fhl.spring.day01包里创建BraveKnight类
package net.fhl.spring.day01;
/**
* 功能:勇敢骑士类
*/
public class BraveKnight {
//骑士名字
private String name;
//创建杀龙任务对象
private SlayDragonQuest SlayDragonQuest;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
/**
* 设置杀龙任务
* @param slayDragonQuest
*/
public void setSlayDragonQuest(SlayDragonQuest slayDragonQuest){
this.SlayDragonQuest = slayDragonQuest;
}
/**
* 骑士执行任务
*/
public void embarkOnQuest(){
System.out.print("勇敢骑士[" + name + "]执行杀龙任务完成");
SlayDragonQuest.embark(); //执行杀龙任务
}
}
(五)采用传统方式让勇敢骑士完成杀龙任务
- 在test/java里创建net.fhl.spring.day01包,然后在包里面创建TestBraveKnightOld类
package net.fhl.spring.day01;
import org.junit.Test;
/**
* 功能:用传统方式测试勇敢骑士
*/
public class TestBraveKnightOld {
@Test
public void testBraveKnight(){
//创建沙龙任务对象
SlayDragonQuest slayDragonQuest = new SlayDragonQuest();
//创建勇敢骑士对象
BraveKnight braveKnight = new BraveKnight();
//设置勇敢骑士属性
braveKnight.setName("罗宾汉");
braveKnight.setSlayDragonQuest(slayDragonQuest);
//调用勇敢骑士执行任务的方法
braveKnight.embarkOnQuest();
}
}
- 运行测试、查看结果
(六)采用Spring框架让勇敢骑士完成杀龙任务
1、创建日志属性文件
- 在resources目录里创建log4j
log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
2、创建Spring配置文件
- 在resources里创建xmlconfig目录,然后在里面创建spring-config.xml
- 单击【Configure application context】(配置应用上下文)
3、创建新勇敢骑士测试类
- 在test/java/net.fhl.spring.day01里创建TestBraveKnightNew测试类
package net.fhl.spring.day01;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBraveKnightNew {
private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器
@Before // 每次测试方法执行前都要执行的代码
public void init() {
// 基于Spring配置文件创建应用容器
context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");
// 提示用户
System.out.println("Spring应用容器已创建~");
}
@Test
public void testBraveKnight() {
// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是"RobinHood")
BraveKnight braveKnight = (BraveKnight) context.getBean("RobinHood");
// 勇敢骑士执行任务
braveKnight.embarkOnQuest();
BraveKnight knight1=(BraveKnight) context.getBean("knight1");
knight1.embarkOnQuest();
BraveKnight knight2 =(BraveKnight) context.getBean("knight2");
knight2.embarkOnQuest();
}
@After // 每次测试方法执行后都要执行的代码
public void destroy() {
// 关闭应用容器
context.close();
// 提示用户
System.out.println("Spring应用容器已关闭~");
}
}
- 运行测试方法testBraveKnight(),查看结果
(七)采用构造方法注入方式注入属性值
1、创建救美任务类
- 在net.fhl.spring.day01包里创建RescueDamselQuest类
Rescue Damsel - 拯救少女
package net.fhl.spring.day01;
public class RescueDamselQuest {
public void embark() {
System.out.println("执行救美任务……");
}
}
2、创建救美骑士类
- 在net.fhl.spring.day01包里创建DamselRescuingKnight类
package net.fhl.spring.day01;
public class RescueDamselKnight {
private String name;
private RescueDamselQuest rescueDamselQuest;
/**
* 有参构造方法
*
* @param name
* @param rescueDamselQuest
*/
public RescueDamselKnight(String name, RescueDamselQuest rescueDamselQuest) {
this.name = name;
this.rescueDamselQuest = rescueDamselQuest;
}
public void embarkOnQuest() {
System.out.print("救美骑士[" + name + ']');
rescueDamselQuest.embark();
}
}
3、配置救美骑士Bean
- 在Spring配置文件里创建救美骑士Bean
<!--救美任务Bean-->
<bean id="rescueDamselQuest" class="net.huawei.spring.day01.RescueDamselQuest"/>
<!--创建救美骑士Bean-->
<bean id="Galahad" class="net.huawei.spring.day01.RescueDamselKnight">
<constructor-arg value="格拉海德"/>
<constructor-arg ref="rescueDamselQuest"/>
</bean>
4、创建旧救美骑士测试类
- 在test/java/net.fhl.spring.day01包里创建TestRescueDamselKnightOld类
package net.fhl.spring.day01;
import org.junit.Test;
public class TestRescueDamselKnightOld {
@Test
public void testRescueDamselKnight() {
// 创建救美任务对象
RescueDamselQuest rescueDamselQuest = new RescueDamselQuest();
// 创建救美骑士对象
RescueDamselKnight rescueDamselKnight = new RescueDamselKnight("格拉海德", rescueDamselQuest);
// 救美骑士执行任务
rescueDamselKnight.embarkOnQuest();
}
}
- 运行testRescueDamselKnight()测试方法,查看结果
5、创建新救美骑士测试类
- 在test/java/net.fhl.spring.day01包里创建TestRescueDamselKnightNew类
package net.fhl.spring.day01;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestRescueDamselKnightNew {
private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器
@Before // 每次测试方法执行前都要执行的代码
public void init() {
// 基于Spring配置文件创建应用容器
context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");
// 提示用户
System.out.println("Spring应用容器已创建~");
}
@Test
public void testRescueDamselKnight() {
// 根据名称从应用容器里获取救美骑士对象
RescueDamselKnight rescueDamselKnight = (RescueDamselKnight) context.getBean("Galahad");
// 救美骑士执行任务
rescueDamselKnight.embarkOnQuest();
}
@After // 每次测试方法执行后都要执行的代码
public void destroy() {
// 关闭应用容器
context.close();
// 提示用户
System.out.println("Spring应用容器已关闭~");
}
}
- 运行testRescueDamselKnight()测试方法,查看效果