Spring入门教程

news2024/12/26 21:40:14

目录

一、Spring最基本的使用

   

 1.创建Maven项目(不需要模板)   

 2.添加Spring框架支持

 3.添加启动类(没啥可说的符合规范即可)

 4.创建bean对象

 5.将bean对象注册到Spring中

(a)先在resources文件夹中创建一个xml文件(注意:是test文件用了.xml后缀 不是直接创建一个xml文件)

(b)然后在文件中复制配置代码

 (c)然后就可以进行正式的注册bean了

6.取出(使用)bean对象

(a)获取上下文对象

(b)取出bean对象

(c)使用(运行结果)

getbean()的三种用法

1.根据id获取bean(一个String参数)

2.根据class获取bean(一个class参数)

3.根据id和class获取bean(一个String参数和一个class参数)

ApplicationContext和BeanFactory的共同点和不同点

共同点:

不同点:

二、快速存储bean对象

1.创建Maven项目

2.添加Spring框架支持

3.添加启动类

4.创建bean对象

5.复制配置代码

6.添加注解

7.取出bean对象

五大注解

@Bean注解

@Bean的改名功能

三、Bean读取(对象装配\对象注入)

1.属性注入

2.Setter注入

3.构造注入

@Resource注解

Bean的六种作用域:

Spring的主要执行流程

Bean的生命周期



一、Spring最基本的使用

   

 1.创建Maven项目(不需要模板)

         注意路径要全英文,路径带中文可能会导致不可预知的错误

   

 2.添加Spring框架支持

         在pom.xml文件中添加依赖

 

 可直接复制以下代码

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

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

注意复制依赖后 不要忘记手动导入

IDEA中直接点击这个

 3.添加启动类(没啥可说的符合规范即可)

 4.创建bean对象

  就是创建一个普通的类

5.将bean对象注册到Spring中

(a)先在resources文件夹中创建一个xml文件(注意:是test文件用了.xml后缀 不是直接创建一个xml文件)

 

 (酱紫操作)

(b)然后在文件中复制配置代码

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


</beans>

 (c)然后就可以进行正式的注册bean了

 每注册一个bean 就在这加一行标签

id是自定义的名称 class是要注册的bean类名

6.取出(使用)bean对象

 在主类中取出对象

(a)获取上下文对象

ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");

这个参数就是我们上一步中自己创建的xml文件名

(b)取出bean对象

Test test = (Test)context.getBean("bro");

这个参数是我们自己规定的id

这个类名就是步骤4中自己写的类名

(c)使用(运行结果)

 可以看出已经成功了

getbean()的三种用法

1.根据id获取bean(一个String参数)

Test test = (Test)context.getBean("bro");

2.根据class获取bean(一个class参数)

Test test = context.getBean(Test.class);

已经知道它的类型了就不用强转类型了

注意如果同一个类(bean)被注册多次的话会报错

3.根据id和class获取bean(一个String参数和一个class参数)

 Test test = context.getBean("bro",Test.class);

ApplicationContext和BeanFactory的共同点和不同点

共同点:

都用来获取Spring上下文对象

不同点:


1.继承关系和功能: ApplicationContext属于BeanFactory 子类,ApplicationContext具备了BeanFactory 所有的功能和能力。BeanFactory只具备最基础访问Bean 的能力。ApplicationContext 具备更多能力,比如国际化支持、资源访问支持等...
2.性能和加载方式: BeanFactory 按需加载,当需要使用Bean 的时候再加载; ApplicationContext一次性加载所有的Bean。
 

二、快速存储bean对象

1.创建Maven项目

2.添加Spring框架支持

3.添加启动类

4.创建bean对象

前四步和上面一样

5.复制配置代码

