【JavaEE】Spring中注解的方式去存储Bean对象

Spring的开发要点总结

文章目录

  • 【JavaEE】Spring的开发要点总结(2)
    • 1. 通过类注解的方式存储Bean对象
      • 1.1 五大 类注解
        • 1.1.1 @Controller 控制器存储
        • 1.1.2 @Service 服务存储
        • 1.1.3 @Repository 仓库存储
        • 1.1.4 @Component 组件存储
        • 1.1.5 @Configuration 配置存储
      • 1.2 Bean对象的名字
        • 1.2.1 注解加参数
        • 1.2.2 注解不加参数(默认情况下的名字)
        • 1.2.3 其他的注解什么情况
    • 2. 通过方法注解@Bean的方式存储Bean对象
      • 2.1 创建一个不含类注解的实体类
      • 2.2 方法注解的使用规则
      • 2.3 Bean对象的名字
        • 2.3.1 注解不加参数(默认情况下的名字)
        • 2.3.2 注解加参数
        • 2.3.3 方法注解重名问题

【JavaEE】Spring的开发要点总结(2)

Spring的开发要点总结(1)博客传送门:【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取_s:103的博客-CSDN博客

【JavaEE】Spring中注解的方式去存储Bean对象_第1张图片

在上一篇文章中,可见Bean对象的存储和获取还是有点麻烦,这一篇文章的重点就在于简化这个过程~

  • 在JavaEE的学习中,要实现一个功能,要先考虑有没有实现对应功能的一个 注解,在JavaEE进阶中,注解的使用很常见~
  • 对于注解,它是可以实现一定业务逻辑的东西

1. 通过类注解的方式存储Bean对象

在配置文件里配置一个组件:

  • 没有这个,就内部代码就不知道扫描哪里,从而无法通过类注解存储Bean对象

<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.bit.service">content:component-scan>
beans>

【JavaEE】Spring中注解的方式去存储Bean对象_第2张图片

beans的属性与原配置的属性也不同哦

【JavaEE】Spring中注解的方式去存储Bean对象_第3张图片

这个属性的值的含义就是,扫描的路径

如果不填写base-package属性,默认情况下会扫描配置文件所在包及其子包下的组件。但为了避免不必要的不确定性,建议明确指定需要扫描的包路径。

你可以在标签的base-package属性中指定多个扫描路径。可以使用逗号(,)或分号(;)将多个路径分隔开。

【JavaEE】Spring中注解的方式去存储Bean对象_第4张图片

  • 我填写的是:com.mara.demo~

而扫描路径下,如果加了类注解的类,就会存储一个Bean对象到Spring里

  1. @Controller
  2. @Service
  3. @Repository
  4. @Component
  5. @Configuration

这样做不会有一些不必要的开销,因为一个项目的类特别多,没必要每个类都扫描到,每个类都有Bean对象存储到Spring里

1.1 五大 类注解

1.1.1 @Controller 控制器存储

【JavaEE】Spring中注解的方式去存储Bean对象_第5张图片

【控制器】,重要作用就是校验参数的合法性(安检系统)

1.1.2 @Service 服务存储

【JavaEE】Spring中注解的方式去存储Bean对象_第6张图片

【服务】业务组装(客服中心)

  • 就是一些业务逻辑代码,它只是调用一些方法,然后去实现“逻辑”,但是并没有实质去实现那些“持久化数据的操作”

1.1.3 @Repository 仓库存储

【JavaEE】Spring中注解的方式去存储Bean对象_第7张图片

【数据持久层】DAO层,实际的业务处理

1.1.4 @Component 组件存储

【JavaEE】Spring中注解的方式去存储Bean对象_第8张图片

【组件】工具类层(基础的工具)

1.1.5 @Configuration 配置存储

【JavaEE】Spring中注解的方式去存储Bean对象_第9张图片

【配置】配置层

  • 在之前的项目开发里也很常见地需要配置一些依赖啥的~
  • 配置版本号~

而我们以后做项目也要讲代码进行分类,是这五种中的哪一种,就放到对应的包里,而包里面java类的类注解就是对应功能的类注解

程序的工程分层图:
【JavaEE】Spring中注解的方式去存储Bean对象_第10张图片

1.2 Bean对象的名字

Bean对象的类理所当然就是对应的类

那么Bean对象怎么命名呢?

