当前位置: 首页 > news >正文

spring学习笔记之注解开发

Spring常用注解主要是替代 <bean> 的配置,简化 XML 的配置。(注解其实就是一个标记)

常用的注解:

前提:

注意:

使用注解进行开发时,需要在核心配置文件中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。

自定义注解

1.元注解:标注注解的注解
2.@Target注解:用来修饰注解可以出现的位置
@Target(value = {ElementType.TYPE, ElementType.FIELD}),Target标注的注解可以出现在类或字段上
@Target(value = {ElementType.TYPE}),Target标注的注解可以出现在类上

3.使用某个注解的时候,如果注解的属性名是value的话,value可以省略。
@Target({ElementType.TYPE})
4.使用某个注解的时候,如果注解的属性值是数组,并且数组中只有一个元素,大括号可以省略。
@Target(ElementType.TYPE)
@Retention:也是一个元注解,用来标注注解最终可以保留到什么时刻
5.如果注解要保存到class文件当中,并且可以被反射机制读取,则使用@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.SOURCE),表示Retention标注的注解只能保留到源文件中,字节码和运行时看不到Retention标注的注解

1.反射注解

反射注解是指通过反射机制来读取和处理类、方法、字段等元素上的注解。它将注解的声明式信息与反射的运行时检查能力结合,实现了对代码元数据的动态解析和利用。
对比项普通注解反射注解
本质仅作为 “标记”,编译后基本无实际逻辑(除非结合特定工具在编译期处理)必须结合反射机制运行时读取注解信息,并执行对应的逻辑
作用时机大多在编译期类加载时生效(如 @Override 是编译器检查用的)完全在运行时生效(程序跑起来后才会读取注解并执行逻辑)
依赖关系不依赖反射,仅靠编译器或特定工具即可处理必须依赖反射 API(如 getAnnotation() 等)才能发挥作用
典型场景@Override:编译器检查方法是否真的重写了父类方法- @Deprecated:标记代码过时,编译器给出提示- Spring 的 @Autowired:运行时自动注入依赖- JUnit 的 @Test:运行时识别并执行测试方法- 自定义 @NotNull:运行时校验参数是否为空
通俗理解像 “商品标签”,仅用于标识(比如 “易碎品” 标签,商家打包时会注意,但商品本身不会因为这个标签有变化)像 “智能标签”,商品(程序)能自己读标签,还能根据标签主动执行动作(比如 “易碎品” 标签让商品自己触发 “轻拿轻放” 的逻辑)

2.组件扫描原理

假如只给你包的名字,这个包下有多少类你不知道。 其中,有的类上有注解,有的类没有,要求只要这个类上有注解,就把这个对象造出来,放到map集合里。

首先,我们获取文件目录,有三种方式:

在这里我们可以获取绝对路径,那我们就可以获得该目录下的子文件,接着我们就可以根据注解创建对象了。

成功!

这里是注解的实现原理,不理解我们可以先往后学。

3.声明Bean

用注解声明Bean用下面这4个组件之一:

@Component:通用组件

  • 含义:最基础的组件注解,没有特定业务含义,是其他三个注解的 “父类”。

  • 适用场景:当一个类不属于 Web 层、Service 层、Dao 层时使用(比如工具类、通用组件)。

@Controller:Web 层 / 控制器

  • 含义:专门标记 Web 层 的类(如 Spring MVC 的控制器),告诉 Spring 这是处理用户请求的组件。

  • 适用场景:接收浏览器 / 客户端的请求,调用 Service 层处理,返回结果(如页面、JSON)。

@Service:Service 层 / 业务逻辑层

  • 含义:专门标记 Service 层 的类,负责封装业务逻辑,是 Controller 和 Dao 之间的 “桥梁”。

  • 适用场景:处理核心业务(如用户注册、订单计算),调用 Dao 层操作数据,返回处理结果。

