Spring的存储与获取Bean

这篇具有很好参考价值的文章主要介绍了Spring的存储与获取Bean。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于 Spring 的创建及简单的使用
可以参考这篇文章

🔎Spring—存储Bean


之前的存储方式是利用<bean id="" class=""></bean>进行存储

但这种方式存在一个弊端

即需要存储的 Bean 过多时, 手动添加过于繁琐

利用注解可以有效规避这种情况

  • 添加注解存储 Bean
    • 类注解
      • @Controller: 控制器存储
      • @Service: 服务存储
      • @Repository: 仓库存储
      • @Component: 组件存储
      • @Configuration: 配置存储
    • 方法注解
      • @Bean: 对象存储(需搭配类注解一同使用)

配置扫描路径


添加如下代码至xml文件中

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

base-package=""
引号中填写的是扫描路径

完整代码

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

</beans>

如图
base-package="com.demo"
扫描路径为com包下的demo包下的全部

Spring的存储与获取Bean

所有的类都写在 Java 根路径下, 没有目录, 该如何存储 / 获取 Bean🍭

(了解即可, 通常不会这么做)

base-package="**"

将扫描路径更改为根目录下的全部

*表示根目录
**表示根目录下的全部

利用类注解进行存储


在 Spring Core 中, 类注解之间的区别不大

添加注解存储Bean


添加 @Controller 注解存储 Bean

Spring的存储与获取Bean

获取 Bean

Spring的存储与获取Bean

添加 @Service 注解存储 Bean

Spring的存储与获取Bean

获取 Bean

Spring的存储与获取Bean

添加 @Repository 注解存储 Bean

Spring的存储与获取Bean

获取 Bean

Spring的存储与获取Bean

添加 @Component 注解存储 Bean

Spring的存储与获取Bean

获取 Bean

Spring的存储与获取Bean

添加 @Configuration 注解存储 Bean

Spring的存储与获取Bean

获取 Bean

Spring的存储与获取Bean

关于Id


通过添加注解的方式存储 Bean, 获取 Bean 时的 Id 该如何命名🍭

  • 当类名为标准驼峰命名时, 将类名的首字母小写, 其余字母不变
    • (例如类名为UserInfo, 其对应的IduserInfo)
  • 当类名的首字母为小写时, 不做改变
    • (例如类名为userInfo, 其对应的IduserInfo)
  • 当类名的首字母和第二个字母均为大写, 不做改变
    • (例如类名为UInfo, 其对应的IdUInfo)

源码分析🍭

  • AnnotationBeanNameGenerator
    • Annotation, 注解
    • BeanName, 对象名
    • Generator, 生成
    • Annotation BeanName Generator, 生成对象名注解

Spring的存储与获取Bean

找到AnnotationBeanNameGeneratorgenerateBeanName()
点击buildDefaultBeanName()

Spring的存储与获取Bean

点击buildDefaultBeanName()

Spring的存储与获取Bean

点击decapitalize()

Spring的存储与获取Bean

找到最终的调用方法

Spring的存储与获取Bean

分析这段代码

public static String decapitalize(String name) {
    if (name == null || name.length() == 0) {
        return name;
    }
    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);
}
  • if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; }

如果长度 > 1 且第 1 个字符与第 0 个字符均是大写, 返回该字符串

(当类名的首字母和第二个字母均为大写, 不做改变)

  • chars[0] = Character.toLowerCase(chars[0]);

将第 0 个字符变为小写

(当类名为标准驼峰命名时, 将类名的首字母小写, 其余字母不变)
(当类名的首字母为小写时, 不做改变)

为什么需要五个类注解


既然都可以通过添加类注解的方式存储 Bean
那为何还需要五个类注解呢?

  1. 通过类注解可以了解当前类的用途
  2. 具体的功能存在差异

举个栗子🌰

通过车牌可以了解是哪里的车🚗, 例如 京 → 北京, 津 → 天津
(通过类注解可以了解当前类的用途)

类注解的用途🍭

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

举个栗子🌰

滑稽老哥家中失窃, 选择报警
接警员判断情况是否属实, 避免小孩子的恶作剧
(@Controller)

警局根据接警员的信息派出一些警察负责跟进
(@Service)

出警的警察负责这一起案件
(@Repository)

Spring的存储与获取Bean

类注解之间的关系


@Component 是 @Controller, @Service, @Repository, @Configuration 的父类

Spring的存储与获取Bean

利用方法注解进行存储


方法注解需搭配类注解一同使用
(目的是为了提高效率)

