Spring初学入门(跟学笔记)

news2025/1/23 7:16:33

一、Spring概述

Spring是一款主流的Java EE轻量级开源框架。
Spring的核心模块:IoC(控制反转,指把创建对象过程交给Spring管理 )、AOP(面向切面编程,在不修改源代码的基础上增强代码功能)

二、Spring入门

2.1 入门案例开发步骤

  1. 引入spring相关依赖
  2. 创建类,定义属性和方法
  3. 按照spring要求创建配置文件
  4. 在spring配置文件中配置相关信息
  5. 进行测试

2.2 案例开发实例
创建一个spring maven项目名为Spring6,再在Spring6下面创建一个名为Spring-first的模块,在此模块下的pom.xml里增加依赖。

<dependencies>
        <!-- 第2.1个spring context依赖(这是spring的基础依赖) -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.7</version>
        	<!--如果是JDK17及以上的,就写6.0.0版本+-->
        </dependency>

        <!--第2.2个spring junit依赖 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
<!--            <scope>test</scope>-->
        </dependency>
    </dependencies>

复制之后,点击m小图标进行联网下载。
在这里插入图片描述

创建一个User类,里面创建一个add方法。

public class User {
    public void add(){
        System.out.println("添加。。。");
    }
}

创建一个bean.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    完成user对象创建-->
<!--    id属性:唯一标识-->
<!--    class属性:要创建的对象所在类的全路径-->
    <bean id="user" class="com.hbnu.spring6.User"/>
</beans>

再写一个测试类,测试方法调用

public class TestUser {
//这里的注解要导入 import org.junit.Test;
    @Test
    public void testUser(){
        //加载spring配置文件,创建对象
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");

        //获取创建的对象
        User user = (User) applicationContext.getBean("user");//getBean --> xml文件里的id值
        System.out.println(user);

        //使用对象调用方法进行测试
        user.add();
    }
}

如果是利用反射创建对象呢?

//利用反射创建对象
    public void testUserObject1() throws Exception {
        Class clazz=Class.forName("com.hbnu.spring6.User");
        //调用方法创建对象
        User user = (User) clazz.getDeclaredConstructor().newInstance();
        System.out.println(user);

        user.add();
    }

三、容器:IoC

IoC是Inversion of Control的简写,译为”控制反转”,是一种设计思想(不是一种技术),是一个重要的面向对象编程法则,是Spring框架中最重要的核心组件之一。
Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由IoC容器管理的Java对象称为Spring Bean,它与new一个对象没有区别。

控制反转,反转的是什么?

  • 将对象的创建权力交出去,交给第三方容器负责
  • 将对象和对象之间关系的维护权交出去,交给第三方容器负责

控制反转这种思想如何实现?

  • DI :依赖注入

3.1 依赖注入
指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
常见方式包括两种:

  • set注入
  • 构造注入

3.2 IoC容器在Spring的实现

IoC容器中管理的组件也叫做bean,在创建bean之前,首先要创建IoC容器。Spring提供了两种实现方式:

BeanFactory 是IoC容器的基本实现,是Spring内部使用的接口,面向Spring本身,不提供给开发人员

ApplicationContext 是BeanFactory的子接口,提供了更多高级特性,面向Spring的使用者

ApplicationContext的主要实现类:
在这里插入图片描述

3.3 基于xml管理bean

1.获取bean

xml文件里配置id值

<bean id="user" class="com.hbnu.spring6.User"/>

①根据id获取

public void test1(){
	ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
	User user = (User) applicationContext.getBean("user");
}

②根据id和类型获取

public void test2(){
	ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
	User user = applicationContext.getBean("user",User.class);
}

③根据类型获取

public void test3(){
	ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
	User user = applicationContext.getBean(User.class);
}

且当根据类型获取bean的时候,要求ioc容器里指定类型(class)的bean只允许有一个,配置了两个会报错。即下面两行是错的。

<bean id="user" class="com.hbnu.spring6.User"/>
<bean id="user1" class="com.hbnu.spring6.User"/>

