【Spring篇】初识之Spring的入门程序及控制反转与依赖注入

news2024/10/18 17:57:34

 

      🧸安清h:个人主页

   🎥个人专栏:【计算机网络】,【Mybatis篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。


 文章目录

🎯初始Spring 

🎯Spring的体系结构

🎯Spring的下载及目录结构

🎯Spring的入门程序

🚦pom.xml文件

🚦创建类Hello

🚦创建配置文件applicationContext.xml

🚦创建测试类

🎯控制反转与依赖注入

🚦控制反转概念

🚦依赖注入概念

🚦依赖注入类型

✨构造方法注入

🍔编写用户类

 🍔配置Bean信息

🍔编写测试类

✨setter方法注入

🍔编写用户类

 🍔配置Bean信息

🍔编写测试类

🚦依赖注入应用

🍔编写Dao层

🍔编写Service层

🍔编写applicationContext.xml配置文件

🍔编写测试类


🎯初始Spring 

Spring框架是一个开源的Java平台,用于简化企业级应用程序的开发。它提供了一系列的功能,使得开发者能够更容易地构建和维护应用程序。以下是Spring框架的一些主要优点:

  1. 依赖注入(DI):Spring通过依赖注入提供了一种松耦合的方式来组装应用程序的不同部分。
  2. 面向切面编程(AOP):Spring支持面向切面编程,允许开发者将横切关注点(如日志记录、事务管理等)与业务逻辑分离。
  3. 声明式事务管理:Spring提供了声明式事务管理,使得事务管理变得更加简单和透明。
  4.  集成多种数据访问技术:Spring整合了JDBC、Hibernate、JPA等数据访问技术,提供了一致的编程模式。
  5.  支持多种视图层技术:Spring支持多种视图层技术,如JSP、Thymeleaf、JSF等。
  6.  支持MVC:Spring提供了一个灵活的Web MVC框架,使得Web应用程序的开发更加简单。
  7. 轻量级:Spring框架本身是轻量级的,不会对应用程序的性能造成太大影响。
  8. 模块化:Spring框架是高度模块化的,开发者可以根据需要选择使用特定的模块。
  9. 支持多种配置方式:Spring支持XML、Java配置以及注解等多种配置方式。
  10. 支持响应式编程:Spring 5引入了对响应式编程的支持,使得开发非阻塞应用程序变得更加容易。

这些优点使得Spring成为Java企业级应用程序开发的首选框架之一。
 

🎯Spring的体系结构

Spring是模块化的,允许使用者只选择适用于自己的模块。下面对部分模块进行简单介绍:

  1. 核心容器

    • Spring Core:提供了依赖注入(DI)和面向切面编程(AOP)的支持。
    • Spring Beans:管理配置元数据,处理Bean的生命周期。
    • Spring Context:扩展了核心容器,提供了更高级的特性,如国际化支持、资源访问、事件传播等。
    • Spring Expression Language (SpEL):提供了强大的表达式语言,可以在运行时查询和操作对象图。

  2. 数据访问/集成

    • JDBC:提供JDBC抽象层,简化数据库操作。
    • ORM:整合了Hibernate、JPA等对象关系映射框架。
    • OXM:提供了对象XML映射的支持。
    • JMS:支持Java消息服务。
    • 事务管理:提供了声明式和编程式事务管理。
  3. Web

    • Spring MVC:实现了MVC模式,支持Web应用程序的开发。
    • Spring WebFlux:支持响应式编程的Web框架。
    • Spring Web Services:支持SOAP和RESTful Web服务。
  4. AOP
  1. 提供了面向切面编程的支持,允许开发者定义切面和通知。

🎯Spring的下载及目录结构

在使用Spring之前需要获取它的jar包,这些jar包可以在Spring官网下载。下载完成后会得到如下:

🎯Spring的入门程序

🚦pom.xml文件

在pom.xml文件中添加以下代码:

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

🚦创建类Hello

在包com.haust.pojo中编写类Hello,具体代码如下:

public class Hello {
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    public void show(){
        System.out.println(username+"欢迎来到Spring");
    }
}

🚦创建配置文件applicationContext.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
       https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="helloSpring" class="com.haust.pojo.Hello">
        <property name="username" value="清"></property>
     </bean>
</beans>

🚦创建测试类

public class HelloTest {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        Hello hello= (Hello) applicationContext.getBean("helloSpring");
        hello.show();
    }
}

🎯控制反转与依赖注入

