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

 

      🧸安清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/beanshttps://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;}@Overridepublic 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/beanshttps://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;}@Overridepublic 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 {@Overridepublic 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;}@Overridepublic 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/beanshttps://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.rhkb.cn/news/450847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【K8S系列】Kubernetes pod节点NotReady问题及解决方案详解【已解决】

Kubernetes 集群中的每个节点都是运行容器化应用的基础。当节点状态显示为 NotReady 时&#xff0c;意味着该节点无法正常工作&#xff0c;这可能会导致 Pod 无法调度&#xff0c;从而影响整个应用的可用性。本文将深入分析节点不健康的各种原因、详细的排查步骤以及有效的解决…

查看SQL执行计划 explain

查看SQL执行计划 explain explain使用方式 alter session set current_schematest; explain plan for sql语句; --并不会实际执行&#xff0c;因此生成的执行计划也是预估的 select * from table(dbms_xplan.display); explain使用场景 1.内存中没有谓词信息了&#xff0…

MySQL从入门到跑路

SQL语言 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于管理和操作关系数据库的一种标准编程语言。 SQL分类&#xff1a; DDL(Data Definition Language)&#xff1a;数据定义语言&#xff0c;用于操作数据库、表、字段&#xff0c…

前端文件流导出

1、前端代码 ​ /** 导出 */ const handleExport async () > {let config {responseType: blob,headers: {Content-Type: application/json,},};const res await getTargetExport(config);const blob new Blob([res]);const fileName PK目标跟进导出列表.xls;const li…

SpringBoot整合Freemarker(一)

Freemarker和jsp一样是一个视图的引擎模板&#xff0c;其实所有的模板引擎的工作原理都是类似的&#xff0c;如下图&#xff1a; 接下来就具体讲解一下Freemarker的用法&#xff0c;参考手册&#xff1a;模板 数据模型 输出 - FreeMarker 中文官方参考手册 SpringBoot默认就…

【浏览器】如何正确使用Microsoft Edge

1、清理主页广告 如今的Microsoft Edge 浏览器 主页太乱了&#xff0c;各种广告推送&#xff0c;点右上角⚙️设置&#xff0c;把快速链接、网站导航、信息提要、背景等全部关闭。这样你就能得到一个超级清爽的主页。 网站导航       关闭 …

HarmonyOS NEXT和认证(在校生的大福利)

今天重点关注了一下HarmonyOS NEXT&#xff0c;也就是我们所说的纯血鸿蒙&#xff01; 根据官方的说法&#xff1a; 欢迎开发者进入HarmonyOS NEXT。暌违一年&#xff0c;HarmonyOS NEXT终于在万千开发者的期待下从幕后走向台前。 HarmonyOS NEXT采用全新升级的系统架构&#…

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

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

Linux基本使用和程序部署

文章目录 一. Linux背景Linux发行版 二. Linux环境搭建Linux常见命令lspwdcdtouchcatmkdirrmcpmvtailvimgreppsnetstat管道 三. 搭建java部署环境安装jdk安装mysql部署Web项目到Linux 一. Linux背景 1969−1970年,⻉尔实验室的DennisRitchie和KenTompson开发了Unix操作系统. 他…

在Linux操作系统上安装NVM教程——CentOS 7/VMware 17版

目录 一、测试网络是否能上网 二、下载阿里云镜像 三、解决执行yum命令出现报错&#xff08;没有就跳过&#xff09; 四、下载NVM安装包 五、解压NVM安装包 六、安装Node 七、连接新的动态库 八、升级GLIBC版本 九、安装GCC 十、查看当前服务器CentOS版本 一、测试网…

[AWS云]kafka调用和创建

背景:因为因为公司的项目需要使用AWS的kafka&#xff0c;但是在创建和使用过程中都遇到了一些报错和麻烦&#xff0c;毕竟老外的东西&#xff0c;和阿里云、华为使用起来还是不一样。 一、创建&#xff08;创建的配置过程就略了&#xff0c;就是配置一下可用区、型号&#xff0…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…

深入理解售后派单管理系统,功能优势一览

售后派单管理系统优化售后服务流程&#xff0c;提升响应速度、运营效率和服务质量。ZohoDesk等系统通过自动化派单、实时调度监控等功能&#xff0c;助力企业赢得竞争优势。适用于电子产品、汽车、IT及房地产等行业。 一、什么是售后派单管理系统 售后派单管理系统是一种专门用…

第七届机械、控制与计算机工程国际学术会议(ICMCCE2024)

重要信息 大会官网&#xff1a;www.icmcce.com 大会地点&#xff1a;中国杭州 大会时间&#xff1a;2024年10月25-27日 大会简介 第七届机械、控制与计算机工程国际学术会议定于2024年10月25日至27日在中国杭州召开。本届会议由巢湖学院主办&#xff0c;主要围绕“机械”、…

AGI|浅尝多Agent协作框架CrewAI,打造一个智能旅行助手

目录 一、介绍 二、特性 三、使用案例 四、 结语 一、介绍 Crew AI是一个多智能体协作智能框架&#xff0c;可以编排角色扮演的AI智能体。旨在协调角色扮演的自主AI代理&#xff0c;通过促进协作智能体&#xff0c;Crew AI使代理能够无缝协作&#xff0c;共同应对复杂任务。…

【JavaScript】LeetCode:61-65

文章目录 61 课程表62 实现Trie&#xff08;前缀树&#xff09;63 全排列64 子集65 电话号码的字母组合 61 课程表 Map BFS拓扑排序&#xff1a;将有向无环图转为线性顺序。遍历prerequisites&#xff1a;1. 数组记录每个节点的入度&#xff0c;2. 哈希表记录依赖关系。n 6&a…

(十九)、使用 minikube 运行k8s 集群

文章目录 1、机器信息2、官方文档3、启动本机 docker4、安装 minikube5、启动 minikube5.1、报错重试应该做什么&#xff1f; 6、启动后7、安装 Vs Code & k8s extensions8、在 VS Code 查看运行起来的 k8s 集群9、基本命令10、虚拟化不支持 Mac Os 14.3.1 1、机器信息 Ma…

c++算法第3天

本篇文章包含三道算法题&#xff0c;难度由浅入深&#xff0c;适合新手练习哟 目录 第一题 题目链接 题目解析 代码原理 代码编写 本题总结 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第一题 题目链接 [NOIP2…

Iceberg 基本操作和快速入门二-Spark DDL操作

Iceberg 基本操作和快速入门一-CSDN博客 启动spark会话 docker exec -it spark-iceberg spark-sql 创建表 CREATE TABLE prod.db.sample ( id bigint NOT NULL COMMENT unique id, data string) USING iceberg; 创建分区表 CREATE TABLE prod.db.sample_par ( id bigint, …

No.17 笔记 | XXE漏洞:XML外部实体注入攻击

1. XXE漏洞概览 XXE&#xff08;XML External Entity&#xff09;是一种允许攻击者干扰应用程序对XML输入处理的漏洞。 1.1 XXE漏洞比喻 想象XML解析器是一个听话的机器人&#xff0c;而XXE就是利用这个机器人的"过分听话"来获取不应该获取的信息。 1.2 XXE漏洞危…