一、Web开发技术

从学习角度来说,理解技术问题要越透彻越好,被屏蔽或被封装起来的信息要越少越好。从工程实现角度来说,要尽量高效地使用现成框架和现成工具——这是“学习”和“工程实现”的差别,但这两件事并不矛盾,我们学习得越透彻,在工程实现时,对框架和工具的使用就越高效。

二、Spring框架

网址:https://spring.io

目前(2022-5-27)Spring Framework版本是5.3.20

(二)Spring框架优点

  1. Spring makes Java productive.
  2. Spring makes Java reactive.
  3. Spring makes Java cloud-ready.
  4. Spring makes Java simple.
  5. Spring makes Java modern.

(三)为什么要选择Spring?

Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world's most popular Java framework.

“We use a lot of the tools that come with the Spring framework and reap the benefits of having a lot of the out of the box solutions, and not having to worry about writing a ton of additional code—so that really saves us some time and energy.” —— SEAN GRAHAM, APPLICATION TRANSFORMATION LEAD, DICK’S SPORTING GOODS

三、创建Spring应用程序 - 骑士完成任务

(一)创建Maven项目

创建Maven项目 - SpringDemo,设置项目位置以及组ID

单击【Finish】按钮

修改项目的Maven配置

(二)添加Spring依赖

在Maven仓库里查找Spring框架(https://mvnrepository.com)

选择最新版本 - 5.3.20

添加到pom.xml文件的<dependencies>元素里

<?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.huawei.spring</groupId>
    <artifactId>SpringDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

<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>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
但是大家可以看到版本号是红色的,说明这些依赖包还没有下载

打开Maven窗口

单击刷新按钮,就开始下载依赖包

等待插件与依赖下载完成(第一次下载有点慢,需要耐心等待)

(三)创建杀龙任务类

创建net.cm.spring.day01包,然后在包里面创建SlayDragonQuest

package net.cm.spring.day01;

public class SlayDragonQuest {
    public void embark() {
        System.out.println("执行杀龙任务……");
    }
}

(四)创建勇敢骑士类

net.cm.spring.day01包里创建BraveKnight

package net.cm.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.cm.spring.day01包,然后在包里面创建TestBraveKnightOld

package net.cm.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();
    }
}
运行测试方法testBraveKnight()

(六)采用Spring框架让勇敢骑士完成杀龙任务

1、创建日志属性文件

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%n

2、创建Spring配置文件

resources里创建xmlconfig目录,然后在里面创建spring-config.xml

单击【Configure application context】(配置应用上下文)

单击【Create new application context…】(创建新的应用上下文),注意应用上下文名称是可以修改的

单击【OK】按钮

3、在Spring配置文件里创建Bean

(1)创建杀龙任务Bean

<!--杀龙任务Bean-->
<bean id="slayDragonQuest" class="net.cm.spring.day01.SlayDragonQuest"/>

(2)创建勇敢骑士Bean

<!--创建勇敢骑士Bean-->                                                 
<bean id="RobinHood" class="net.cm.spring.day01.BraveKnight"> 
    <property name="name" value="罗宾汉"/>  <!-- RobinHood.setName("罗宾汉")-->                        
    <property name="slayDragonQuest" ref="slayDragonQuest"/>  <!--RobinHood.setSlayDragonQuest(slayDragonQuest)-->  
</bean>

4、创建新勇敢骑士测试类

test/java/net.cm.spring.day01里创建TestBraveKnightNew测试类

package net.cm.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();
    }
    
    @After // 每次测试方法执行后都要执行的代码
    public void destroy() {
        // 关闭应用容器
        context.close();
        // 提示用户
        System.out.println("Spring应用容器已关闭~");
    }
}

根据名称从应用容器中获取勇敢骑士对象可能会报错,因为配置文件里没有定义那个名称的Bean

当然可以对上述代码进行异常处理。

5、创建两个勇敢骑士Bean

6、修改新勇敢骑士测试类

执行testBraveKnight()测试方法,查看结果

(七)采用构造方法注入方式注入属性值

1、创建救美任务类

net.cm.spring.day01包里创建RescueDamselQuest

Rescue Damsel - 拯救少女