还是在resources中创建一个.xml文件(强调!和上次相同 是test格式文件 只是命名用.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:content="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">

      <content:component-scan base-package="Beans"></content:component-scan>

</beans>

这个红色框出的是自定义参数:在哪个范围内搜索bean对象

我在java目录下创建了一个Beans包专门保存bean对象  所以这个参数填Beans

6.添加注解

在要注册的bean类上面加注解(有五种类注解 下面会详细介绍)

7.取出bean对象

我们这次没有在.xml文件里面指定id 那么我们怎么找到这个bean呢?

 bean对象默认id为将类名首字母小写

如Test -> test

特殊情况:当类名首字母和第二个字母均为大写时 自动命名为原类名

TEst -> TEst

启动类上是要引用对应类的 

五大注解


@Controller [控制器]验证前端传递的参数的(安全检查)
@Service [服务层] 服务调用的编排和汇总
@Repository [仓库(数据仓库....) ](直接操作数据库)
@Component [组件] 通用化的工具类
@Configuration [配置]项目的所有配置

这五大注解的用法都是一样的,功能上没有本质差异,使用不同的注解只是代码规范,增加可读性而已

@Controller、@Service、@Repository、@Configuration都是基于@Component实现的

@Bean注解

@Bean注解是方法注解要和五大注解搭配使用 且适用于有返回对象的方法

首先我们先创建一个想要使用的类

public class Test {
    public void hello(){
        System.out.println("hello");
    }
}

然后在用另一个类去实现Bean注解把它存在Spring中

package Beans;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;


@Controller
public class BeanTest {
    @Bean
    public Test test(){
        return new Test();
    }
}

然后在运行类里面调用

@Bean的改名功能

 那么我们绕这么多弯弯 实现了原来的功能 这有什么意义呢?

那么久引出了@Bean注解的特殊功能! 改名!

还是原来的程序,在@Bean后面加了参数

 运行时就会报错

把运行类的getBean参数改成 @Bean的参数

 运行成功!

@Bean的参数有三种写法

@Bean(name = "test1")

@Bean("test1")               (相较于上一种省略了name=)

@Bean(name = {"test1","test2"})    (一个Bean起多个名字)

三、Bean读取(对象装配\对象注入)

把Bean存入Spring之后的使用,要比获取上下文对象再getbean简单

1.属性注入

在一个类中 把bean作为类对象注入

@Controller
public class Demon1 {
    @Autowired
    private Test test;

    public void mysout(){
        test.hello();
    }
}

创建了一个Demon类 在里面属性注入test

 启动类中调用Demon1   运行成功

(如果你是在其他包中创建的另一个类 记得在.xml中包含新的包)

属性注入优点:简单!

缺点: 1.不能注入final修饰的属性

2.只适用于IoC容器

3.因为简单,滥用风险大(容易违背单一设计原则)

2.Setter注入

 (直接右键生成一个Setter方法 在上面加@Autowired)

优点:符合单一设计原则(一个Setter只针对一个对象)

缺点:

1.不能注入一个不可变对象(final)

2.注入对象可能被改变

3.构造注入

 右键生成大法万岁!

构造方法是官方推荐的注入方法!

优点:

1.可以注入final修饰的(final自身决定的 可以在两种情况下赋初值1.创建时 2.构造方法  也就解释了为什么前两种不可以)

2.注入对象不会被修改(构造方法只调用一次)

3.依赖对象在被使用前一定会被初始化

4.通用性好,因为构造方法是JDK自带的

没有缺点!如果注入太多参数是程序员的问题(?)

@Resource注解

@Resource注解可以实现属性注入和Setter注入,不能实现构造注入(使用方法)

@Autowired注解是Spring提供的,@Resource是来自JDK下的注解,所以@Resource的通用性更好  @Resource有更多的参数设置

Bean的六种作用域:

作用域就是生命周期,默认情况下 作用域是singleton(单例模式)

1.singleton(单例模式) 只有一个全局对象

单例模式会出现一种问题,就是有一个类,这个类本身的内容是A,这时候甲同学根据自己的需求把它修改成了B,然后乙同学再去使用这个类 它的内容就改变了

2.prototype(原型模式) 每次访问都会创建一个对象

3.request(请求作用域)(只能在Spring MVC中使用)  每次Http请求都会创建一个对象

4.session(会话作用域)(只能在Spring MVC中使用)  每次会话都会创建一个对象(即使是同一个用户)

5.application(全局作用域)(只能在Spring MVC中使用)一个http servlet context中共享一个对象

6.websocket:Http WebSocket作用域(只能在WebSocket中使用)

Bean的作用域设置

一、枚举

 枚举方式好一点 因为有自动补全机制

二、参数

 

Spring的主要执行流程

1.启动容器(启动类运行、加载配置容器)

2.Bean初始化(对配置文件中的Bean进行扫描 只扫描带有注解的)

3.将Bean对象注入到容器中

4.使用Bean

5.Spring销毁

Bean的生命周期

1.实例化(分配内存空间 不是初始化)

2.设置属性(依赖注入)

3.初始化

    执行各种通知(方法)(各种 Aware 方法,如 BeanNameAware、BeanFactoryAware、     ApplicationContextAware 的接口方法)

    执行前置方法(BeanPostProcessor )

     初始化方法(@PostConstruct和init-method )

    初始化后置方法(BeanPostProcessor)

4.使用Bean

5.销毁Bean(执行destroy-method|@PreDestroy)

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

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

相关文章

[ChatGPT] 从 GPT-3.5 到 GPT-5 的进化之路 | ChatGPT和程序员 : 协作 or 取代

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一键三连&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601;…

FastDFS总结

目录 概述 什么是分布式文件系统 核心概念 目录结构 上传机制 下载机制 Linux中搭建FastDFS 常用指令 SpringBoot整合FastDFS FastDFS集成Nginx 概述 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件&#xff…

Android输入法不使用多客户端多屏适配-Android12

Android输入法不使用多客户端多屏适配-Android12 1、IME屏幕之间切换2、属性配置3、屏幕之间切换 IME 窗口 在非默认屏幕上运行的应用 1、IME屏幕之间切换 系统使用一个 IME&#xff0c;但可以在屏幕之间切换&#xff0c;以跟踪用户焦点。Android 10 默认所有第一方和第三方 IM…

【Android】试着写一个资讯界面(含不同板块)

跟着视频做的&#xff0c;并不能动脑子&#xff0c;于是自己顺一遍流程&#xff01;&#xff08;只阅读了部分教程&#xff0c;代码不完全相同&#xff09;&#xff08;仅为静态界面不含跳转&#xff09;&#xff08;在fragment上&#xff09;此为视频链接 成果图&#xff1a; …

07-HTML-链接标签

<a> 标签定义超链接&#xff0c;用于从一张页面链接到另一张页面。<a> 元素最重要的属性是 href 属性&#xff0c;它指示链接的目标。 属性值描述downloadfilename规定被下载的超链接目标。hrefURL规定链接指向的页面的 URL。pinglist_of_URLs规定以空格分隔的 UR…

YOLOv8 人体姿态估计(关键点检测) python推理 ONNX RUNTIME C++部署

目录 1、下载权重 ​2、python 推理 3、转ONNX格式 4、ONNX RUNTIME C 部署 1、下载权重 我这里之前在做实例分割的时候&#xff0c;项目已经下载到本地&#xff0c;环境也安装好了&#xff0c;只需要下载pose的权重就可以 2、python 推理 yolo taskpose modepredict model…

ESP32设备驱动-PCA9685 LED控制器驱动

PCA9685 LED控制器驱动 文章目录 PCA9685 LED控制器驱动1、PCA9685介绍2、硬件准备3、软件准备4、驱动实现1、PCA9685介绍 PCA9685 是一款 IC 总线控制的 16 通道 LED 控制器,针对红色/绿色/蓝色/琥珀色 (RGBA) 彩色背光应用进行了优化。 每个 LED 输出都有自己的 12 位分辨率…

scala中match使用报错Scala.matchError:(of class java.lang.String)

1.遇到错误 Scala.matchError:(of class java.lang.String) 2.发现问题出在match使用中,如下写法就会报错 val partitionIndex key.toString match {case "chinese" > 0case "math" > 1case "english" > 2} 3.后来修改了写法&#xf…

【大数据学习篇3】HDFS命令操作与MR单词统计

1. HDFS命令使用 [rootmaster bin]# su hd[hdmaster bin]$ #查看/目录[hdmaster bin]$ hdfs dfs -ls / 5 #在/目录创建一个为test名字的文件夹[hdmaster bin]$ hdfs dfs -mkdir /test#查看/目录[hdmaster bin]$ hdfs dfs -ls Found 1 itemsdrwxr-xr-x - hd supergroup …

【rust】| 04——语法基础 | 函数

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础_变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 函数1. 定义函数…

Lecture 15:元学习Meta Learning

目录 Review Machine Learning Introduction of Meta Learning What is Meta Learning? Meta Learning的三个步骤 Meta Learning的framework&#xff1a; ML v.s. Meta Meta Learning的training What is learnable in a learning algorithm? 初始化参数θ0 Optimiz…

用 Phthon 写抽奖程序

一共 10 人参与抽奖&#xff0c;四人中奖&#xff0c;其中一人固定不变。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a…

windows 打包 inno setup

1.下载并安装 inno setup 官网下载地址 点击下载并安装inno setup 软件,安装完成后点打开软件 在上图中点击 cancel 回到inno setup 的主界面 ①在主界面点击File -> New 然后在向导界面点击 next 填写安装信息点击next 如下图 点击next e 选择exe的位置, add folder …

实战打靶集锦-019-BTRSys2.1

提示&#xff1a;本文记录了博主的一次普通的打靶经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 FTP服务探查4.2 Apache服务探查4.2.1 wpscan扫描4.2.2 Metasploit神器4.2.3 手工探查页面4.2.3.1 Appearance Editor4.2.3.2 Plugins Editor 5. 提权5.1 系统信息枚…

KVM存储池管理与磁盘格式

KVM存储池管理与磁盘格式 KVM必须配置一个目录作为存储磁盘镜像&#xff08;存储卷&#xff09;的目录&#xff0c;我们称这个目录为存储池 存储池管理 默认存储池 /var/lib/libvirt/images/ 创建基于文件夹的存储池&#xff08;目录&#xff09; mkdir -p /data/vmfs定义…

详解MySQL覆盖索引、索引下推

目录 1.覆盖索引 1.1.概述 1.2.聚集索引、非聚集索引 1.3.回表查询 1.4.覆盖索引 2.索引下推 1.覆盖索引 1.1.概述 覆盖索引&#xff0c;是为了避免“回表查询”&#xff0c;从而降低查询耗时的一种使用索引的方法&#xff0c;所以要聊覆盖索引首先我们要知道什么是&qu…

HTB-Busqueda

HTB-Busqueda 信息收集80端口 svcsvc -> root 信息收集 80端口 将ip和searcher.htb添加至/etc/hosts文件。 功能能就是你输入一个值&#xff0c;选择好搜索引擎后点击search&#xff0c;就会生成一个选择的搜索引擎里搜索你输入的值的链接。比如输入aster。 如果勾选了自动…

Github配置SSH密钥连接(附相关问题解决)

Github配置SSH密钥连接&#xff08;附相关问题解决&#xff09; 引言 当前&#xff0c;通过Git在本地仓库和远程仓库&#xff08;如Github&#xff09;之间进行操作&#xff0c;已不再支持密码验证&#xff0c;而是转为通过更安全的SSH密钥验证方式。 因此&#xff0c;本文将…

正态分布线性计算的方差推导(含协方差推导)

推导如下&#xff1a; 由于方差是每个数据与均值离差平方和的均值&#xff1a;即对Σ&#xff08;每个数据-均值&#xff09;再求一次均值&#x1f447;&#xfeff;&#xfeff; 最终Var(X) E(X&#xff09;-E&#xff08;X) 因此&#x1f447; Var(X-Y) E(X-Y)-E(X-Y) …

mysql的主从复制和读写分离

1.mysql主从复制和读写分离的相关知识 1.1 什么是读写分离? 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 …