注意:①如果组件类实现了接口,根据接口类型可以获取bean吗?可以,前提是bean唯一 ②如果一个接口有多个实现类,这些实现类都配置了bean,根据接口类型可以获取bean吗?不行,因为bean不唯一

以下是错误的:

<!--    一个接口实现类获取过程-->
    <bean id="UserDaoImpl" class="com.hbnu.spring6.bean.UserDaoImpl"/>

    <bean id="PersonDaoImpl" class="com.hbnu.spring6.bean.PersonDaoImpl"/>
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
        UserDao userDao = applicationContext.getBean(UserDao.class);
        System.out.println(userDao);
        userDao.run();

2.依赖注入

如果是原生Java,set方法和构造器方法怎么注入?

		//set方法注入
        Book book=new Book();
        book.setAuthor("牛顿");

        //通过构造器注入
        Book book1=new Book("1","鹤");

接着看用配置文件如何注入。。。

①根据set方法注入
创建一个Book类,定义属性,生成属性set方法之后,在spring配置文件里配置。。。

<!--    1.set方法完成注入-->
    <bean id="book" class="com.hbnu.spring6.DI.Book">
        <property name="bname" value="spring"/>
        <property name="author" value="小唐"/>
    </bean>
    <!--name对应Book类里面的属性-->

测试一下set方法注入:

@Test
    public void testSet(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-DI.xml");
        Book book = (Book)applicationContext.getBean("book");
        System.out.println(book);//Book{bname='spring', author='小唐'}
    }

输出Book类里重写的toString

②根据构造器注入
创建一个Book类,定义属性,生成有参数的构造方法,在spring配置文件里配置。。。

<!--    2.有参构造注入-->
    <bean id="bookCons" class="com.hbnu.pojo.Book">
        <constructor-arg name="author" value="小李"/>
        <constructor-arg name="name" value="Spring学习之有参构造注入"/>
    </bean>

测试跟上面一样,只是配置文件里写的内容不一样了

3.特殊值处理

①字面量赋值
②null值 用null标签表示空值
③xml实体 用&lt;&gt;表示大小尖括号
④CDATA节 <![CDATA[a<b]]>

4.为对象类型属性赋值

创建两个类对象:dept和emp
在emp类里写一个work方法

public class Emp {

    //对象类型属性:员工属于某个部门
    private Dept dept;
    private String ename;
    private String age;

    public void work(){
        System.out.println(ename+" is working...");
        dept.info();
    }
    ...
  }

①引用外部bean

    1.引用外部bean注入
    <bean id="dept" class="com.hbnu.DITest.Dept">
        <property name="dname" value="安保部"/>
    </bean>
    <bean id="emp" class="com.hbnu.DITest.Emp">
<!--        普通类型属性注入-->
        <property name="ename" value="lucy"/>
        <property name="age" value="23"/>
<!--        对象类型属性注入-->
<!--        表示引入外部bean,这里的ref是上面id为dept的值-->
        <property name="dept" ref="dept"/>
    </bean>

②使用内部bean

<!--    2.使用内部bean注入-->

    <bean id="emp" class="com.hbnu.DITest.Emp">
        <property name="age" value="25"/>
        <property name="ename" value="joey"/>
        <property name="dept">
            <bean id="dept" class="com.hbnu.DITest.Dept">
                <property name="dname" value="财务部"/>
            </bean>
        </property>
    </bean>

③ 使用级联赋值

<!--    3.级联赋值-->
    <bean id="emp" class="com.hbnu.DITest.Emp">
        <property name="ename" value="mary"/>
        <property name="age" value="25"/>
        <property name="dept" ref="dept"/>
        <property name="dept.dname" value="测试部"/>
    </bean>
    <bean id="dept" class="com.hbnu.DITest.Dept">
    
    <!--这一行可要可不要,仅作参考,上面已经给部门名称赋值为了测试部-->
        <property name="dname" value="技术部"/>
    </bean>

测试

@Test
    public void testemp(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-ditest.xml");
        Emp emp=applicationContext.getBean("emp",Emp.class);
        emp.work();
    }