package net.cm.spring.day01;
public class RescueDamselQuest {
    public void embark() {
        System.out.println("执行救美任务……");
    }
}

2、创建救美骑士类

net.cm.spring.day01包里创建DamselRescuingKnight

package net.cm.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

arg: argument 参数

<!--救美任务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.cm.spring.day01包里创建TestRescueDamselKnightOld

package net.cm.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、创建新救美骑士测试类

package net.cm.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()测试方法,查看效果

以上内容均是参照:howard2005 博主而写

玩一玩Spring容器(可视化笔记02)相关推荐

  1. Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能

    Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...

  2. Spring框架学习笔记02:初探Spring——利用组件注解符精简Spring配置文件

    文章目录 一.课程引入 二.打开项目[SpringDemo2021] 三.利用组件注解符精简Spring配置文件 1.创建net.hw.spring.lesson02包 2.将lesson01子包的四 ...

  3. 新课上线 | 每次 5 分钟,轻松玩转阿里云容器服务!

    在云原生带来的云计算未来趋势下,容器已经成为用户使用云的新界面.据 Gartner 预测,到 2023 年,70% 的组织将在生产环境中运行三个或更多容器化应用程序.容器技术和服务为企业业务发展带来敏 ...

  4. Spring笔记——2.使用Spring容器

    Spring有两个核心接口:BeanFactory和ApplicationContext.而ApplicationContext是BeanFactory的子接口,都可以代表Spring容器,用于产生管 ...

  5. 【报错笔记】在eclipse中做Spring项目时,创建Spring容器时老是出错

    在eclipse中做Spring项目时,创建Spring容器时老是出错 写完这句代码无法导包,最后发现包导错了,我原来导的4.3.9的包,而且是后缀为其他的包,而且对JDK也有要求,我又下载了5.0. ...

  6. Spring读书笔记-----使用Spring容器(二)

    一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFa ...

  7. Spring 读书笔记-----使用Spring容器(一)

    Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spr ...

  8. Spring Cloud 学习笔记(1 / 3)

    Spring Cloud 学习笔记(2 / 3) Spring Cloud 学习笔记(3 / 3) - - - 01_前言闲聊和课程说明 02_零基础微服务架构理论入门 03_第二季Boot和Clou ...

  9. Spring Cloud 学习笔记(2 / 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(3 / 3) - - - 56_Hystrix之全局服务降级DefaultProperties 57_Hystri ...

最新文章

  1. 计算机操作系统_计算机理论(操作系统概念及常见操作系统类型)
  2. python json有什么用_为什么要学习用Python解析JSON数据?
  3. Science论文解读:打牌一时爽,一直打牌一直爽
  4. python列表有哪些操作_python列表的基本操作有哪些
  5. vue ---- webpack中loader
  6. Java Unable to load library ‘gsdll64‘: 报错,解决方案
  7. 徒手撸框架--高并发环境下的请求合并
  8. mysql图形界面navicat的连接
  9. 突发!Spring疑似沦陷了。。。
  10. 解决屏蔽JS代码报错的问题
  11. Mysql数据库实现分页查询
  12. 免费https ssl证书freessl.org的申请及配置
  13. Android系统裁剪:手把手教你如何进行系统裁剪
  14. 在检查计算机更新时发现错误,修复在 Acrobat Reader 更新期间出现的 Windows 错误...
  15. mybatis 批量添加 过滤库里已有数据
  16. 前端框架VUE学习纪要
  17. 计算机 睡眠 无法打印,台式机睡眠后打不开怎么办
  18. echarts旭日图数据重构处理
  19. 2021.8.14【提高B组模拟6】T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)
  20. 【讲清楚】rebase的使用

热门文章

  1. 黄金分割法_python
  2. 深入理解Java虚拟机—Java虚拟机内存
  3. CentOS 安装 Docker 教程
  4. Blender 如何添加渲染AO,Bloom~~
  5. LwIP 协议栈移植教程
  6. Android WebView(一) WebView详解
  7. mysql数据库数据恢复
  8. android集成科大讯飞语音听写和语音合成
  9. 51单片机和32单片机有什么区别?该从哪个开始入门学习?
  10. debian 更换源 使用国内源 配置方法