【Spring学习之更简单的读取和存储Bean对象】教会你使用五大类注解和方法注解去存储 Bean 对象

news/2024/7/5 3:20:34

前言:
💞💞今天我们依然是学习Spring,这里我们会更加了解Spring的知识,知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。
💟💟前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员

个人主页⭐: 书生♡
gitee主页🙋‍♂:奋斗的小白
博客领域💥:java编程 ,前端,算法,强训题目
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

在这里插入图片描述

目录

  • 1.存储 Bean 对象
    • 1.1配置路径
    • 1.2 存储 Bean 对象的两种方式
    • 1.3 存储 Bean 对象-----类注解
      • 1.3.1 @Controller(控制器存储)
      • 1.3.2 @Service(服务存储)
      • 1.3.3 @Repository(仓库存储)
      • 1.3.4 @Component(组件存储)
      • 1.3.5 @Configuration(配置存储)
    • 1.4 存储 Bean 对象-----方法注解
      • 1.4.1 使用方法注解@Bean
      • 1.4.2 方法注解的重命名
    • 1. 5 Bean的命名
    • 1.6 类注解的具体讲解
      • 1.6.1 为什么要有五个类注解
      • 1.6.2 五大类注解的用途(重点)
      • 1.6.3类注解之间的关系

1.存储 Bean 对象

 上一篇文章,已经教会大家怎么去存储Bean对象了,但是会发现比较麻烦,所以这篇文章会教会大家怎么更加简单的去存储Bean对象。

在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接下来要学习 Spring 中的相 关注解,来存储和读取 Bean对象。

1.1配置路径

在上一篇文章中,我们存储 Bean 时,需要在 spring-config 中添加⼀⾏ bean 注册内容才⾏。
在这里插入图片描述
但是会发现当我们需要注入多个类的时候,就会添加很多的Bean标签,会很麻烦,那有什么可以解决吗?
我们可以使用一行代码就去解决这个问题。

在我们的spring-config.xml中添加一行代码。
在这里插入图片描述

再添加这个代码的时候需要注意:一定要配置包路径,就是上图的标注的位置。
我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。
就是说你要扫描的对象,在哪个包下面,你就把这个包的路径写上去。

<?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="Spring.demo"></content:component-scan>
</beans>

有人就会问了,我不用包行不行,直接在根目录下创建一个类,是可以的,那么我们就需要这个位置不用写包的路径,写上两个**,就可以了,这个就代码扫描全部的。但是不建议这样写,因为我们以后再公司的时候,一定会有这样的路径的,所以建议大家在这里还是写在包的下面,更规范些。

1.2 存储 Bean 对象的两种方式

我们通过注解来存储对象在Spring中,有两种方式:

1.类注解:@Controller、@Service、@Repository、@Component、@Configuration。
2.方法注解:@Bean

下面为大家分别讲讲这两种方式。

1.3 存储 Bean 对象-----类注解

我们知道存储Bean对象有五种类注解。

@Controller 控制器
@Service 服务
@Repository 仓库
@Component 组件
@Configuration 配置

下面为大家分开说说这五种类注解。(重点是前三个)

1.3.1 @Controller(控制器存储)

我们在使用类注解的时候,类注解全部都是在类的上面的,因为我们是想将对象存储到 Spring 中,整个类就是一个对象,所以在类的上面。
在这里插入图片描述

使⽤ @Controller 存储 bean 的代码展示:

	@Controller//将对象存储到 Spring 中
	public class ApplicController {
	    
	    public  String hello()
	    {
	        return "Hello Spring !!!!";
	    }
	}


    public static void main(String[] args) {
        //1.获取Spring对象(上下文)
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");

        //2.取出bean对象

        //(3)根据Bean名称(标识)+类型 来得到Bean
        ApplicController applicController =context.getBean("applicController", ApplicController.class);

        //3.使用bean
        System.out.println(applicController.hello());
    }

在这里插入图片描述

1.3.2 @Service(服务存储)

这个和上面的一样,在类上面添加一个注解,@Service
在这里插入图片描述
使⽤ @Service 存储 bean 的代码展示:

@Service
public class ApplicController {

