
网址:https://spring.io
Spring Framework - https://spring.io/projects/spring-framework
Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它极大的简化了开发。我得出一个公式:Spring = 春天 = Java程序员的春天 = 简化开发。最后的简化开发正是Spring框架带来的最大好处。
Spring是一个开放源代码的设计层面框架,它是于2003 年兴起的一个轻量级的Java 开发框架。由Rod Johnson创建,其前身为Interface21框架,后改为了Spring并且正式发布。Spring是为了解决企业应用开发的复杂性而创建的。它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。Spring 的理念:不去重新发明轮子。其核心是控制反转(IOC)和面向切面(AOP)。
在我们进入细节以前,我们可以看一下Spring可以给一个工程带来的一些好处:
这里博主使用的IDEA2022版本搭建的该工程,
创建Maven项目 - SpringDemo,设置项目位置以及组ID
单击【create】按钮,然后生成该项目
在Maven仓库里查找Spring框架(https://mvnrepository.com)
查看Spring Core
选择最新版本 - 5.3.20
添加到pom.xml文件的
同理添加其他依赖
4.0.0 net.Lee.spring SprintDemo 1.0-SNAPSHOT 8 8 org.springframework spring-core 5.3.20 org.springframework spring-beans 5.3.20 org.springframework spring-context 5.3.20 org.springframework spring-web 5.3.20 org.springframework spring-webmvc 5.3.20 org.springframework spring-test 5.3.20 junit junit 4.13 test junit junit RELEASE test
但是大家可以看到Maven呈现一个红色波浪线的,说明这些依赖包还没有下载到本地仓库
或者如下面这种情况
打开Maven窗口,单击刷新按钮,就会开始自动下载依赖包
下载好依赖包以后Maven仓库就不会在呈现红色波浪线
等待插件与依赖下载完成(第一次下载有点慢,需要耐心等待)
查看本地Maven仓库
可以查看项目下载的有关Spring框架的依赖
package net.Lee.spring.lesson01;
public class SlayDragonQuest {
public void embark() {
System.out.println("执行杀龙任务......");
}
}
(四)创建勇敢骑士类
在net.huawei.spring.day01包里创建BraveKnight类
package net.Lee.spring.lesson01;
public class BraveKnight {
// 勇敢骑士姓名
private String name;
// 创建杀龙任务对象
private SlayDragonQuest slayDragonQuest;
public void setName(String name) {
this.name = name;
}
public void setSlayDragonQuest(SlayDragonQuest slayDragonQuest) {
this.slayDragonQuest = slayDragonQuest;
}
public void embarkOnQuest() {
System.out.print("勇敢骑士[" + name + "]");
slayDragonQuest.embark(); // 执行杀龙任务
}
}
在test/java里创建net.Lee.spring.lesson01包,然后在包里面创建TestBraveKnightOld类
package net.Lee.spring.lesson01;
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();
}
}
运行测试方法testBraveKnight()
查看程序运行结果
在resources目录里创建log4j.properties
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%n2、创建Spring配置文件
在resources里创建xmlconfig目录,然后在里面创建spring-config.xml
输入Spring配置文件名后,产生文件
单击【Configure application context】(配置应用上下文)
单击【Create new application context…】(创建新的应用上下文),注意应用上下文名称是可以修改的
单击【OK】按钮
现在我们有了生产Bean的车间,下面我们就要在车间里配置产品
通过Spring配置文件,创建了两个Bean对象,它们之间存在依赖关系,第一个Bean对象是第二个Bean对象的任务属性值。
在test/java/net.Lee.spring.lesson01里创建TestBraveKnightNew测试类
package net.Lee.spring.lesson01;
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();
}
@After // 每次测试方法执行后都要执行的代码
public void destroy() {
// 关闭应用容器
context.close();
// 提示用户
System.out.println("Spring应用容器已关闭~");
}
}
package net.Lee.spring.lesson01;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.BeansException;
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();
// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“knight1”)
BraveKnight Gareth = (BraveKnight) context.getBean("Gareth");
// 勇敢骑士执行任务
Gareth.embarkOnQuest();
// 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“knight1”)
BraveKnight Galahad = (BraveKnight) context.getBean("Galahad");
// 勇敢骑士执行任务
Galahad.embarkOnQuest();
}
@After //每次测试方法执行后都要执行的代码
public void destroy() {
// 关闭应用容器
context.close();
//提示用户
System.out.println("Spring容器已关闭");
}
}
执行testBraveKnight()测试方法,查看结果
勇敢骑士Bean采用属性注入方式将杀龙任务Bean注入作为其属性。
初始化对象其实可以调用有参构造方法来设置属性的初始值,对应到Spring的Bean工厂,就还有一种注入方式,叫做构造方法注入。同样地,我们还是通过案例来演示如何通过构造方法来注入属性值。
在net.Lee.spring.lesson01包里创建RescueDamselQuest类
Rescue Damsel - 拯救少女
package net.Lee.spring.lesson01;
public class RescueDamselQuest {
public void embark() {
System.out.println("执行救美任务……");
}
}
2、创建救美骑士类
在net.Lee.spring.lesson01包里创建RescueDamselKnight类
package net.Lee.spring.lesson01;
public class RescueDamselKnight {
private String name;
private RescueDamselQuest rescueDamselQuest;
public RescueDamselKnight(String name, RescueDamselQuest rescueDamselQuest) {
this.name = name;
this.rescueDamselQuest = rescueDamselQuest;
}
public void embarkOnQuest() {
System.out.print("救美骑士[" + name + ']');
rescueDamselQuest.embark();
}
}
在Spring配置文件里创建救美骑士Bean
arg: argument 参数
4、创建旧救美骑士测试类
package net.Lee.spring.lesson01;
import org.junit.Test;
public class TestRescueDamselKnightOld {
@Test
public void testRescueDamselKnight() {
// 创建救美任务对象
RescueDamselQuest rescueDamselQuest = new RescueDamselQuest();
// 创建救美骑士对象
RescueDamselKnight rescueDamselKnight = new RescueDamselKnight("格拉海德", rescueDamselQuest);
// 救美骑士执行任务
rescueDamselKnight.embarkOnQuest();
}
}
package net.Lee.spring.lesson01;
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应用容器已关闭~");
}
}