获取Bean的两种方法

news2024/11/16 17:29:25

简单获取Bean的两种方法

  • 简单获取Bean的两种方法
      • 那么对于调用`Bean`对象时需要注意什么?
    • 五大类注解自定义名称
    • 三种bean注入

简单获取Bean的两种方法

在之前使用spring时我们都是使用xml语句进行对象注入,而如果对于一个大型项目采用这种方法,需要编写大量的xml对象注入语句,使用起来可以说是非常不方便了。那么使用什么方法才可以使得我们并不需要编写大量的代码就可以写出优秀的程序呢?

五大类注解由此而生,对于一个类对象只需要添加一个注解,然后就可以获取到添加该注解的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.controller">
    </content:component-scan>
    <!-- 注意:base-package="这里填写的是类创建的路径" -->
</beans>

将配置文件修改之后,我们需要读懂配置文件中添加的字段。

<content:component-scan>这个标签如果在xml文件中进行配置,就会在base-package这个目录下自动扫描以下五大类注解,然后将这些类加注册为bean

  • @Controller:控制层

归属于业务逻辑层,用来控制用户行为和检查仓库数据的有效性

  • @Repository:数据仓库层

    归属于持久层,直接调用数据库的数据,通常每个数据表只存在一个需要@repository注解类

  • @Service:服务层

    使用数据仓库持久化的特性将数据传递给控制层(不直接与数据库中数据交互,相对于数据控制中心)

  • @Component:组件层

    归属于公共方法类,提供一些五大类注解都会使用的方法

  • @Configuration:配置层

    一般用于当前项目的配置,一般每个项目的配置文件都会存在不同

使用示例:

//一个添加@controller的对象被注入时
@Controller
public class Employ {
    public void addOne(){
        System.out.println("录用一个新人");
    }
}

App.class获取bean对象:

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Employ employ = context.getBean("employ", Employ.class);
        employ.addOne();
    }
}

在这里插入图片描述

可以看到使用了@Controller的类的确被注册。

那么对于调用Bean对象时需要注意什么?

在使用bean标签注入对象时,语法如下:

<bean class="User" id="user">

表示类名为:User,引用时使用id也就是user,意味着user就是bean注册时使用的名称。而当我们使用五大类注解时如果直接使用默认名称,与类名有什么关联!在上面我们举例时默认使用了小写的类名,然后可以获取到bean对象,而如果本来就是小写的类我们又如何去获取,如果是一个全部字母为大写的类又是如何注册Bean对象的?

打开源码:

在这里插入图片描述

public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
    //判断首字母和第二个字符是不是大写,如果是!返回原来的类名作为bean的名称
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
    	//如果前两个字符串不是大写,就创建一个新字符数组保存原来的字符串,然后将第一个字符改为小写
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

根据以上源码可以得出Bean对象命名的三种规则:

  • 当首字母为大写时,将首字母改为小写,其他不变
  • 当首字母为小写时,使用原类名进行调用
  • 当前两个字母为大写时,使用原类名进行调用

所有我们在编写一个类对象时,不能随意命名,要看懂spring中对于bean对象有不同要求然后获取bean对象时进行修改。

五大类注解自定义名称

在五大类使用时需要注意名称的大小写来注册一个Bean对象,那么有没有更加方便的定义方法呢?

添加Bean自定义名称

@Controller(value="Bean1")

在之后的使用中就可以使用自定义名称来作为Bean名称来调用对象。要注意一旦使用了自定义的名称作为Bean对象,原来的类名就不能使用了。

三种bean注入

除了使用五大类注解来注册一个对象,我们还可以使用@Bean去针对性的注入一个方法或者对象,需要注意的是@Bean对象需要配合五大类注解一起使用,单独使用是无法起效的。

在注册一个类时,在类中使用了Bean注解的方法或者对象都会被一同注入。

例如在刚刚的员工方法,我们掉用了addOne时在控制台打印信息。而在addOne上添加@Bean注解后,直接获取Employ对象时在控制台就会打印信息。相对于另外新注册了一个Bean对象,可以直接使用context.getBean("bean的名称");

//App------------间接调用Bean
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Employ employ = context.getBean("employ", Employ.class);
    }
}
//App------------直接调用Bean
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new context.getBean("addOne");
    }
}