1.2.1 注解加参数

【JavaEE】Spring中注解的方式去存储Bean对象_第11张图片

运行结果:

  1. 获取并使用

【JavaEE】Spring中注解的方式去存储Bean对象_第12张图片

  1. 不获取不使用

【JavaEE】Spring中注解的方式去存储Bean对象_第13张图片

可见,配置文件被识别的时候,就会扫描对应的路径,把Bean存储起来~

  1. 不加注解
    • 连名字都不可能有

在这里插入图片描述

  1. 其他的命名方式(value)

【JavaEE】Spring中注解的方式去存储Bean对象_第14张图片

结果一样

初步来看,Bean对象的名字可以通过注解后面添加参数来规定

  • 并且不能有多个名字

1.2.2 注解不加参数(默认情况下的名字)

(括号加不加都一样)

【JavaEE】Spring中注解的方式去存储Bean对象_第15张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第16张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第17张图片

居然可以,难道是大驼峰变小驼峰就行了?

【JavaEE】Spring中注解的方式去存储Bean对象_第18张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第19张图片

好像又不是~

改为类名:

【JavaEE】Spring中注解的方式去存储Bean对象_第20张图片

又可以了~

我认为是这样的,有一些大驼峰,前两个字母都是大写的情况,有可能是本来就是缩写的形式,变成小驼峰不美观,然后也不能全小写(可能会显示拼写错误)

所以干脆就是类名了~

【JavaEE】Spring中注解的方式去存储Bean对象_第21张图片

  • 对于不规范的类名
    • 小驼峰->小驼峰

总结:

  1. 第一个字母大写,第二个字母小写,默认名就是小驼峰
  2. 前两个字母都大写,默认名就是类名
  3. 小驼峰,则依旧是小驼峰

补充:

  • 一个类的类注解生成的Bean对象就一个,因为名字就一个,默认的名字会给的参数被替换~

【JavaEE】Spring中注解的方式去存储Bean对象_第22张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第23张图片
源代码:

shift shift:

【JavaEE】Spring中注解的方式去存储Bean对象_第24张图片

  • 注解相关的

一路走过去:

【JavaEE】Spring中注解的方式去存储Bean对象_第25张图片

  • 符合刚才的规则

【JavaEE】Spring中注解的方式去存储Bean对象_第26张图片

而这个包就是jdk中的一个,也就是说不上Spring发展而当生的

  • 也就是java中的一种命名方式~

【JavaEE】Spring中注解的方式去存储Bean对象_第27张图片

1.2.3 其他的注解什么情况

其他的注解的结果都是一样的~

  • 目前我们的认知就区分这些注解为,设计代码是为了不同的“初心”吧~

【JavaEE】Spring中注解的方式去存储Bean对象_第28张图片

  • 其他四个注解都是Component的子类~

2. 通过方法注解@Bean的方式存储Bean对象

2.1 创建一个不含类注解的实体类

在model(实体类 -> 数据库的表的字段的模型)包中,

【JavaEE】Spring中注解的方式去存储Bean对象_第29张图片

获得Getter和Setter

【JavaEE】Spring中注解的方式去存储Bean对象_第30张图片

生成一个toString方法~

【JavaEE】Spring中注解的方式去存储Bean对象_第31张图片

创建一个类,去使用方法注解:

【JavaEE】Spring中注解的方式去存储Bean对象_第32张图片

2.2 方法注解的使用规则

【JavaEE】Spring中注解的方式去存储Bean对象_第33张图片

  • 将当前方法返回的对象存储到 IoC 容器中~

接下来我在这个方法中去填写一些“伪代码”:

【JavaEE】Spring中注解的方式去存储Bean对象_第34张图片

  • 这边是个伪代码,我们只体现它返回的对象会存储到容器中
  • 后续再规范的去写(不使用手动new)
    • 我们学完一些基础知识,才能串起来~

2.3 Bean对象的名字

2.3.1 注解不加参数(默认情况下的名字)

在APP类中去测试:

  • 猜测:跟类注解的一样?

【JavaEE】Spring中注解的方式去存储Bean对象_第35张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第36张图片

没找到~

是名字错了吗?

  • 不是,是因为通过配置文件,没扫描到那个地方
  • 也就是说,在获取Bean对象的时候,并没有获取@Bean下方法返回的对象