@Repository:Dao 层 / 数据访问层

  • 含义:专门标记 Dao 层 的类,负责与数据库交互(如查询、插入数据)。

  • 附加功能:Spring 会自动对标注的类进行 “异常转换”(把数据库相关异常转为 Spring 统一的异常类型)。

  • 适用场景:直接操作数据库(如用 JDBC、MyBatis 执行 SQL)。

注:这四个注解都是 Spring 框架中用于标识 “组件” 的注解,核心作用是告诉 Spring:“这个类需要被你管理起来,成为容器中的一个 Bean”。它们的本质都是 @Component 的 “特殊化”,只是语义上分别对应不同的业务层,让代码结构更清晰。

3.Spring注解的使用

1.配置文件

2.在Bean类上使用注解

3.测试运行

特别的,如果我们这里不起名(value属性省略)

我们这里的默认的名称就是类的首字母变小写

4.多个包的扫描问题

1.在配置文件中指定多个包,用逗号隔开

2.指定多个包的共同父包(但是这肯定要牺牲一部分效率)

5.选择性实例化Bean

假设在某个包下有很多Bean,有的Bean上标注了Component,有的标注了Controller,有的标注了Repository,但是由于某种特殊业务的需要,只允许其中所有的Repository参与bean管理,其他的都不实例化。

方案一:

测试运行:

方案二:

6.负责注入的注解(给Bean的属性赋值)

@Value:注入普通属性值。

  • 作用:给基本类型(如 String、int、boolean 等)或字符串赋值,支持直接写常量,或读取配置文件(如 application.properties)中的值。

  • 使用场景:注入简单的配置信息(如用户名、端口号、文件路径等)。

@Autowired:按类型自动注入 Bean。

  • 作用:让 Spring 从容器中找到类型匹配的 Bean,自动注入到字段或方法中(默认按类型匹配)。

  • 使用场景:注入 Spring 管理的 Bean(如 Service、Dao 等组件),是最常用的依赖注入注解。

  • 注意

    • 若容器中只有一个该类型的 Bean,直接注入成功。

    • 若有多个同类型的 Bean,会报错,需配合 @Qualifier 按名称选择。

@Qualifier:按名称指定注入的 Bean。

  • 作用:配合 @Autowired 使用,当容器中有多个同类型的 Bean 时,按名称指定具体要注入的 Bean,解决类型冲突。

  • 使用场景:同类型 Bean 有多个实现(如 UserDao 有 UserDaoImpl1 和 UserDaoImpl2),需要明确选择其中一个。

@Resource:按名称 / 类型注入(Java 原生注解)

  • 作用:相当于 @Autowired + @Qualifier 的组合,默认按名称匹配,名称找不到时再按类型匹配(非 Spring 原生,是 Java EE 规范注解)。

  • 使用场景:需要灵活按名称或类型注入,且不想写多个注解时。

注:这四个注解都是 Spring 中用于注入依赖或属性值的核心注解,作用是让 Spring 自动为类中的字段或方法参数赋值,避免手动创建对象,实现 “依赖注入”(DI)

1)@Value

使用的时候一定要先把Bean实例化

2)@Autowired

单独用的时候默认根据类型来进行装配,要想根据名字来进行装配,需要与@Qualifier一起使用

同时,也可以用在方法上

//如果一个类当中构造方法只有一个,并且构造方法上的参数和属性能够对应上,@Autowired可以省略
//一个类中只能有一个构造方法被@Autowired标记,否则会导致依赖注入冲突。

3)@Qualifier

在上面的基础上,我们再创一个UserDao的实现类

在注入的时候就会出现以下问题:

也就是说这个时候容器在进行注入的时候,他不知道注入MySQL还是Oracle了

要解决这个问题只能根据名字来装配

4)@Resource

@Resource与@Autowired比较:

1.来源

@Autowired:来自 Spring 框架自身,是 Spring 定义的依赖注入注解。