🚦控制反转概念

控制反转(Inversion of Control,IoC)是一种设计原则,用来减少计算机编程中的耦合度。这个概念的核心思想是将对象之间的控制逻辑从对象本身转移到外部容器或框架中,从而实现解耦。

在传统的编程模式中,对象通常自己负责获取它们所需的依赖项,例如,通过直接创建对象或者从全局上下文中查找它们。这种方式会导致代码之间的高度耦合,使得代码难以测试、维护和重用。

控制反转通过以下两种主要方式实现:

  1. 依赖注入(Dependency Injection,DI): 这是控制反转最常见的形式。在依赖注入中,对象不需要自己查找或创建依赖项,而是被动地从外部“注入”这些依赖。依赖注入可以是显式的(通过构造函数、setter方法或接口)或隐式的(通过注解或约定)。

  2. 服务定位器模式(Service Locator pattern): 在服务定位器模式中,对象不直接创建或查找依赖项,而是通过一个中介(服务定位器)来访问它们。服务定位器负责查找和提供所需的依赖项。

控制反转的好处包括:

  • 降低耦合度:对象不再需要知道如何创建或查找它们的依赖项,因此减少了对象之间的依赖关系。
  • 提高模块化:由于依赖项是通过外部注入的,因此可以更容易地替换模块或组件。
  • 增强测试性:可以更容易地对对象进行单元测试,因为可以注入模拟(mock)对象或存根(stub)。
  • 提高代码的可读性和可维护性:代码更加清晰,因为对象不再包含复杂的逻辑来查找或创建依赖项。

🚦依赖注入概念

依赖注入(Dependency Injection,简称DI)是一种实现控制反转(Inversion of Control,IoC)的设计模式。它是一种编程技巧,用于减少代码间的耦合度,从而使得代码更容易测试、维护和重用。依赖注入的核心思想是将组件(对象)的依赖关系由外部传递进来,而不是由组件自己创建或查找依赖。

依赖注入的主要目的是:

  1. 降低组件之间的耦合度:组件不需要知道如何创建或获取它们的依赖项,这些依赖项将由外部提供。
  2. 提高组件的可测试性:由于依赖项是外部提供的,可以很容易地替换为模拟对象(mocks)或存根(stubs)进行单元测试。
  3. 增强代码的可读性和可维护性:组件的创建和依赖项的获取被分离,使得代码结构更清晰,更易于理解和维护。

🚦依赖注入类型

✨构造方法注入

在Spring框架中,构造方法注入是一种依赖注入的方式,它通过构造方法将所需的依赖项传递给Bean。这种方式通常被认为是更推荐的做法,因为它可以使Bean的状态更加明确,并且可以确保在创建Bean时所有的必需依赖项都已经准备好。下面通过一个示例来演示:

🍔编写用户类

public class User {
    private int id;
    private String username;
    private String password;

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
 🍔配置Bean信息

在Spring的XML配置文件中,<constructor-arg> 标签用于构造方法注入。在这个例子中,<constructor-arg> 标签定义了传递给 User 类构造方法的参数。每个 <constructor-arg> 标签代表一个参数,并且可以通过 name 属性指定参数的名称,或者省略 name 属性,Spring将根据参数的位置来匹配。

在applicationContext-User.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
       https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user1" class="com.haust.pojo.User">
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="username" value="lili"/>
        <constructor-arg name="password" value="123456"/>
    </bean>
</beans>
🍔编写测试类
public class UserTest {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext-User.xml");
        User user=applicationContext.getBean("user1",User.class);
        System.out.println(user);
    }
}

✨setter方法注入

在Spring框架中,setter方法注入是一种常用的依赖注入方式,它利用类的setter方法来注入依赖项。这种方式的好处是可以在运行时改变Bean的属性值,从而提供了更大的灵活性。

以下是setter方法注入的一个简单示例:

🍔编写用户类

用户类中必须有setter方法

public class User2 {
    private int id;
    private String username;
    private String password;

