【Spring】更加简单的将对象存入Spring中并使用

news2024/11/27 12:57:48

前言

本期讲解:通过@Controller@Service@Repository@Component、@Configurtion类注解、@Bean方法注解,来更加简单的在Spring中存与读对象。


目录

1. 类注解

1.1 通过标签

1.2 使用类注解

1.3 什么是类注解

1.4 获取Bean对象命名问题

2. 方法注解

2.1 使用@Bean方法注解

2.2 @Bean方法注解搭配类注解

2.3 重命名@Bean方法注解

2.4 无法使用默认方式


1. 类注解

首先,我们创建一个 Spring 项目,创建 Spring 项目和配置文件所需要的代码在上篇博客中以及讲到了。


1.1 通过<bean>标签

在之前的学习中,我们存储 Bean 对象时,用到的是 <bean></bean> 标签。我们需要将 Bean 对象的 id 以及类所在的位置所标注到 <bean> 标签里面。如下所示:

创建一个 Bean 对象 Student 类:

package com.study.spring;

public class Student {
    public void hello() {
        System.out.println("Hello Student!");
    }
}

将创建好的 Bean 对象通过 <bean></bean> 标签存入 Spring 中:

创建一个启动类 App 并运行:

public class App {
    public static void main(String[] args) {
        // 1.获取 Spring 的上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.加载到 id 为 student 的 Bean 中
        Student student = (Student) context.getBean("student");
        // 3.运行 Student 类中 hello 方法
        student.hello();
    }
}

运行结果

我们可以发现这种方式是比较传统且基础的,但我们可以通过类注解来进行存储,通过类注解的存储方式只需要标注类所在的地址,就能将 Bean 对象存入 Spring 中。具体请看下面讲解。


1.2 使用类注解

上面我们提到了通过 <bean></bean> 标签来存储并使用 Bean 对象,更加简单的存与用可以有:

  • 通过类注解:@Controller、@Service、@Repository、@Component、@Configurtion
  • 通过方法注解:@Bean

1.3 什么是类注解

  1. @Configuration‌:声明当前类是一个配置类,相当于一个Spring配置的XML文件。这个注解用于替代XML配置文件,简化配置‌。

  2. @Component‌:这是一个泛化的注解,可以用于任何Spring管理的组件。它告诉Spring这个类是一个Spring管理的bean‌。

  3. @Controller‌:用于标注控制器层组件,通常用于处理HTTP请求。它是@Component的衍生注解,功能相同‌。

  4. @Service‌:用于标注服务层组件,通常处理业务逻辑。它也是@Component的衍生注解‌。

  5. @Repository‌:用于标注数据访问层组件,通常用于数据库操作。同样是@Component的衍生注解‌。

通过类注解,我们需要将 Spring 的配置文件加入 <content></content> 标签,并将 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"
       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="com.study.spring"></content:component-scan>
</beans>

 创建一个 Teacher 类:

@Controller
public class Teacher {
    public void hello() {
        System.out.println("Hello Teacher!");
    }
}

在创建该类时,我们可以发现,在代码的上头使用了 @Controller 注解。因此在获取该对象时可使用类名小写来获取。

使用 App 启动类:

public class App {
    public static void main(String[] args) {
        // 1. 获取Spring容器
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 得到Bean对象
        Teacher teacher = context.getBean("teacher",Teacher.class);
        // 3. 使用Bean对象的内容
        teacher.hello();
    }
}

运行结果:

由于上面的几个类注解都是 @Component 的衍生注解‌,因此这几个类注解使用上述功能达到的结果是一致的,因此不再重复操作。


1.4 获取Bean对象命名问题

在上述代码中,我们使用类名 Teacher 的小写 teacher 即能获取该对象。但有特例,当类名为 TEacher 时,则只能原类名 TEacher 来获取该对象。

因此衍生一个问题,为什么不直接使用类名?当我们打开生成 Bean 对象的获取名源代码,发现该功能是来自于 jdk ,如下图所示:

我们来阅读该内容,如果 name 长度大于1,判断第一、二个字母是否大写,大写就返回原类名。

否则从第一个字母开始转为小写,并返回。由此可见,Bean 对象的获取名是由此所制订的。


2. 方法注解

方法注解,即为在对象中的方法上加入 @Bean 注解,也能达到存入 Spring 的效果。


2.1 使用@Bean方法注解

创建一个实体类 Dog,里面的参数有 idnamecontent,并设置 getter and setter 方法和重写 toString 方法:

public class Dog {
    private int id;
    private String name;
    private String content;