@Resource:来自 Java EE 规范(JDK拓展中,不属于 Spring 专属,是 Java 标准注解。

2.注入依据

@Autowired:默认按类型(byType) 注入,如果存在多个同类型的 Bean,会需要配合@Qualifier注解按名称(byName) 进一步筛选。

@Resource:默认按名称(byName) 注入,即优先根据属性名或注解的name属性匹配 Bean 的名称。如果按名称找不到匹配的 Bean,先把属性名作为name,去查找,若是查不到则会按类型(byType) 注入。

3.支持的注入位置

@Autowired:可以标注在构造方法、方法、属性、参数上。

@Resource:可以标注在属性、方法上,但不支持构造方法和参数注入。

使用Resouce注解的依赖

使用在set方法上

7)@Override

@Override 是 Java 中的一个注解,用于标记一个方法是重写(覆盖)了父类中的方法。它的主要作用是编译时检查,确保当前方法确实是重写了父类的方法,避免因拼写错误、参数不匹配等问题导致的隐性错误。

作用:

1.编译时校验

2.提高代码可读性

父类方法:

子类继承

8)全注解式开发

全注解式开发就是不再使用spring.xml配置文件了,写一个配置类来代替配置文件

@Configuration 是 Spring 框架中的核心注解之一,用于标记一个类为配置类,相当于传统 Spring 配置中的 XML 文件(如 applicationContext.xml)。它的主要作用是通过 Java 代码定义 Spring 容器中的 Bean、配置依赖关系或其他框架设置。

@ComponentScan是 Spring 框架中用于自动扫描并注册 Bean的注解,它的核心作用是告诉 Spring:去指定的包路径下扫描带有 @Component 及其派生注解(如 @Service 等)的类,并将这些类自动注册为 Spring 容器中的 Bean。相当于配置文件中的这一行:

注意,我们这里开始new的是AnnotationConfigApplicationContext。

http://www.dtcms.com/a/618859.html

相关文章:

  • 中药饮片批发商是什么?其在中药供应链中的意义和作用是什么?
  • 鲜花销售|花店销售|基于java+vue的鲜花销售系统设计与实现(源码+数据库+文档)
  • 什么是h5网站如何在服务器里建设网站
  • 最便宜的低价机票网站建设附近临时工500元一天
  • SHA-256的初始哈希值是怎么规定的?
  • 做视频添加字幕的网站wordpress 获取导航栏
  • 建立网站数据库实验报告徐州设计公司有哪些
  • 专业网站公司本地佛山企业网站建设
  • 网页设计模板素材网站做一个招聘信息的网站 用什么做网站的软件
  • 【Spring Boot】基于MyBatis的条件分页
  • LVS负载均衡群集(二)-- DR模式
  • 做刷题网站赚钱么口碑好的聊城网站建设
  • 外贸网站怎么做关键词网络设计与实施
  • 【Linux驱动开发】Linux 设备驱动中的异步通知与异步 I/O:原理、机制与实战
  • 汕头网站建设报价云南省建设交易中心网站
  • 【QT笔记】常用控件——QWidget 核⼼属性
  • 学校网站怎么建设视频湖南网站建设公司 地址磐石网络
  • 【MySQL】基础
  • 怎么做个手机版的网站吗成全视频免费高清观看在线动漫电影
  • 模仿 网站西宁做网站需要多少钱
  • PHP代码审计框架性思维的建立
  • 惠州个人做网站联系人安卓开发自学教程
  • ASC学习笔记0026:链接动画实例标签
  • termux脚本熄屏后自动杀掉抖音进程
  • 徐州企业网站推广请人做网站买断域名
  • 锦州网站制作公司关于网站项目建设的申请
  • 什么是CSV(周期同步速度模式)和PV(轮廓速度模式)
  • 有些人做网站不用钱的 对吗网页界面设计的特点
  • 从开发到部署:Docker 化前端应用全流程指南
  • 网站开发安全小贴士苏州seo网站推广公司