5.复杂类型注入

①数组类型注入

在 Emp 类里面加一个数组属性private String[] hobbies;后生成get、set方法,编写xml文件

<!--    数组类型赋值-->
    <bean id="dept" class="com.hbnu.DITest.Dept"/>
    <bean id="emp" class="com.hbnu.DITest.Emp">
        <property name="ename" value="tom"/>
        <property name="age" value="34"/>
        <property name="dept" ref="dept"/>
        <property name="hobbies">
            <array>
                <value>抽烟</value><value>喝酒</value><value>烫头</value>
            </array>
        </property>
    </bean>

②集合类型注入

在Dept类里加一个员工listprivate List<Emp> empList;,一个部门里可以有多个员工

<!--    为list集合赋值-->
    <bean id="emp1" class="com.hbnu.DITest.Emp">
            <property name="ename" value="tom1"/>
            <property name="age" value="31"/>
    </bean>
    <bean id="emp2" class="com.hbnu.DITest.Emp">
        <property name="ename" value="tom2"/>
        <property name="age" value="32"/>
    </bean>
    <bean id="dept" class="com.hbnu.DITest.Dept">
        <property name="dname" value="技术部"/>
        <property name="empList">
            <list>
                <ref bean="emp1"></ref>
                <ref bean="emp2"></ref>
            </list>
        </property>
    </bean>

输出技术部里的员工:

Dept{dname='技术部', empList=[Emp{dept=null, ename='tom1', age='31', hobbies=null}, Emp{dept=null, ename='tom2', age='32', hobbies=null}]}

③map类型注入

创建Student和Teacher类
对于学生来说,一个学生对应多个讲师

<!--    map类型注入-->
    <bean id="teacherone" class="com.hbnu.DITest.Teacher">
        <property name="tid" value="121"/>
        <property name="tname" value="莉莉"/>
    </bean>
    <bean id="teachertwo" class="com.hbnu.DITest.Teacher">
        <property name="tid" value="122"/>
        <property name="tname" value="小月"/>
    </bean>
    <bean id="student" class="com.hbnu.DITest.Student">
        <property name="sid" value="111"/>
        <property name="sname" value="张三"/>
        <property name="teacherMap">
            <map>
                <entry>
                    <key>
                        <value>10010</value>
                    </key>
                    <ref bean="teacherone"></ref>
                </entry>
                <entry>
                    <key>
                        <value>10011</value>
                    </key>
                    <ref bean="teachertwo"></ref>
                </entry>
            </map>
        </property>
    </bean>

输出{10010=Teacher{Tname='莉莉', Tid='121'}, 10011=Teacher{Tname='小月', Tid='122'}}

④引用集合类型的bean

创建一个Lesson类(getter、setter、重写toString),再在Student类里面加一个 public List<Lesson> lessonList;,一个学生有多个老师,选多门课

<bean id="lesson1" class="com.hbnu.DITest.Lesson">
        <property name="lessonname" value="前端开发"/>
    </bean>
    <bean id="lesson2" class="com.hbnu.DITest.Lesson">
        <property name="lessonname" value="java开发"/>
    </bean>

    <bean id="teacher1" class="com.hbnu.DITest.Teacher">
        <property name="tname" value="张老师"/>
        <property name="tid" value="001"/>
    </bean>
    <bean id="teacher2" class="com.hbnu.DITest.Teacher">
        <property name="tname" value="王老师"/>
        <property name="tid" value="002"/>
    </bean>

    <bean id="student" class="com.hbnu.DITest.Student">
        <property name="sid" value="1000"/>
        <property name="sname" value="lucy"/>

<!--        注入list、map类型属性-->
        <property name="lessonList" ref="lessonlist"/>
        <property name="teacherMap" ref="teachermap"/>
    </bean>

    <util:list id="lessonlist">
        <ref bean="lesson1"/>
        <ref bean="lesson2"/>
    </util:list>
    <util:map id="teachermap">
        <entry>
            <key>
                <value>10010</value>
            </key>
            <ref bean="teacher1"/>
        </entry>
        <entry>
            <key>
                <value>10011</value>
            </key>
            <ref bean="teacher2"/>
        </entry>
    </util:map>