    @Override
    public String toString() {
        return "Dog{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

创建一个 Dogs 类用来设置 Dog 类里面的参数,并在 dog 方法上加入 @Bean 方法注解(由于我们要使用 dog 方法):

public class Dogs {
    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        dog.setId(1);
        dog.setName("小白");
        dog.setContent("汪汪汪!");
        return dog;
    }
}

在启动类 App 使用:

public class App {
    public static void main(String[] args) {
        // 1. 获取Spring容器
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 得到Bean对象
        Dog dog = context.getBean("dog", Dog.class);
        // 3. 使用Bean对象的内容
        System.out.println(dog.toString());
    }
}

运行结果:

我们会发现,报错了。因为 @Bean 方法注解需要搭配,@Controller@Service@Repository@Component@Configurtion 中的其中任意一个类注解来使用。


2.2 @Bean方法注解搭配类注解

我们在 Dogs 类上加上一个 @Component 类注解,再运行程序:

@Component
public class Dogs {
    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        dog.setId(1);
        dog.setName("小白");
        dog.setContent("汪汪汪!");
        return dog;
    }
}

运行结果: 

注意,我们通过 @Bean 方法注解时,在获取 Bean 对象时应与被注解的方法名保持一致,如下图所示:


另外,由于上面 Dogs 类中使用了 @Component 类注解,由此 Dosg 类里面的未使用 @Bean 方法注解的类也注入到了 Spring 当中。

我们在 Dogs 类中创建一个 hello 方法,并使用 App 类启动。Dogs 类中添加 hello 方法:

@Component
public class Dogs {
    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        dog.setId(1);
        dog.setName("小白");
        dog.setContent("汪汪汪!");
        return dog;
    }

    public void hello() {
        System.out.println("Hello Dogs");
    }
}

App 类启动:

public class App {
    public static void main(String[] args) {
        // 1. 获取Spring容器
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
       /* // 2. 得到Bean对象
        Dog dog = context.getBean("dog", Dog.class);
        // 3. 使用Bean对象的内容
        System.out.println(dog.toString());*/

        Dogs dogs = context.getBean("dogs",Dogs.class);
        dogs.hello();
    }
}

运行结果:


2.3 重命名@Bean方法注解

通过上述的学习,我们知道了使用 @Bean 方法注解时,获取该方法使用的是被注解的方法的方法名,听起来有点拗口但并不难理解,也就是说直接使用 @Bean 方法注解时,默认获取方式为被注解的方法名

更好的方式为使用 @Bean 注解里面 name value 值,有四种重命名方式:

  • @Bean("use1")
  • @Bean(name="use1)
  • @Bean(value="use1")
  • @Bean(name={"use1","use2",...})

假设重命名名称为 use1,使用 @Bean("use1"),并通过 use1 获取该对象。

使用 @Bean(name={"use1"}),可通过 use1 获取该对象。

使用 @Bean(value = {"use1"}),可通过 use1 获取该对象。

使用 @Bean(name={"use1","use2"}),可通过 use1 或 use2 来获取对象。


2.4 无法使用默认方式

当我们重命名后,再次使用默认的获取方式(被 @Bean 注解的方法名)时,程序报错了。因此得出被重命名后无法再使用默认方式了,只能使用重命名后的名称。


本期博客到这就结束了,感谢各位的阅读!

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者


🤼文章收录于:Spring

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

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

相关文章

Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)

文章目录 想要读这个表格&#xff0c;并且求第二列所有价格的和方法一&#xff1a;通过添加文件输入元素上传csv完整&#xff08;正确&#xff09;代码之前的错误部分因为价格是小数&#xff0c;所以下面的代码出错。如果把parseFloat改成parseInt&#xff0c;那么求和没有意义…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

人保财险(外包)面试分享

前言&#xff1a; 这是本月面的第三家公司&#xff0c;太难了兄弟们&#xff0c;外包都不好找了&#xff0c;临近年底&#xff0c;金九银十已经错过了&#xff0c;金三银四虽然存在&#xff0c;但按照这几年的行情&#xff0c;金九银十和金三银四其实已经是不复存在了&#xf…

【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

美国大选——极具典型的可视化案例!GISer学起来

有人说可视化技术有啥意义&#xff0c;不就做个大屏么&#xff1f; 那真的小看了&#xff0c;就如下图这个美国大选来看&#xff0c;这么复杂混乱的信息&#xff0c;可视化技术给你梳理的明明白白的&#xff0c;简单、直观、形象、便于记忆。 让用户能够从繁杂信息中快速抓到重…

使用PyQt5设计一个简易计算器

目录 设计UI图 代码 结果展示 设计UI图 代码 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox from untitled import Ui_MainWindow import sysclass…

数据结构-数组(稀疏矩阵转置)和广义表

目录 1、数组定义 1&#xff09;数组存储地址计算示例①行优先②列优先 2&#xff09;稀疏矩阵的转置三元组顺序表结构定义 ①普通矩阵转置②三元组顺序表转置稀疏矩阵③稀疏矩阵的快速转置 3&#xff09;十字链表结构定义 2、广义表定义 1&#xff09;基本操作①GetHead②GetT…

cooladmin使用整理

