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。