新建一个 Student 类

Spring的存储与获取Bean

新建一个 StudentBeans 类

为 getStu() 添加方法注解(@Bean)
为 StudentBeans 添加类注解(@Component)

Spring的存储与获取Bean

关于Id


  • 默认情况下 getBean() 对应的 Id 为方法名
  • @Bean 后可以跟 name
    • (例如 @Bean(name = {"s1", "s2"}))
  • 当 @Bean 后添加了 name 时, 所对应的 Id 只能为 name 名, 不允许设置为方法名

默认情况下 getBean() 对应的 Id 为方法名

Spring的存储与获取Bean

@Bean 后可以跟 name

Spring的存储与获取Bean

🔎Spring—获取Bean


从 Spring 中获取 Bean 也称为对象装配, 对象注入

对象装配(对象注入)的方式可以划分为 3 种

  • 属性注入
  • Set 注入
  • 构造方法注入

属性注入


Spring的存储与获取Bean

属性注入的效果等同于赋值

举个栗子🌰

@Autowired
private StudentService studentService;

private int num = 10;

StudentService studentService利用属性注入, 由 Spring 框架赋值
int num未利用属性注入, 由程序员赋值

综上, 再次说明了 Spring 是一个包含众多工具方法的 IOC 容器
(IOC → 控制反转)

属性注入的优点🍂

  • 实现简单

属性注入的缺点🍂

  • 不能注入不可变对象(final 修饰)
  • 只适用于 IOC 容器
  • 更容易违背单一设计原则

不能注入不可变对象(final 修饰)

final 修饰的对象有 2 种赋值方式

  1. 直接赋值
  2. 在构造方法中赋值

只适用于 IOC 容器

@Autowired 来自于 Spring
Spring 是一个包含众多工具方法的 IOC 容器
因此只适用于 IOC 容器

更容易违背单一设计原则

属性注入的方式实现简单
因此也更容易将其他无关的对象一并注入
也就更容易违背单一设计原则

Set注入


Spring的存储与获取Bean

Set 注入的优点🍂

  • 更符合单一设计原则

Set 注入的缺点🍂

  • 不能注入不可变对象(final 修饰)
  • 注入的对象可被修改

更符合单一设计原则

Set 注入的实现方式相比于属性注入较复杂
因此相较于属性注入也就避免了将其他无关的对象一并注入的情况
(更符合单一设计原则)

不能注入不可变对象(final 修饰)

final 修饰的对象有 2 种赋值方式

  1. 直接赋值
  2. 在构造方法中赋值

注入的对象可被修改

Set 注入相较于属性注入更危险!

属性注入的对象也可被修改
但 Set 注入除通过属性注入的方式修改注入的对象
也可通过 set() 方法修改注入的对象

set() 方法既可以被 Spring 调用
也可以被其他对象调用

构造方法注入


Spring的存储与获取Bean

注意

  1. 当只存在一个构造方法时, @Autowired 可省略
  2. 当存在多个构造方法时, @Autowired 不可省略

构造方法注入的优点🍂

  • 能注入不可变对象(final 修饰)
  • 注入的对象不可被修改
    • final 修饰
    • 构造方法随着类的加载只执行一次
  • 注入的对象会被完全初始化(类加载时就会将对象进行初始化, 当执行其他方法时, 对象已被初始化 → 构造方法的机制)
  • 通用性更好(任何一个类都会有构造方法)

构造方法注入的缺点🍂

  • 实现方式不如属性注入简单

总结(Spring的注入方式? 它们之间的区别?)

Spring的存储与获取Bean

@Resource


  • @Resource
    • 可以实现属性注入
    • 可以实现 Set 注入
    • 不可以实现构造方法注入

使用 @Resource 实现属性注入

Spring的存储与获取Bean

使用 @Resource 实现 Set 注入

Spring的存储与获取Bean

使用 @Resource 不能实现构造方法注入

Spring的存储与获取Bean

Spring的存储与获取Bean

对比@Resource与@Autowired

Spring的存储与获取Bean

来源不同🍭

@Resource

Spring的存储与获取Bean

Spring的存储与获取Bean

@Autowired

Spring的存储与获取Bean

支持参数不同🍭

@Resource

Spring的存储与获取Bean

@Autowired

Spring的存储与获取Bean

Tips


存在返回同一个类型的多个方法时

Spring的存储与获取Bean

利用@Resource(name = "")可以将其进行区分

Spring的存储与获取Bean

@Autowired 无法设置 name

只能填写对应的对象

Spring的存储与获取Bean