    public void setId(int id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User2{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
 🍔配置Bean信息
    <bean id="user2" class="com.haust.pojo.User2">
        <property name="id" value="2"/>
        <property name="username" value="popo"/>
        <property name="password" value="123"/>
      </bean>
🍔编写测试类
public class User2Test {
    public static void main(String[]args){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext-User.xml");
        User2 user=applicationContext.getBean("user2", User2.class);
        System.out.println(user);
    }

}

🚦依赖注入应用

了解两种注入方式之后,下面通过一个示例,实现一个登录验证。

🍔编写Dao层

在dao包新建接口UserDao并添加login()方法实现登录功能:

public interface UserDao {
    public boolean login(String name,String password);
}

在impl包中新建UserDaoImpl类用来实现UserDao类中的login()方法:

public class UserDaoImpl implements UserDao {

    @Override
    public boolean login(String name, String password) {
        if(name.equals("lili")&&password.equals("123")){
            return true;
        }
        return false;
    }
}
🍔编写Service层

在service包中新建接口UserService,UserService作为业务逻辑层接口:

public interface UserService {
    public boolean login(String name,String password);
}

在impl包中新建UserServiceImpl类用来实现UserService类中的login()方法:

public class UserServiceImpl implements UserService {
   private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public boolean login(String name, String password) {
        return userDao.login(name, password);
    }
}
🍔编写applicationContext.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
       https://www.springframework.org/schema/beans/spring-beans.xsd">
   <bean id="userDao" class="com.haust.impl.UserDaoImpl"></bean>
    <bean id="UserService" class="com.haust.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>
</beans>
🍔编写测试类
public class LoginTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        boolean flag = userService.login("lili", "123");
        if (flag) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }
    }
}

 以上就是今天要讲的内容了,主要介绍了Spring入门的控制反转和依赖注入以及相关示例,如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!
 

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

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

相关文章

cmake 编译 01

CMakeLists.txt cmake_minimum_required(VERSION 3.10)project(MyProject)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True)# 如果顶层 CMakeLists.txt 文件中使用了 add_subdirectory() 命令&#xff0c;CMake 会进入指定的子目录&#xff0c;并处理该目录…

每周心赏|一觉醒来,我得诺奖了?

这次诺奖名单我看了&#xff0c;我不在里面&#xff0c;说实话我很失望&#x1f62e;‍&#x1f4a8;&#xff0c;希望AI可以懂事点&#xff0c;立刻、马上为我颁奖&#xff01; AI&#xff1a;收到&#x1fae1;&#xff0c;现在就去做。 自从发现了这个可以做诺奖海报的智能…

【Python】NumPy(一):数据类型、创建数组及基本操作

目录 ​NumPy初识 1.什么是NumPy&#xff1f; NumPy的应用 NumPy数据类型 Python基本数据类型 NumPy数据类型 NumPy数组 创建数组 1.使用numpy.array() 2.使用arange()方法创建 3.使用linspace()创建等差数列 4使用zeros()创建数组 5.使用ones()创建数组 6.利用…

精华帖分享 | 从华泰研报出发,开启人工智能炼丹篇章!

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为1go的程序猿&#xff0c;发布于2024年3月30日。 以下为精华帖正文&#xff1a; 最近研究完邢大新发布的各种框架后&#xff0c;突然冒出了想当牛马的想法。但是&#xff0c;本人作为一个量化小白&#xff0c;从头开…

【图解版】力扣第1题:两数之和

Golang代码实现 func twoSum(nums []int, target int) []int {m : make(map[int]int)for i : range nums {if _, ok : m[target - nums[i]]; ok {return []int{i, m[target - nums[i]]}} m[nums[i]] i}return nil }

【深度学习】阿里云GPU服务器免费试用3月

【深度学习】阿里云GPU服务器免费试用3月 1.活动页面2.选择交互式建模PAI-DSW3.开通 PAI 并创建默认工作空间4.前往默认工作空间5.创建交互式建模&#xff08;DSW&#xff09;实例 1.活动页面 阿里云免费使用活动页面 2.选择交互式建模PAI-DSW 支持抵扣PAI-DSW入门机型计算用量…

ONLYOFFICE文档8.2:开启无缝PDF协作

ONLYOFFICE 开源办公套件的最新版本新增约30个新功能&#xff0c;并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作&#xff0c;支持插件和 AI 集…

C++从入门到起飞之——红黑树 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 红⿊树的概念 2. 红⿊树的实现 2.1 构建整体框架 2.2 红黑树的插入 2.3 红黑树的验证 2.4 红黑树…

C#学习笔记(三)

C#学习笔记&#xff08;三&#xff09; 第 二 章 命名空间和类、数据类型、变量和代码规范二、类的组成和使用分析1. 基本概念2. 类的内容组成3. 方法的初步理解 第 二 章 命名空间和类、数据类型、变量和代码规范 二、类的组成和使用分析 1. 基本概念 类是程序的基本单元&a…