    public  String hello()
    {
        return "Hello Spring !!!!";
    }
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。
在这里插入图片描述

1.3.3 @Repository(仓库存储)

这个和上面的一样,在类上面添加一个注解,@Repository
在这里插入图片描述
使⽤ @Repository存储 bean 的代码展示:

@Repository
public class ApplicController {

    public  String hello()
    {
        return "Hello Spring !!!!";
    }
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。
在这里插入图片描述

1.3.4 @Component(组件存储)

这个和上面的一样,在类上面添加一个注解,@Component(这个用的比上面三个会少一些)
在这里插入图片描述
使⽤ @Component存储 bean 的代码展示:

@Component
public class ApplicController {

    public  String hello()
    {
        return "Hello Spring !!!!";
    }
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。

1.3.5 @Configuration(配置存储)

这个和上面的一样,在类上面添加一个注解,@Configuration(这个使用会更少一点)
在这里插入图片描述

使⽤ @Configuration存储 bean 的代码展示:

@Configuration
public class ApplicController {

    public  String hello()
    {
        return "Hello Spring !!!!";
    }
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。

1.4 存储 Bean 对象-----方法注解

在这里插入图片描述

1.4.1 使用方法注解@Bean

类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的。

那么为什么要引入方法呢?

1:因为一个类中可能会有很多个方法,但是我并不全部都需要引入到Spring,如果使用类注解,那么就是将整个类注入Spring中,耽误性能,所以使用方法注解,需要哪个方法就将那个方法注入
2.如果一个类中出现了两个同样的方法,那么实用类注解的时候,不知道去取一个,那么就需要使用方法注解的name属性去区分了。

@Controller
public class StudentBeans {
    @Bean
    public Student student1() {
        // 伪代码,构建对象
        Student stu = new Student();
        stu.setId(1);
        stu.setName("张三");
        stu.setAge(18);
        return stu;
    }
}

注意:
在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中
如果单独使用方法注解,会报错的
在这里插入图片描述

1.4.2 方法注解的重命名

我们可以通过设置 name 属性给 Bean 对象进⾏重命名操作

格式为:
@Bean({“名称”})
这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字,每一个名称用双引号括起来,用逗号分开。

注意事项:
当给@Bean设置了name属性之后,使用原方法名就不能获取到对象了,只能使用设置的名称才能获取。

在这里插入图片描述
此时我们使⽤我们自定义的名称就可以获取到 对象了

@Controller
public class StudentBeans {

    @Bean
    public Student student1() {
        // 伪代码,构建对象
        Student stu = new Student();
        stu.setId(1);
        stu.setName("张三");
        stu.setAge(18);
        return stu;
    }

