后端:Spring-1

在这里插入图片描述

文章目录

    • 1. 了解 spring(Spring Framework)
    • 2. 基于maven搭建Spring框架
      • 2.1 纯xml配置方式来实现Spring
      • 2.2 注解方式来实现Spring
      • 3. Java Config类来实现Spring
    • 2.4 总结

1. 了解 spring(Spring Framework)

传统方式构建spring(指的是Spring Framework)项目,导入依赖繁琐(需要自行去maven官网去下载依赖或者copy对应的依赖,并且各个依赖之间可能还存在版本冲突的问题)、项目配置繁琐(需要添加一些配置文件,且配置文件中需要写一些重复的代码,总之很繁琐)。
而Spring Boot简化了上述操作,比如之前的Spring项目中整合mybatis时,需要在配置文件中定义对应的bean才行,而使用Spring Boot之后,(在引入对应依赖的前提下)只需要在application.yml中添加一些数据库连接的对应信息及其他一些配置,然后就可以实现同样的效果了。
上述只是对于两者做的一个简单比较。请添加图片描述

说到Spring,应该联想到IOC(控制反转)、DI(依赖注入)。所谓控制反转(对象创建权力)一个类需要用到另外一个类的对象,通常做法是在这个类下new另外一个类对象,但是这样会让这两个对象产生一个强关联,它们之间就建立了强耦合的关系,而代码之间的耦合度越高,对越后期维护越不利。而使用了Spring之后,可以把类放到容器中进行管理,需要用到某个类时只需要把这个类进行依赖注入即可,从而降低耦合度。

2. 基于maven搭建Spring框架

使用idea创建一个maven项目,这只是一个例子,项目结构如下:
在这里插入图片描述
导入junit依赖,如下:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

各个类的参考代码如下:

package com.lize.dao;

public class UserDao {

    public void printUserD(){
        System.out.println("UserDao");
    }
}

package com.lize.service;

import com.lize.dao.UserDao;

public class UserService {

    private UserDao ud = new UserDao();

    public void printUserS(){
        ud.printUserD();
    }
}

测试代码如下:

import com.lize.service.UserService;
import org.junit.Test;

public class Test01 {

    @Test
    public void test(){
        UserService userService = new UserService();
        userService.printUserS();
    }
}

2.1 纯xml配置方式来实现Spring

下面使用Spring方式来降低上述代码耦合度。首先,添加spring的对于依赖。

<dependency>
   <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>

在resources文件夹下面创建一个xml文件,在xml文件添加对应的bean标签即可。

<?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-4.0.xsd">


    <bean class="com.lize.dao.UserDao" name="userDao"/>
    <bean class="com.lize.service.UserService" name="userService">
        <property name="ud" ref="userDao"/>
        <!--   ud为对应的service文件的变量名     -->
    </bean>

</beans>

当然对应service文件也需要修改,添加set方法。

package com.lize.service;

import com.lize.dao.UserDao;

public class UserService {

    private UserDao ud;

    public void setUd(UserDao ud) {
        this.ud = ud;
    }

    public void printUserS(){
        ud.printUserD();
    }
}

运行代码如下,从abc.xml文件获取对应容器对象,然后从这个对象中获取对应的bean。

import com.lize.service.UserService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test01 {
    @Test
    public void test(){

        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("abc.xml");
        UserService us = (UserService) ctx.getBean("userService");
        us.printUserS();
    }
}

2.2 注解方式来实现Spring

此时abc.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.lize"/>
	<!--   dao、service包在这个目录下,spring容器会自动扫描,当然需要在
	对应类上添加注解     -->
</beans>

此时在dao、service对应的类上添加注解“@Component”,如下:

package com.lize.service;


import com.lize.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserService {

    @Autowired
    private UserDao ud;

    public void printUserS(){
        ud.printUserD();
    }
}

使用注解“Autowired"自动导入,不需要再写set方法,运行代码不需要修改。

3. Java Config类来实现Spring

在2的基础上,abc.xml可以不需要了,此时只需要定义一个配置类,如下:

package com.lize.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
// 表明这是一个配置类
@ComponentScan("com.lize")
// 需要扫描的包
public class SpringConfig {
}

运行方式如下:

import com.lize.config.SpringConfig;
import com.lize.service.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test01 {
    @Test
    public void test2(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService us = (UserService) context.getBean("userService");
        us.printUserS();
    }
}

2.4 总结

第一种方式基于xml文件实现控制反转,需要在xml文件定义大量的bean;第二种方式只需要在xml文件添加扫描标签,并且需要在对应的类上添加注解;第三种方式需要定义配置类,在配置类上添加对应注解,通过注解的方式去扫描对应包下的对应类。Spring Boot基于第三种方式再进一步封装实现的。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt QStackedLayout详解

QStackedLayout类提供了一种布局方式&#xff0c;使得在同一时间内只有一个子部件&#xff08;或称为页面&#xff09;是可见的。这些子部件被维护在一个堆栈中&#xff0c;用户可以通过切换来显示不同的子部件&#xff0c;适合用在需要动态显示不同界面的场景&#xff0c;如向…

C++进阶:C++11的新特性

✨✨所属专栏&#xff1a;C✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ C11的发展历史 2011年&#xff0c;C标准委员会发布了C11标准&#xff0c;这是C的一次巨大飞跃&#xff0c;引入了许多重要的新特性&#xff0c;如智能指针、lambda表达式、并发编程支持等。这一版本的发布对C社…

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…

OpenAI推出搜索GPT,进军搜索引擎领域