</beans>

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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

输出:

{10010=Teacher{Tname='张老师', Tid='001'}, 10011=Teacher{Tname='王老师', Tid='002'}}
[Lesson{lessonname='前端开发'}, Lesson{lessonname='java开发'}]

脱离数据库思想注入复杂类型,创建一个dataType类,里面拥有private String[] arr;private List<String> lists;private Map<String,String> maps;private Properties properties;属性,编写xml文件:

<!--        注入复杂类型-->
        <bean id="dataType" class="com.hbnu.pojo.DataType">
<!--                1.注入数组类型-->
                <property name="arr">
                        <list>
                                <value>斯蒂芬金</value>
                                <value>毛姆</value>
                                <value>陀思妥耶夫斯基</value>
                                <value>茨威格</value>
                        </list>
                </property>

<!--                2.注入list集合类型-->
              <property name="lists">
                      <list>
                              <value>马克吐温</value>
                              <value>马克吐温</value>
                              <value>马克吐温</value>
                              <value>马克吐温</value>
                      </list>
              </property>


<!--                3.注入map集合类型-->
                <property name="maps">
                        <map>
                                <entry key="username" value="雨果"/>
                                <entry key="age" value="1984"/>
                        </map>
                </property>

<!--                4.注入properties-->
                <property name="properties">
                        <props>
                                <prop key="driverClass">com.mysql.cj.jdbc.Driver</prop>
                                <prop key="url">jdbc:mysql://localhost:3306/class2110?serverTimezone=GMT&amp;useSSL=false</prop>
                                <prop key="username">root</prop>
                                <prop key="password">123456</prop>
                        </props>
                </property>
        </bean>

6.p命名空间

<!--    p命名空间注入-->
    <bean id="studentp" class="com.hbnu.DITest.Student"
    p:sid="100" p:sname="mary" p:lessonList-ref="lessonlist" p:teacherMap-ref="teachermap">

头部加一行

xmlns:p="http://www.springframework.org/schema/p"

7.bean的作用域

概念
在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围

取值含义创建对象的时机
singleton在IOC容器中,这个bean的对象始终为单实例IOC容器初始化时
prototype这个bean在IOC容器中有多个实例获取bean时
    @Test
    public void testOrders(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean-ditest.xml");
        Orders orders=applicationContext.getBean("orders",Orders.class);
        Orders orders2=applicationContext.getBean("orders",Orders.class);
        System.out.println(orders);
        System.out.println(orders2);
    }

8.bean的生命周期

1.bean对象创建(调用无参数构造)
2.给bean对象设置相关属性
3.bean后置处理器(初始化之前)
4.bean对象初始化(调用指定初始化方法)
5.bean后置处理器(初始化之后)
6.bean对象创建完成
7.bean对象销毁(配置指定销毁的方法)
8.IoC容器关闭

3.4 基于注解管理bean
步骤:1.引入依赖 2.开启组件扫描 3.使用注解定义bean 4.依赖注入

1.开启组件扫描
开启组件扫描(开启此功能后,spring就会自动从扫描指定的包,及其子包下的所有类。如果类上使用了@Component注解,就将该类装配到容器中)

<context:component-scan base-package="com.hbnu"></context:component-scan>

2.使用注解定义bean

注解说明
@Component该注解用于描述Spring中的bean,仅仅表示容器中的一个组件,并且可以作用在应用的任何层次,例如Service层,Dao层。
@Repository该注解用于将数据访问层(Dao层)的类标识为S加粗样式pring中的bean,其功能与@Component相同
@Service该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的bean,其功能与@Component相同
@Controller该注解通常作用在控制层(如SpringMVC中的Controller),用于将控制层的类标识为Spring中的bean,其功能与@Component相同

3.@Autowired注入

注入可以理解为导包,注入后就可以调用方法
在controller里注入service,在service里注入dao