    @Bean({"s1","s2"})
    public Student student2() {
        // 伪代码,构建对象
        Student stu = new Student();
        stu.setId(2);
        stu.setName("李四");
        stu.setAge(20);
        return stu;
    }

}

//另外一个启动类中
public static void main(String[] args) {

        //1.获取Spring对象(上下文)

        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        //2.取出bean对象

        Student student =context.getBean("student1",Student.class);
        System.out.println(student);
        System.out.println("===========");
        Student stu =context.getBean("s1",Student.class);
        System.out.println(stu);
        System.out.println("===========");
        //Student stu1 =context.getBean("student2",Student.class);//这种是错误的
        //System.out.println(stu1);
    }

1. 5 Bean的命名

我们在spring-config.xml中引入了,这么一段代码,我们就可以不使用bean标签了,但是我们会发现没有了id这个属性了,那我们在获取Bean对象的时候怎么办,如果只使用类名的话就会出现问题。

在这里插入图片描述
其实当我们类名首字母是大写的是,默认将类名的首字母小写,就是我们的id标识了。
在这里插入图片描述

这个时候我们就会有几个疑问:

问题1.如果类名首字母是小写,要怎么从Spring中获取Bean?
答:和首字母是大写是一直的,都是用的是将类名首字母小写的方式来获取对象。

在这里插入图片描述

问题2:如果首字母和第二字母都是大写,会怎样?
答:当使用默认规则,首字母小写获取Bean对象时,失败了!
正确获取Bean的方式是使用原类名,就能成功获取到了。

在这里插入图片描述

问题3:项目中没有目录,所有的类都写在 java根路径下,怎么存、取 Bean对象?
答:我们只需要改一下配置文件的包路径就行,将路径改为**

在这里插入图片描述

1.6 类注解的具体讲解

1.6.1 为什么要有五个类注解

1.通过类注解可以了解当前类的用途(就好像看到一个东西就知道这是哪里的,具有很强的识别性)
2.功能有细微不同:这个在 Spring MVC/Spring Boot再详细展开。

1.6.2 五大类注解的用途(重点)

1.@Controller(控制器)∶归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
2.@Service(服务):归属于服务层,调用类实现相应的功能。【不直接和数据库交互的,它类似于控制中心】
3.@Repository(仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repository。
4.@Configuration(配置)∶归属于配置层,是用来配置当前项目的一些信息。
5. @Component(组件):归属于公共工具类,提供某些公共方法。

在这里插入图片描述

1.6.3类注解之间的关系

先来看一下这五个类注解的源代码,可以发现每一个类注解都有一个@Componen,
这个就表明@Componen是他们的父类
在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1237393.html

相关文章

mybatis-plus入门笔记

快速开始demo 创建数据库 DROP TABLE IF EXISTS user;CREATE TABLE user (id BIGINT(20) NOT NULL COMMENT 主键ID,name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) NULL DEFAULT NULL COMMENT 邮箱,PRIMARY K…

原点安全携“金融机构消费者个人信息保护解决方案”亮相 2023 中国金融数字化转型发展大会

6 月 7 日&#xff0c;由中国金融电子化集团有限公司、南京市建邺区人民政府、中国人民银行南京分行主办&#xff0c;主题为“数驱转型 智创未来”的「2023 中国金融数字化转型发展大会暨第十三届中国城市商业银行信息化发展创新座谈会」于南京国际博览中心隆重召开。 本次会议…

Kafka详解(二)

Kafka命令行操作 [aahadoop102 ~]$ cd /opt/module/kafka/bin/ [aahadoop102 bin]$ ll 可以看到自带了zookeeper主题命令行操作 查看操作主题命令需要的参数 [aahadoop102 kafka]$ bin/kafka-topics.sh重要的参数如下查看当前服务器中的所有topic [aahadoop102 kafka]$ bin…

大数据分析平台释疑专用帖

大数据分析平台是大数据时代&#xff0c;企业数字化运营决策的一大关键平台&#xff0c;但初次接触大数据分析平台时&#xff0c;大家必然是问题多多的&#xff0c;本文将就几个比较常见的问题进行总结回答&#xff0c;希望对正在了解、选型大数据分析平台的大家有所帮助。 首…

每日一练 | 华为认证真题练习Day57

1、两台路由器通过PPP链路互连&#xff0c;管理员在两台路由器上配置了OSPF&#xff0c;且运行在同一个区域中&#xff0c;如果它们的Router ID相同&#xff0c;则下面描述正确的&#xff08;&#xff09;。 A. 两台路由器将会建立正常的完全邻居关系 B. 两台路由器将不会互相…

外卖项目初始化01

sell-app-day01 项目的搭建 创建项目仓库&#xff08;把代码上传上去&#xff0c;切换个人分支&#xff09;工程化scss reset.scssmain.scss [统一的出口]common.scss [公共的样式]vant.scss [覆盖vant的样式]var.scss 【变量的文件&#xff0c; 新】 css3 的变量 一键切换皮肤…

Jenkins部署报错问题:已解决

一.Jenkins不能下载插件 报错sun.security.provider.certpath.SunCertPathBuilderException sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.provider.certpath.SunCertPathBuild…

自动测试LeetCode用例方法

自动合并测试LeetCode解题方法 在leetcode.com上答题&#xff0c;Run Code或者Sumbmit通常要Spending一会&#xff0c;如果提交一次就Accepted那还好&#xff0c;如果反复Wrong Answer&#xff0c;很耽误时间。为了调高效率和减少挫折(来回提交&#xff0c;一直Wrong Answer倍…