OpenAI 推出了一项新功能——Search GPT&#xff0c;为 ChatGPT 引入实时网络搜索功能&#xff0c;使其站上与 Google 和 Bing 等搜索巨头竞争的舞台。 OpenAI 产品的重大变化&#xff0c;Search GPT 承诺提供快捷、实时的答案&#xff0c;并附上可靠来源的链接。 ChatGPT 一直…

Unity XR Interaction Toolkit 开发教程(3)快速配置交互:移动、抓取、UI交互【3.0以上版本】

获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&#xff1a; 3.快速配置交互&#xff1a;移动、抓取、UI交互【Unity XR Interaction Toolkit 跨平台开发教程】&#xff08;3.0以上版本&#xff09; 系列教程专栏&…

SE-Net模型实现猴痘病识别

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DeepLabV3模型实现人体部位分割CIHP数据】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.…

深度学习之权重、偏差

1 权重偏差初始化 1.1 全都初始化为 0 偏差初始化陷阱&#xff1a; 都初始化为 0。 产生陷阱原因&#xff1a;因为并不知道在训练神经网络中每一个权重最后的值&#xff0c;但是如果进行了恰当的数据归一化后&#xff0c;我们可以有理由认为有一半的权重是正的&#xff0c;另…

企业物流管理数据仓库建设的全面指南

文章目录 一、物流管理目标二、总体要求三、数据分层和数据构成&#xff08;1&#xff09;数据分层&#xff08;2&#xff09;数据构成 四、数据存储五、数据建模和数据模型&#xff08;1&#xff09;数据建模&#xff08;2&#xff09;数据模型 六、总结 在企业物流管理中&…

Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战

数据的并行导出与压缩下载&#xff1a;EasyExcel&#xff1a;实现大规模数据的并行导出与压缩下载 构建高效排队导出&#xff1a;解决多人同时导出Excel导致的服务器崩溃 SpringBoot集成EasyExcel 3.x&#xff1a; 前言 在企业级应用开发中&#xff0c;常常需要处理复杂的 …

【网络篇】计算机网络——链路层详述(笔记)

目录 一、链路层 1. 概述 2. 链路层提供的服务 &#xff08;1&#xff09;成帧&#xff08;framing&#xff09; &#xff08;2&#xff09;链路接入 &#xff08;3&#xff09;可靠交付 &#xff08;4&#xff09;差错检测和纠正 3. 链路层的实现 二、多路访问链路和…

Android——显式/隐式Intent

概述 在Android中&#xff0c;Intent是各个组件之间信息通信的桥梁&#xff0c;它用于Android各组件的通信。 Intent 的组成部分 一、显式 Intent 第一种方式 Intent intent new Intent(this, ActFinishActivity.class);startActivity(intent);第二种方式 Intent intent …

__init__.py __all__和 __name__的作用及其用法

__ init__.py 的作用及其用法&#xff1a; 包下的__init__.py 所在目录是一个模块包,本身也是一个模块,可用于定义模糊导入时要导入的内容。当我们导入一个包的时候&#xff0c;包下的__init__.py中的代码会自动执行&#xff0c;因此在某些大的项目被使用频率较高的模块&#x…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…

《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— Tabs底部导航栏》

简介 通过学习HarmonyOS Next&#xff0c;实战项目WanAndroid 鸿蒙版&#xff0c;API接口均来自WanAndroid 开源接口&#xff0c;我们一起来做个App吧。 玩Android 开放API&#xff1a;https://www.wanandroid.com/blog/show/2 效果图 创建每个模块下的各个目录 1、feature…

LinkedList 分析

LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较。关于 LinkedList 和ArrayList的详细对比&#xff0c;我们 Java 集合常见面试题总结(上)有详细介绍到。 双向链表 不过&#xff0c;我们在项目中一般是不会使用到 Link…

MybatisPlus入门(六)MybatisPlus-null值处理

一、MybatisPlus-null值处理 1.1&#xff09;问题引入&#xff1a; 在查询中遇到如下情况&#xff0c;有部分筛选条件没有值&#xff0c;如商品价格有最大值和最小值&#xff0c;商品价格部分时候没有值。 1.2&#xff09;解决办法&#xff1a; 步骤一&#xff1a;新建查询实…

基于树莓派的安保巡逻机器人--(一、快速人脸录入与精准人脸识别)

目录 零、前言 一、人脸检测 二、人脸识别 1、采集人脸 2、训练人脸识别模型 3、人脸识别应用 零、前言 随着智能安防需求的增长&#xff0c;基于人工智能和物联网的安保系统逐渐成为趋势。树莓派因其低成本、高扩展性等特点&#xff0c;成为很多AI项目的理想平台。本文将为大…

网络编程项目之UDP聊天室

项目要求 利用UDP协议&#xff0c;实现一套聊天室软件。服务器端记录客户端的地址&#xff0c;客户端发送消息后&#xff0c;服务器群发给各个客户端软件。 问题思考 客户端会不会知道其它客户端地址&#xff1f; UDP客户端不会直接互连&#xff0c;所以不会获知其它客户端地址…

Java-String类

字符串这个词我想同学们并不陌生&#xff0c;但Java语言中的字符串和我们之前所学习的C语言字符串&#xff0c;差别可谓是非常之大&#xff0c;因为在C语言当中&#xff0c;想要表示一个字符串&#xff0c;就只能使用字符数组或字符指针&#xff0c;但是这种" 对数据进行细…

大学生网上面试注意事项,试试白瓜面试

在数字化时代&#xff0c;大学生网上面试已成为求职过程中的一个关键环节。为了在这个虚拟舞台上留下深刻印象&#xff0c;以下是一些针对大学生网上面试的注意事项&#xff0c;同时&#xff0c;我们将探讨如何利用“白瓜面试”这一AI面试助手来提升你的面试表现。 大学生网上…