如果想写成 student 形式
需搭配@Qualifier()进行使用, 括号中填写的内容为对应的对象

Spring的存储与获取Bean

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油文章来源地址https://www.toymoban.com/news/detail-488396.html

到了这里,关于Spring的存储与获取Bean的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring框架】Spring读取与存储综合练习

    在 Spring 项⽬中,通过 main ⽅法获取到 Controller 类,调⽤ Controller ⾥⾯通过注⼊的⽅式调⽤ Service 类,Service 再通过注⼊的⽅式获取到 Repository 类,Repository 类⾥⾯有⼀个⽅法构建⼀个 User 对象,返回给 main ⽅法。Repository ⽆需连接数据库,使⽤伪代码即可。 User类 UserControlle

    2024年02月15日
    浏览(27)
  • 微信小程序获取收货地址及存储收货地址

    这个城市数据的js直接放网盘了我 链接:https://pan.baidu.com/s/18UsJ1VUxEI-7LJjVW8BW4w  提取码:mmao wxml wxss

    2024年02月15日
    浏览(37)
  • Android 获取内部存储中音乐文件的正确姿势

    最近想写一个音乐的小APP出来(doge),借此熟悉音频开发的相关技术。但是在获取 内部存储的音乐文件 时踩了一些坑...所以有了这篇帖子,简单介绍下Android的存储类别,以及如何获取内部存储中的音乐文件。 首先要理解一个概念, 内存≠内部存储 。 内存 - 程序运行是内

    2024年02月08日
    浏览(29)
  • 【Spring】(三)Spring 使用注解存储和读取 Bean对象

    前面的文章详细的介绍了 Spring 对象的创建,以及对 Bean 对象的存取操作,但是通过配置文件注册 Bean 对象以及使用 ApplicationContext 或 BeanFactory 的方式获取 Bean 对象的操作就显得格外的复杂。因此,本文主要就是详细介绍了一种更加简单的方式来实现对 Bean 对象更加简单的储

    2024年02月14日
    浏览(28)
  • Unity记录4.2-存储-从json文件获取Tile路径

    文章首发见博客:https://mwhls.top/4813.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 汇总:Unity 记录 摘要:从json文件获取Tile材质路径。 确定保存方案-2023/08/15 询问了GPT,它说Tilemap是根据摄像机位置进行渲染,所

    2024年02月10日
    浏览(25)
  • Spring使用注解存储和读取对象

    之前我们存储Bean时,需要在spring-config.xml中添加bean注册才行,这样的方式并不简单。我们要想 更简单的存储和读取对象的核心是使用注解 1.使用类注解(五大类注解): @Controller:控制器,验证用户请求的数据正确性(安保系统) @Service:服务层,编排和调度具体执行方法的(客服

    2023年04月19日
    浏览(34)
  • Spring使用注解存储Bean对象

    在前一篇博客中( Spring项目创建与Bean的存储与读取(DL))介绍的是通过配置文件注册对象从而存储到 Spring 中,这种方式其实还是挺繁琐的。 实际上,在使用学习使用 Spring过程中,当我们要实现一个功能的时候,先应该考虑的是有没有相应的注解是实现对应功能的,Spring 中

    2024年02月16日
    浏览(34)
  • 【Spring框架全系列】Spring更简单的读取和存储对象

    📬📬哈喽,大家好,我是小浪。上篇博客我们介绍了如何创建一个spring项目,并且如何的存、取对象,介绍了相关方法,那么本篇博客将接着上篇博客的内容介绍如何更加简单的读取和存储对象。 🌃在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接

    2024年02月05日
    浏览(30)
  • java获取当前服务器状态cpu、内存、存储等核心信息

    目录 1.需要导入依赖包  2.系统自带参数 3.获取当前服务器状态cpu、内存、存储等核心信息  4.引入包后方法不存在  5. 获取的cpu利用率和任务管理器cpu利用率值差距问题   RESULT: RESULT:  需要引入下面的包:  就是需要配置在 CentralProcessor 实例化之前:配置上也会有差距,相

    2024年02月03日
    浏览(37)
  • Spring 更简单的读取和存储对象

    在 Spring 中要想更简单的存储和读取对象 , 核心是 使用注解 , 所以我们需要通过 Spring 中相关注解 , 来存储和读取 Bean 对象. 之前我们存储 Bean 时 , 需要在 spring-config.xml 中添加一行注释才行: 而现在我们只需一个注解就可以替代之前要写一行配置 , 不过在存储对象之前 , 我们先

    2024年02月02日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包