//Employ
@Controller
public class Employ {
    @Bean
    public void addOne(){
        System.out.println("录用一个新人");
    }
}

输出相同:

在这里插入图片描述

上面中的五大类注解可以进行自定义名称,同样的@Bean也可以自定义名称来作为Bean对象。

//语法1-----可加{}命名为多个名称
@Bean("add")
public void add() {
    System.out.println("Do UserRepository add method");
}
//语法2-----可加{}命名为多个名称
@Bean(name = "add")
public void add() {
    System.out.println("Do UserRepository add method");
}
//语法3-----可加{}命名为多个名称
@Bean(values = "add")
public void add() {
    System.out.println("Do UserRepository add method");
}

命名多个名称是为了让程序更加易读。

public @interface Bean {
    @AliasFor("name")
    String[] value() default {};
    @AliasFor("value")
    String[] name() default {};
    /** @deprecated */
    @Deprecated
    Autowire autowire() default Autowire.NO;
    boolean autowireCandidate() default true;
    String initMethod() default "";
    String destroyMethod() default "(inferred)";
}

这个是关于bean命名的源码:

  1. namevalue:可以看到name默认调用bean是使用方法名,namevalue可以作为多个命名存在。
  2. Autowire:装配默认不开启自动装配功能
  3. initMethod:初始化代码,不常用
  4. destroyMethod:销毁操作,如果程序使用了close或者shutdown,会自动销毁

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

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

相关文章

Python_使用requests获取当当网榜单中的图书数据

使用requests获取当当网榜单中的图书数据 使用到的库概述发送请求xpath解析提取数据tips 完整代码 使用到的库 requestsetree 概述 主要抓取目标为 当当网图书畅销榜中近24小时畅销的图书信息 主要提取的数据为 排名、书名、评论数、推荐度、作者信息、出版时间、出版社、折扣…

MySQL主从复制(三十五)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、MySQL Replication概述 1.1 MySQL Replication优点&#xff1a; 二、MySQL复制类型 2.1 异步复制&#xff08;Asynchronous repication&#xff09; 2.2 全同步…

vue的条件渲染以及列表渲染的总结归纳加代码演示

&#x1f600;前言 本片文章是vue系列第4篇整理了vue的条件渲染以及列表渲染的总结归纳加代码演示 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我…

OR-Tools解决复杂调度问题:实际案例分析

目录 前言一、调度问题介绍二、案例分析2-1、护士调度问题2-2、作业车间调度问题 三、知识库3-1、collection3-2、CpModel().AddNoOverlap()3-3、CpModel().AddMaxEquality()3-4、cp_model.CpModel().NewIntVar()3-5、cp_model.CpModel().NewIntervalVar 总结 前言 调度问题是一…

干货 | 电路中为何需要串联小电阻?这样解释就懂了

干货 | 电路中为何需要串联小电阻&#xff1f;这样解释就懂了 一、电阻概念 电阻作为元器件&#xff0c;又叫作电阻器&#xff0c;导体的电阻通常用字母R表示&#xff0c;电阻的单位是欧姆&#xff08;ohm&#xff09;&#xff0c;简称欧&#xff0c;符号是Ω&#xff08;希腊字…

oracle,获取每日24*60,所有分钟数

前言&#xff1a; 为规范用户的时间录入&#xff0c;因此我们采用下拉的方式&#xff0c;让用户选择需要的时间&#xff0c;因此我们需要将一天24小时的时间拆分为类似00:00,00:01...23:00,23:01,23:59。因此我们需要生成24*601440行的下拉复选值。具体效果如下图所示。 思路 1…

langchina的PlayWrightBrowserToolkit (PlayWright 浏览器工具包)

langchina中的PlayWrightBrowserToolkit 好久不见了&#xff0c;朋友们&#xff0c;我&#xff08;小云&#xff09;也是好久不写博客了&#xff0c;随着ai的不断引进&#xff0c;和一大堆大语言的到来&#xff0c;我们今天就学习一下啊langchain这个大语言模型中PlaywrightBr…

如何快速用PHP取短信验证码

要用PHP获取短信验证码&#xff0c;通常需要连接到一个短信服务提供商的API&#xff0c;并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式&#xff0c;我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff…

硬件系统工程师宝典(34)-----FLASH电路如何设计?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们了解了存储器可分为RAM和ROM&#xff0c;根据不同特性也可以逐级细分&#xff0c;并且简单介绍了EEPROM。今天我们讲一讲FLASH有哪几种&am…