能源设施安全智能守护:AI监控卫士在油气与电力领域的应用

能源行业的安全与稳定运行对于社会的可持续发展至关重要&#xff0c;无论是石油、天然气还是电力设施&#xff0c;都面临着复杂的监测需求。思通数科推出的AI视频监控卫士&#xff0c;通过应用先进的人工智能技术&#xff0c;为能源行业的安全监测提供了高效、智能的解决方案。…

Web前端高级工程师培训:使用 Node.js 构建一个 Web 服务端程序(1)

1-使用 Node.js 构建一个 Web 服务端程序 文章目录 1-使用 Node.js 构建一个 Web 服务端程序1、Node.js的安装与基础语法2、Node.js 中的 JavaScript 与 浏览器中的 JavaScript2-1、Node.js 中的 JavaScript2-2、浏览器 中的 JavaScript 3、什么是 WebServer(APP)&#xff1f;4…

USB UVC开启 PU功能研究

文章目录 前言一、UVC拓展结构二、修改是否开启亮度等功能 在处理单元1. 处理单元理解2.实际代码部分2.修改主要对控制段进行修改 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 在哪里学习UVC 肯定是USB中文网 网址 https:…

React父子组件,父组件状态更新,子组件的渲染状况

目录 React.memo不包裹 React.memo包裹 传递一个简单数据类型 传递一个复杂数据类型 传递一个函数 React.memo不包裹 如果子组件没有使用React.memo包裹&#xff0c;则父组件中数据更新时&#xff0c;子组件会重新进行渲染 父组件&#xff1a; import { useState } fro…

MongoDB 8.0已全面可用

全球广受欢迎的文档型数据库MongoDB目前最新最强的版本&#xff0c;在易用性、企业级安全性、 弹性、可用性等方面均有大幅提升&#xff0c;适用于各种应用程序。 MongoDB 8.0的优化使整体吞吐量提高了32%&#xff0c;时间序列数据聚合的处理速度提高了200%以上。MongoDB 8.0的…

SegFormer: 一个基于Transformer的高效视觉图像分割算法

今天我分享一篇关于 Transformer 架构在图像视觉分割中的应用的文章&#xff0c;主题是 SegFormer。SegFormer 是一种新颖的语义分割方法&#xff0c;它结合了无位置编码的层次化 Transformer 编码器和轻量级 All-MLP 解码器&#xff0c;避免了传统方法中的复杂设计&#xff0c…

Flink Kubernetes Operator

Flink Kubernetes Operator是一个用于在Kubernetes集群上管理Apache Flink应用的工具。 一、基本概念 Flink Kubernetes Operator允许用户通过Kubernetes的原生工具&#xff08;如kubectl&#xff09;来管理Flink应用程序及其生命周期。它简化了Flink应用在Kubernetes集群上的…

字节 HLLM 论文阅读

github连接&#xff1a;https://github.com/bytedance/HLLM 探讨问题&#xff1a; 推荐LLM的三个关键问题&#xff1a; LLM预训练权重通常被认为是对世界知识的概括&#xff0c;其对于推荐系统的价值&#xff1f;对推荐任务进行微调的必要性&#xff1f;LLM是否可以在推荐系统…

SL3037B降压恒压芯片DC24伏输入5伏输出带单片机,电流100mA

一、SL3037B芯片概述 SL3037B是一款内置功率MOSFET的单片降压型开关模式转换器&#xff0c;具有高效、稳定、外围元器件少等特点。它能够在宽输入电源范围&#xff08;5.5~60V&#xff09;内实现0.6A的峰值输出电流&#xff0c;并具有出色的线电压和负载调整率。此外&#xff…

uniapp小程序自定义聚合点

注&#xff1a; 1.默认的聚合点可以点击自动展示子级点位&#xff0c;但是自定义的聚合点在ios上无法触发markerClusterClick的监听&#xff0c;至今未解决&#xff0c;不知啥原因 2.ios和安卓展示的点位样式还有有差别 源码附上 <template><view class"marke…

SpringMVC之 文件上传和下载

1. 文件上传 1.1 前端注意事项 文件上传操作&#xff0c;前端的表单项需要如下三项设置&#xff1a; &#xff08;1&#xff09;input标签的type属性应设置为file&#xff0c;并且注意不要在input标签中设置value属性&#xff0c;因为这可能导致文件上传不成功&#xff1b; …