15、Spring框架

news2025/1/11 21:54:36

目录

什么是Spring

Spring优点

 Spring体系结构

Spring新特性

Spring的入门程序 

新建立Maven项目

创建名为HelloSpring的类

新建applicationContext.xml文件

XML文件的约束信息配置

测试类TestHelloSpring

 控制反转

依赖注入 

依赖注入和控制反转的比较

依赖注入的类型

依赖注入的实现方式

(1)构造方法注入

(2)setter方法注入

构造方法注入

新建User1类

获取Bean的配置信息

setter方法注入

新建User2类

获取Bean的配置信息

测试类

依赖注入的应用

实验:lab13


Spring官网:Spring | Home

什么是Spring

Spring是由Rod Johnson组织和开发的一个分层的Java SE/EE一站式(full-stack)轻量级开源框架。它最为核心的理念是IoC(控制反转)和AOP(面向切面编程),其中,IoC是Spring的基础,它支撑着Spring对JavaBean的管理功能;AOP是Spring 的重要特性,AOP是通过预编译方式和运行期间动态代理实现程序功能,也就是说可以在不修改源代码的情况下,给程序统一添加功能。

Spring优点

  • 非侵入式设计
  • 降低耦合性
  • 支持AOP编程
  • 支持声明式事务
  • 方便程序的测试
  • 方便集成框架
  • 降低Java EE API的使用难度

 Spring体系结构

Spring新特性

  • 更新JDK基线
  • 修订核心框架
  • 更新核心容器
  • 支持响应式编程
  • 支持函数式Web框架
  • 支持Kotlin
  • 提升测试功能

Spring的入门程序 

新建立Maven项目

Spring四个基础包以及Spring依赖包

(1)spring-core-5.3.25.jar

(2)spring-beans-5.3.25.jar

(3)spring-context-5.3.25.jar

(4)spring-expression-5.3.6. jar

(5)commons-logging-1.2.jar

创建名为HelloSpring的类

package com.itheima;
public class HelloSpring {
    private String userName;
    public void setUserName(String userName){
        this.userName=userName;	}
    public void show() { 
        System.out.println(userName+":欢迎来到Spring");	}
}

新建applicationContext.xml文件

<!-- 将指定类配置给Spring,让Spring创建HelloSpring
	对象的实例 -->
<bean id="helloSpring" class="com.itheima.HelloSpring">
        <!--为userName属性赋值-->
        <property name="userName" value="张">
        </property>
</bean>

XML文件的约束信息配置

 XML文件包含了很多约束信息,如果自己动手去编写,不但浪费时间,还容易出错。XML的约束信息如下所示。

<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">

其实,在Spring的帮助文档中,就可以找到这些约束信息。

测试类TestHelloSpring

public class TestHelloSpring {
    public static void main(String[] args){
        // 初始化spring容器,加载applicationContext.xml配置
        ApplicationContext applicationContext=new 
    ClassPathXmlApplicationContext("applicationContext.xml");
        // 通过容器获取配置中helloSpring的实例
        HelloSpring helloSpring=
        (HelloSpring)applicationContext.getBean("helloSpring");
        helloSpring.show();// 调用方法	}
}

 控制反转

IoC控制反转机制指的是对象由Ioc容器统一管理,当程序需要使用对象时,可以直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器。IoC设计原则如图,它是借助于IoC容器实现具有依赖关系对象之间的解耦,各个对象类封装之后,通过IoC容器来关联这些对象类。

 

依赖注入 

依赖注入(Dependency Inject,缩写DI)就是由IoC容器在运行期间动态地将某种依赖资源注入对象之中。例如,将对象B注入(赋值)给对象A的成员变量。依赖注入的基本思想是:明确地定义组件接口,独立开发各个组件,然后根据组件的依赖关系组装运行。

依赖注入和控制反转的比较