软件测试四年,总结下功能测试用例设计思路

我们为什么要写好一份测试用例呢&#xff1f;测试同学应该都知道测试用例的重要性&#xff0c;测试用例就是我们测试的依据&#xff0c;也是测试过程中不能缺少的测试文档。 一、用例编写规范目的&#xff1a; 1、提高测试用例的可读性&#xff0c;可执行性、合理性。 2、测…

【论文阅读】通过解缠绕表示学习提升领域泛化能力用于主题感知的作文评分

摘要 本文工作聚焦于从领域泛化的视角提升AES模型的泛化能力&#xff0c;在该情况下&#xff0c;目标主题的数据在训练时不能被获得。本文提出了一个主题感知的神经AES模型&#xff08;PANN&#xff09;来抽取用于作文评分的综合的表示&#xff0c;包括主题无关&#xff08;pr…

Lambda表达式常见的Local variable must be final or effectively final原因及解决办法

目录 Local variable must be final or effectively final错误原因 解决办法按照要求定义为final&#xff08;不符合实情&#xff0c;很多时候是查库获取的变量值&#xff09;使用原子类存储变量&#xff0c;保证一致性AtomicReference常用原子类 其它 Local variable must be …

(树) 剑指 Offer 07. 重建二叉树 ——【Leetcode每日一题】

❓剑指 Offer 07. 重建二叉树 难度&#xff1a;中等 输入某二叉树的 前序遍历 和 中序遍历 的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] …

8.11 PowerBI系列之DAX函数专题-TopN中实现N的动态

需求 实现 1 ranking by amount rankx(allselected(order_2[产品名称]),[total amount]) 2 rowshowing_boolean var v_ranking [ranking by amount] var v_topN-no [topN参数 值] var v_result int( v_ranking < v_topN_no) return v_result 3 将度量值2放入视觉对象筛…

spinal HDL语法学习

1 赋值语句 用来声明变量 : 用来对变量进行赋值 2 when otherwise前面是否有"."与otherwise是否换行有关系 3 case class 对Bundle进行扩展时&#xff0c;需要case class case class和class主要有两点区别&#xff1a; &#xff08;1&#xff09;case class不需…

会议OA项目之会议发布(一)

目录 前言&#xff1a; 会议发布的产品原型图&#xff1a; 1.会议发布 1.1实现的特色功能&#xff1a; 1.2思路&#xff1a; 使用的数据库&#xff1a; 我们要实现多功能下拉框的形式选择可以参考原文档&#xff1a;https://hnzzmsf.github.io/example/example_v4.html#down…

运算放大器--------加减运算电路

反向求和运算电路 电路 公式 同向加法运算电路 电路 公式 加减运算电路 分别求正向输入的输出和反相输入的输出&#xff0c;然后求和就可以得到到最终的输出。 切记&#xff0c;虚短虚断不是真正的断路和短路。

antDesign的a-select数据回显选中initialValue问题解决方法

在开发过程中表单中的【学习专业】下拉列表项需要数据回显&#xff0c;设置了initialValue&#xff0c;但只显示下拉选项的majorId值, 没有显示具体的专业名称&#xff0c;经排查发现是majorId数据类型导致的&#xff0c;下拉选项majorList数组中的id是数值类型&#xff0c;而在…

LeetCode|backtracking|review:40. 131. 93. 47. 332. | 37. Sudoku Solver

复习&#xff1a; 40. Combination Sum II [1,1,2,3]中&#xff0c;答案里有[1,1,2], 但是不能有两个[1,2,3] 131. Palindrome Partitioning 每个for都是在给定的start之后找一个palindrome。当start 93. Restore IP Addresses forloop每次loop都是在给定的start的后三个数…

Redis三种模式——主从复制,哨兵模式,集群

目录 一、主从复制 1.1主从复制的概念 1.2Redis主从复制作用 1.2.1数据冗余 1.2.2故障恢复 1.2.3负载均衡 1.2.4高可用基石 1.3Redis主从复制流程 1.4部署Redis 主从复制 1.4.1.环境部署 1.4.2.所有服务器都先关闭防火墙 1.4.3.所有服务器都安装Redis 1.4.4修改Master主节点R…