因为需要一个“五大类注解”

  • <content:component-scan base-package="com.mara.demo">content:component-scan>
    
  • 这个的规则就是在指定的目录下扫描带有注解的类

    • 之后才能扫描到带@Bean的方法~
    • 方法在项目中是特别多的,如果不这样,那肯定开销特别大,性能特别低!

即,@Bean必须配合五大类注解使用

【JavaEE】Spring中注解的方式去存储Bean对象_第37张图片

  • 五个中的其中一个~
  • 这个对象通常是个组件,所以用Component,对应这五个在项目中的定位,现在比较模糊,但是以后就会很明确了,现在不了解以后了解!

运行结果:
【JavaEE】Spring中注解的方式去存储Bean对象_第38张图片

  • 咋都是默认值呢?

因为注解加在实体类那了,我们获取到的则是类注解方式存储的Bean对象~

我们要在@Bean所在的类进行类注解:

【JavaEE】Spring中注解的方式去存储Bean对象_第39张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第40张图片

那么这个命名规则就是跟前面的一样吗?

  • 并不是,此处的命名规则是:方法名

【JavaEE】Spring中注解的方式去存储Bean对象_第41张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第42张图片

  • 找到Article的类注解存储的Bean对象~

在这里插入图片描述

  • 找到了~

疑问:那么重载方法咋办?

不能出现重载方法,因为通过方法注解获取的对象,默认都是没有参数列表的,自然无法调用其重载方法,自然就无法存储Bean对象~

2.3.2 注解加参数

对了,无论是哪里,注解中的字符串千万别是空!

在这里插入图片描述

  1. 直接写字符串
  2. name = “…”
  3. value = “…”
  4. value/name = {“…”, “…”, …}

前三种本质是一样的,第四种方式则比较特殊,是一个Bean对象,多个名,而且每个名字指的是同一个对象~

  • 字符串数组为空,则代表没填~
  • 类注解存储方式是没有第二和第四种方法

在Bean的源代码也能看出来(即使你看不懂,就猜一下):

【JavaEE】Spring中注解的方式去存储Bean对象_第43张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第44张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第45张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第46张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第47张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第48张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第49张图片

  • 我并没有重写equals和使用equals方法,所以这true就代表引用的指向是一样的!

而用参数去命名的话,原来的默认命名被覆盖~

【JavaEE】Spring中注解的方式去存储Bean对象_第50张图片

这种方式 Spring 存储 Bean 的逻辑结构是:

【JavaEE】Spring中注解的方式去存储Bean对象_第51张图片

2.3.3 方法注解重名问题

对于类注解的方式,由于就一个类,所以不会重名

但是对于方法注解,就可以有多个方法,返回同一个类的对象,而不同的方法是不同的Bean对象,如果他们重名咋办?

【JavaEE】Spring中注解的方式去存储Bean对象_第52张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第53张图片

  • 而且不是巧合

  • 并不会报错~

这是跟加载顺序和权重有关的~

  • 加载顺序,可通过@Order去间接定义,@Order参数值小的要更先加载
    • 在Spring容器中,如果多个Bean使用相同的名称,后续的Bean定义将会覆盖之前的Bean定义。 这意味着只有最后一个定义的Bean会被存放到容器中,并与该名称关联起来。之前的Bean定义将会被覆盖,并且无法再通过该名称获取到之前的Bean。
    • 这个方法适用于不同类的Bean对象
    • 不适用于同一个类的Bean对象,这个跟代码顺序有关~

同一个类中:

【JavaEE】Spring中注解的方式去存储Bean对象_第54张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第55张图片
尽管你在@Bean方法上使用了@Order注解,但最终的加载顺序仍然由Spring容器的实现决定,而不是由@Order注解决定。这意味着无法确保art1()方法必定在art2()方法之前加载。

不同类:

【JavaEE】Spring中注解的方式去存储Bean对象_第56张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第57张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第58张图片

【JavaEE】Spring中注解的方式去存储Bean对象_第59张图片

运行结果:

【JavaEE】Spring中注解的方式去存储Bean对象_第60张图片

但是,总的来说,重名是不合理的,不要写成这样!


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭

代码链接:SpringDemo2/src/main · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)

本文讲解了注解方式存储Bean的方法,是不是更方便了呢?


你可能感兴趣的:(JavaEE,java-ee,spring,java)