 依赖注入(DI)和控制反转(IoC)是从不同角度来描述了同一件事情。依赖注入是从应用程序的角度描述,即应用程序依赖IoC容器创建并注入它所需要的外部资源;而控制反转是从IoC容器的角度描述,即IoC容器控制应用程序,由IoC容器反向地向应用程序注入应用程序所需要的外部资源。这里所说的外部资源可以是外部实例对象,也可以是外部文件对象等

依赖注入的类型

依赖注入的实现方式

(1)构造方法注入

构造方法注入是指Spring容器调用构造方法注入被依赖的实例,构造方法可以是有参的或者是无参的。Spring在读取配置信息后,会通过反射方式调用实例的构造方法,如果是有参构造方法,可以在构造方法中传入所需的参数值,最后创建类对象。

(2)setter方法注入

属性setter方法注入是Spring最主流的注入方法,这种注入方法简单、直观,它是在被注入的类中声明一个setter方法,通过setter方法的参数注入对应的值。

构造方法注入

新建User1类

public class User1 {
  private int id;   private String name;   private String password;
  public User1(int id, String name, String password){
      this.id=id;	
 this.name=name;
      this.password=password; 
}
  public String toString(){
   return "id="+id+",name="+name+",password="+password;
  }
}

获取Bean的配置信息

在applicationContext-User.xml文件添加User1类的配置信息。

<bean id="user1" class="com.itheima.User1">
        <constructor-arg name="id" value="1">
        </constructor-arg>
        <constructor-arg name="name" value="张三">
        </constructor-arg>
        <constructor-arg name="password" 	value="123"></constructor-arg>
</bean>

setter方法注入

新建User2类

public class User2 {
    private int id;	private String name;	
    private String password;
    // 省略getter/setter方法
    public String toString(){
  return "id="+id+",name="+name+",password="+password;
    }
}

获取Bean的配置信息

<bean id="user2" class="com.itheima.User2">
    <property name="id" value="2"></property>
    <property name="name" value="李四"></property>
    <property name="password" value="456"></property>
</bean>

测试类

public class TestUser2 {
    public static void main(String[] args)throws Exception {
        //加载applicationContext.xml配置
        ApplicationContext applicationContext = new 
        ClassPathXmlApplicationContext("applicationContext-User2.xml");
        //获取配置中的User2实例
        User2 user2 = applicationContext.getBean("user2", User2.class);
        System.out.println(user2);
}}

依赖注入的应用

下面以属性setter方法注入为例,实现一个简单的登录验证。具体实现步骤如下所示。

(1)编写DAO层

public interface UserDao {
           public boolean login(String name,String password);
}
public class UserDaoImpl implements UserDao {
           ........
 }

(2)编写Service层 

public interface UserService {
    public boolean login(String name,String password);
}
public class UserServiceImpl implements UserService {
    UserDao userDao;
    public void setUserDao(UserDaouserDao)
        { this.userDao=userDao; }
    @Override
    public boolean login(String name, String password) {
        return userDao.login(name,password);
    }
}

(3)编写applicationContext.xml配置文件 

<bean id="userDao"class="....UserDaoImpl"></bean>

<bean id="userService”class="...UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>

(4)编写测试类 

public class TestSpring {
    public static void main(String[] args) {
         ApplicationContext applicationContext=new 
        ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService=(UserService) applicationContext.getBean("userService");
        boolean flag =userService.login("张三","123");
        if (flag) { System.out.println("登录成功");
        } else { System.out.println(“登录失败"); }
}}

=========================================================================

实验:lab13

需要的依赖:

这个依赖包含四个基础依赖(直接添加这即可)    
    <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

<!--        &lt;!&ndash;Spring的基础包Spring-core&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-core</artifactId>-->
<!--            <version>5.2.8.RELEASE</version>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;Spring的基础包Spring-beans&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-beans</artifactId>-->
<!--            <version>5.2.8.RELEASE</version>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;Spring的基础包Spring-context&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-context</artifactId>-->
<!--            <version>5.2.8.RELEASE</version>-->
<!--        </dependency>-->
<!--        &lt;!&ndash;Spring的基础包Spring-expressinon&ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.springframework</groupId>-->
<!--            <artifactId>spring-expression</artifactId>-->
<!--            <version>5.2.8.RELEASE</version>-->
<!--        </dependency>-->

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>

        <!--Spring的依赖包commons-logging-->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

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

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

相关文章

虚拟机类加载机制

目录 1、概述 2、类加载的过程 1、过程总览 2、加载 3、链接-验证 4、链接-准备 5、链接-解析 6、初始化 7、总结 3、类加载的时机 4、类加载器 1、概述 2、类与类加载器 3、三层类加载器 4、双亲委派模型 5、其他加载策略 1、概述 一个Java类会被编译成一个Cl…

grep,sed,awk实战

grep -E ^(root|sshd)\> /etc/passwd 找出以root或者sshd开头的&#xff0c;且只含root或者sshd,>表示匹配到root或者sshd就结束了&#xff0c;类似情况如下图&#xff1a; grep -c ^yu /etc/passwd 匹配含yu这个用户出现的次数 grep -m 2 ^yu /etc/passwd …

arthas使用

文章目录 ArthasArthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f;安装1.linux中使用2.docker中使用 命令列表jvm 相关class/classloader 相关monitor/watch/traceprofiler/火焰图 Arthas Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 …

windows nvm 安装过程

1. 官网 Releases coreybutler/nvm-windows GitHubA node.js version management utility for Windows. Ironically written in Go. - Releases coreybutler/nvm-windowshttps://github.com/coreybutler/nvm-windows/releases 下载 nvm-setup.exe; 2. 安装完成后后&#x…

Golang Channel 实现原理与源码分析

Do not communicate by sharing memory; instead, share memory by communicating. 通过通信来共享内存&#xff0c;而不是共享内存来通信 安全访问共享变量是并发编程的一个难点&#xff0c;在 Golang 语言中&#xff0c;倡导通过通信共享内存&#xff0c;实际上就是使用 chan…

23种设计模式之访问者模式(Visitor Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的访问者模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

chatgpt没有免费版的吗?如何使用ChatGPT?

ChatGPT是基于GPT模型的聊天机器人&#xff0c;目前没有免费版。ChatGPT是由OpenAI开发的&#xff0c;OpenAI的GPT模型需要大量的计算资源和技术支持&#xff0c;因此需要付费才能使用。 目前&#xff0c;OpenAI提供了两种方式来使用GPT模型&#xff1a; 1. OpenAI API OpenA…

制造型企业降本增效的最佳工具,质量管理系统,该如何利用好

许多制造业企业质量管理主要用于解决制造业质检效率低下、作业不规范等难题&#xff0c;形成质量检验、质量方案、档案数据、统计分析一体化的质量管理体系&#xff0c;有效为企业质量管理提速降本增效&#xff0c;实现企业数字化转型。在没有正确利用质量管理系统之前&#xf…

45个 Cha​tGPT 常用插件说明

45个 ChatGPT 常用插件说明 ChatGPT常用的45个插件&#xff0c;以及它们用途说明&#xff1a; 1/ Slack&#xff1a;查询Slack信息 2/ Zapier&#xff1a;与5000应用&#xff0c;如Google Sheets和Docs进行交互。 3/ Expedia&#xff1a;在一个地方激活你的旅行计划 4/ Kla…

Worldclim(v1.4、v2.1)数据集使用介绍

最近在使用Worldclim的数据&#xff0c;在这里记录一下该数据集的使用。 如果你想得到过去、现在和未来的气候数据&#xff0c;那么你可以使用这个数据集&#xff1a;Worldclim数据集 该数据集包含了4种时期的气候数据&#xff1a;历史时期的末次盛冰期、全新世中期、当前时…

操作系统(3.3)--线程的实现方式

进程调度的任务、机制和方式 1.进程的调度任务 进程调度的任务主要有三&#xff1a; (1)保存处理机的现场信息。在进程调度进行调度时&#xff0c;首先需要保存当前进程的处理机的现场信息&#xff0c;如程序计数器、多个通用寄存器中的内容等 (2)按某种算法选取进程。调度…

脉冲神经网络深度残差学习(ResNet)

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;Deep Residual Learning in Spiking Neural Networks 论文链接: https://arxiv.org/pdf/2102.04159v3.pdf 代码链接&#xff1a;https: //github.com/fangwei123456/Spike-Element-Wi…

MYSQL数据库基础(数据库)

文章目录 一、数据库使用流程二、数据库的操作三、常用数据类型3.1 数值类型3.2 字符串类型3.3 日期类型 四、数据表操作 一、数据库使用流程 用户在客户端输入SQL语句客户端会把SQL通过网络发送给服务器服务器会执行这个SQL&#xff0c;把结果返回给客户端客户端接收到结果后…

第十九篇、基于Arduino uno,获取光电开关(NPN/PNP型)的信号——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;如果有遮挡会输出低电平或者高电平&#xff0c;没有遮挡会输出高电平或者低电平&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;这里要区分到底是NPN型号的&#xff0…

分享几个索引创建的小 Tips

文章目录 1. 冗余索引1.1 联合索引左边列1.2 索引中加入主键 2. 隐藏的索引排序3. 删除不使用的索引4. 手动更新索引统计信息5. 适时优化表 关于 MySQL 中的索引&#xff0c;松哥前面已经和小伙伴们聊了不少了&#xff0c;不过在索引使用的时候&#xff0c;还是有一些需要注意的…

如何发布一个npm包

1、注册账号 https://www.npmjs.com/ 使用邮箱注册即可 a. 邮箱会在本地登录时发送验证码使用 b. 发布包后邮箱会收到通知 2、生成AccessToken &#xff08;1&#xff09;直接本地登录 # 根据提示输入用户名、密码、注册邮箱 npm login# 输入完邮箱会发送验证码&#xff0c…

如何做一个有质量的技术分享

分享信息并不难,大多数人都能做到,就算是不善言谈性格内向的技术人员,通过博客或社交媒体,或是不正式的交流,他们都能或多或少的做到。但是如果你想要做一个有质量有高度的分享,这个就难了。 所谓的有质量和有高度,我心里面的定义有两点: 分享内容的保鲜期是很长的会被…

win11本地安装k8s

1、确保本地已经安装DesktopDocker&#xff1b; 2、使用choco下载安装Kind&#xff0c;正常下载安装报错提示&#xff0c;建议使用管理员权限 使用管理员权限下载安装Kind 也可以从github下载kind到本地进行安装&#xff0c;下载地址 Releases kubernetes-sigs/kind GitHub …

分布式锁Redis基础理论与落地实现与Redisson。

分布式锁Redis基础理论与落地实现 基本概念基于Redis的分布式锁基本用法基于Redis实现分布式锁初级版本改进Redis的分布式锁问题Redis的Lua脚本利用Lua脚本写释放锁业务流程再次改进Redis的分布式锁 总结 Redisson基于setnx实现的分布式锁存在下面的问题Redisson入门Redisson可…

64位系统究竟牛逼在哪里?

想必大家都遇到过这样的问题&#xff1a;安装某个软件的时候&#xff0c;出现提示选择32位版本还是64位版本&#xff1f;我们也可以查看自己的电脑是32位还是64位系统。 Windows Linux 大家可能知道32位和64位和系统有关&#xff0c; 但其实 32 vs 64 可以有多重含义。 一般情…