写个测试感受一下@Autowired注入…项目结构如下:
在这里插入图片描述
首先在bean.xml里编写代码进行包扫描,然后创建UserDao以及其实现类,
在这里插入图片描述
在这里插入图片描述

接着创建UserService以及其实现类,并将UserDao注入到UserService中。
在这里插入图片描述
在这里插入图片描述
最后创建UserController,将UserService注入后进行测试。
在这里插入图片描述

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");
        UserController userController=applicationContext.getBean(UserController.class);
        userController.add();
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb--18 tlias-web-management 登录认证

登录认证 1 登录功能功能开发 2 登录校验2.1 问题分析2.2 会话技术CookieSession令牌技术 2.3 JWT令牌介绍生成和校验登录下发令牌 2.4 过滤器Filter拦截路径过滤器链 登录校验-Filter 2.5 拦截器InterceptorInterceptor详解执行流程 登录校验- Interceptor 3 异常处理3.1 当前…

网页封装App技术详解与小猪APP分发解决方案

移动互联网的浪潮中&#xff0c;网页封装App&#xff08;又称Hybrid App&#xff09;以其快速部署、成本效益高的特点&#xff0c;成为众多企业和开发者的选择。这种技术允许开发者将网页内容封装进原生App外壳&#xff0c;从而在不牺牲用户体验的前提下&#xff0c;实现跨平台…

常用五款文件加密软件|好用加密软件工具分享

随着信息化时代的到来&#xff0c;数据安全问题日益凸显&#xff0c;加密软件应运而生&#xff0c;成为了保护数据安全的重要手段。在市场上&#xff0c;众多加密软件层出不穷&#xff0c;各有千秋。本文将介绍几款常用的加密软件&#xff0c;分析它们的优缺点&#xff0c;以帮…

rocketmq的顺序消息开发注意事项

1. 参考消息重试&#xff0c;要对 MaxReconsumeTimes进行设置。之前就是因为没有进行设置&#xff0c;导致了队头阻塞问题。 rokcetmq和kafka一样&#xff0c;当顺序消息写入的多个队列中后&#xff0c;如果是顺序消息&#xff0c;当前的队列的队头一直消费失败的时候&#x…

Hive的窗口函数

定义&#xff1a; 聚合函数是针对定义的行集(组)执行聚集,每组只返回一个值.如sum()、avg()、max() 窗口函数也是针对定义的行集(组)执行聚集,可为每组返回多个值.如既要显示聚集前的数据,又要显示聚集后的数据.步骤&#xff1a; 1.将记录分割成多个分区. 2.在各个分区上调用窗…

使用Pixi.js 图片切换特效(图片分段下滑以及复原)

1.效果: 2.实现原理: 将图片按宽高切分为x*y(具体可以自己调整)个矩形区域&#xff0c;对每个顶点分配一个随机值noiseValue(-1到1之间),在顶点着色器中根据这个随机值而做出不同的y轴位移效果从而实现出分段的下滑或者复原的效果。 3.代码实现: 首先是顶点着色器的代码,其中…

java优先级队列

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

OpenSearch LLM智能问答版全新升级

阿里云OpenSearch LLM智能问答版是OpenSearch推出的一站式开箱即用的检索增强生成&#xff08;RAG&#xff09;云产品&#xff0c;帮助开发者快速构建多模态对话式搜索服务。 自2023年6月上线以来&#xff0c;OpenSearch LLM智能问答版已累计支持了数百家云上客户搭建RAG系统&…

人工智能|深度学习——YOLOV8结构图

YoloV8相对于YoloV5的改进点&#xff1a; Replace the C3 module with the C2f module.Replace the first 6x6 Conv with 3x3 Conv in the Backbone.Delete two Convs (No.10 and No.14 in the YOLOv5 config).Replace the first 1x1 Conv with 3x3 Conv in the Bottleneck.Use…

免费SSL证书签发安装指南