1、后端关键字自动生成没有代码段提示&#xff0c;原因是拉取的项目代码中没有.vscode文件夹&#xff0c;复制一套至项目src同级即可 2、前端快速创建&#xff0c;在Entity完成后就去快速创建中选数据结构&#xff0c;这时没有对应的内容&#xff0c;数据结构是和controller层a…

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个&#xff1a;客户端和服务器。客户端是提供请求的&#xff0c;归用户使用&#xff0c;发送的请求会被服务器接收&#xff0c;服务器根据请求做出响应&#xff0c;然后再将响应的数据包返回给客户端。 作为程序员&#xff0c;我们主要关心应…

Jmeter命令监控CPU等指标

JMeter 命令行执行脚本得到的报告中&#xff0c;是没有CPU、内存使用率等监控数据的&#xff0c;但是可以使用JMeter插件帮忙。 一、下载jmeter-plugins-manager.jar 下载后将文件放到jmeter安装包lib/ext目录下。打开Jmeter》菜单栏》选项》Plugins Manager 二、安装PerfMon…

ES + SkyWalking + Spring Boot:日志分析与服务监控(三)

目录 一、搭建SkyWalking 1.1 版本选择 1.2 下载安装 1.3 配置启动 1.4 SkyWalking UI介绍 二、Springboot项目使用 2.1 Agent下载 2.2 Agent配置skywalking oap地址 2.3 IDEA配置Agent地址 2.4 生成的ES索引介绍 三、在kibana上查看日志 四、问题和解决 3.1 日志…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK&#xff1a;确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven&#xff1a;下载并安装Maven构建工具&#xff0c;这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器&#xff1a;这里推荐使用Inte…

spring-第十三章 AOP

spring 文章目录 spring前言1.AOP介绍2.AOP七大术语3.切点表达式4.使用spring的AOP4.1概述4.2准备工作4.3基于注解方式使用AOP4.3.1准备目标类和目标方法4.3.2编写配置类4.3.3编写通知类4.3.4编写测试类4.3.5通知类型4.3.6切面的先后顺序4.3.7PointCut注解通用切点 4.4基于XML方…

jmeter常用配置元件介绍总结之安装插件

系列文章目录 1.windows、linux安装jmeter及设置中文显示 2.jmeter常用配置元件介绍总结之安装插件 3.jmeter常用配置元件介绍总结之取样器 jmeter常用配置元件介绍总结之安装插件 1.下载插件2.安装插件管理包3.不用插件管理包&#xff0c;直接官网插件下载安装 1.下载插件 jm…

MySQL 多数据库备份与恢复,包括查询,函数,SP

一、备份语句&#xff1a; mysqldump 可以用来导出单个数据库、多个数据库&#xff0c;甚至所有数据库的数据。以下是导出多个数据库到指定文件位置的语法和具体案例。 基本语法 mysqldump -u [username] -p[password] --databases [db1] [db2] ... > [file_path] -u: …

contenteditable实现需要一个像文本域一样的可编辑框

我这里是因为左上和右下有一个固定的模板&#xff0c;所有用textarea有点不方便&#xff0c;查了下还有一个方法可以解决就是在需要编辑的元素上加上 :contenteditable"true" 完整代码如下&#xff0c;因为这个弹窗是两用的&#xff0c;所以用messageType做了一下判…

linux 安装anaconda3

1.下载 使用repo镜像网址下载对应安装包 右击获取下载地址&#xff0c;使用终端下载 wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh2.安装 使用以下命令可直接指定位置 bash Anaconda3-2024.02-1-Linux-x86_64.sh -b -p /home/anaconda3也…

如何选择适合的AWS EC2实例类型

在云计算的世界中&#xff0c;Amazon Web Services&#xff08;AWS&#xff09;提供了丰富的服务&#xff0c;其中Elastic Compute Cloud&#xff08;EC2&#xff09;是最受欢迎的服务之一。选择合适的EC2实例类型对于确保应用程序的性能和成本效益至关重要。我们九河云通过本文…

(蓝桥杯C/C++)——基础算法(下)

目录 一、时空复杂度 1.时间复杂度 2.空间复杂度 3.分析技巧 4.代码示例 二、递归 1.递归的介绍 2.递归如何实现 3.递归和循环的比较 4.代码示例 三、差分 1.差分的原理和特点 2.差分的实现 3.例题讲解 四、枚举 1.枚举算法介绍 2.解空间的类型 3. 循环枚举解…

7.5 inch电力线载波通信技术

7.5寸电子桌牌 产品型号 PE75R_D_W 尺寸 176.2*137.15*80mm 屏幕尺寸 7.5 inch 显示区域(mm) 163.2(H) * 97.92(V) 分辨率 800*480 显示技术 电子墨水屏双面显示 显示颜色 黑/白/红 外观颜色 银色 工作温度 0-40℃ 视角 180 支持内容格式 文本/图片/二维码…