一、签发 1.选择证书颁发机构&#xff08;CA&#xff09;&#xff1a;首先&#xff0c;你需要找到一个提供免费SSL证书的CA。有些CA会提供永久免费的SSL证书&#xff0c;而有些则可能只提供有限时间的试用证书&#xff0c;如JoySSL就提供永久免费证书。 2.生成CSR&#xff08…

【面试干货】 两个有序数组的合并排序

【面试干货】 两个有序数组的合并排序 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 使用两个指针分别指向两个数组的起始位置&#xff0c;然后逐个比较两个指针所指向的元素&#xff0c;将较小的元素…

云原生 初识Kubernetes的理论基础

一、k8s 的由来及其技术运用 1.1 k8s的简介 Kubernetes&#xff0c;词根源于希腊语的 舵手、飞行员。在国内又称k8s&#xff08;因为k和s之间有8个字母&#xff0c;所以得名。“国内程序员的幽默”&#xff09;。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#x…

OpenAI发布会最新消息!ChatGPT新功能发布!

关于即将发布的内容&#xff0c;OpenAI 官方帖子提供的唯一细节是&#xff0c;此次发布将更新 ChatGPT 及其最新模型 GPT-4。 OpenAI 员工程博文&#xff08;Bowen Cheng&#xff09;跟了个帖&#xff0c;「比 gpt-5 更酷」&#xff0c;不过又迅速删帖。 OpenAI 的葫芦里到底卖…

C 深入指针(4)

目录 一、字符指针变量 1 初始化 2 与字符串数组的区别 二、数组指针变量 1 初始化 2 二维数组传参本质 三、函数指针变量 1 初始化 2 用法 四、typedef关键字 五、函数指针数组 一、字符指针变量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

前端 JS 经典:数组去重万能方法

前言&#xff1a;只需要掌握这一个方法&#xff0c;就可以对有任何重复的数据数组&#xff0c;进行去重了。 可以自己思考下&#xff0c;怎么对以下对象数组去重&#xff1a; const arr [{ a: 1, b: 2 },{ b: 2, a: 1 },{ a: 1, b: 2, c: { a: 1, b: 2 } },{ b: 2, a: 1, c:…

vue2 中使用audio播放音频

<audio controls ref"audioPlayer" style"width:800px;"><source :src"obj.audioUrl" /></audio> data() {return {obj: {audioUrl: require(../../../../public/audio/video.wav)}}}, 有个地方一定要注意一下. 如果不写req…

推荐丨免费的HTTPS证书在哪里可以申请?怎么申请?

当然&#xff0c;申请HTTPS证书的简化流程大致可以分为以下四个步骤&#xff1a; 1. 确定证书类型&#xff1a; - 首先&#xff0c;根据你的网站需求选择合适的HTTPS证书。常见类型包括&#xff1a;域名验证型&#xff08;DV&#xff09;、组织验证型&#xff08;OV&#xff09…

智慧校园是什么?如何定义?

智慧校园从边界上来说&#xff0c;是指以物联网为中心的智慧化的学校学习、日常生活一体化的环境&#xff0c;经过信息化手法将教育、教务办理和学校日子进行充沛交融&#xff0c;完结智慧化服务和办理的学校形式。 现在智慧校园已成未来趋势&#xff0c;我国的学校环境阅历了巨…

在springboot项目中自定义404页面

今天点击菜单的时候不小心点开了一个不存在的页面&#xff0c;然后看到浏览器给的一个默认的404页面 后端的程序员都觉得这页面太丑了&#xff0c;那么怎么能自定义404页面呢&#xff1f; 很简单&#xff0c;在我们的springboot的静态资源目录下创建一个error包&#xff0c;然…

氮气柜开门停止充氮、开门亮灯和超湿报警功能介绍

氮气柜是一种专门设计用于存储对湿度敏感的电子元器件、半导体材料、精密仪器、化学试剂等物品的设备&#xff0c;它通过注入高纯度氮气来降低内部湿度&#xff0c;以防止物品受潮或氧化。除基本功能外&#xff0c;沐渥科技新增了开门停止充氮、开门亮灯以及超湿报警这三个功能…