Spring的常用注解

Spring的常用注解
介绍我们知道Spring生态圈或者说全家桶非常的好用其中注解贯彻其中下面我来简单归纳一下Spring的常用注解。Bean管理相关Component万能通用组件当你给一个普通的 Java 类加上Component注解后Spring 在启动时会通过组件扫描机制ComponentScan自动发现它利用反射机制在内存中把它new出来并作为一个 Bean 存放到 IoC 容器中。以下是其三个特化的形式理论上可以互相替换但不建议要保持新人友好原则嘛。ServiceService用在业务逻辑层Service 层。RepositoryRepository用在数据访问层DAO 层自带数据库异常转换功能。ControllerController用在 Web 控制层处理 HTTP 请求。注入依赖方面AutowiredAutowiredSpring 提供的自动装配注解默认按类型byType注入。如果同类型有多个 Bean会报错。底层注入逻辑Autowired 的自动装配并非魔法而是基于 Spring 的依赖注入机制和 Java 反射技术实现的。其核心流程主要依赖一个关键的后置处理器AutowiredAnnotationBeanPostProcessor。具体过程如下1.扫描与元数据封装当 Spring 容器启动并创建 Bean 时AutowiredAnnotationBeanPostProcessor 会扫描当前类中所有带有 Autowired 注解的字段、方法或构造函数。它会将这些注入点的信息如类型、名称等封装成 InjectionMetadata 对象并缓存起来。2.属性填充注入阶段在 Bean 实例化之后、初始化之前Spring 会调用该后置处理器的 postProcessProperties 方法。它会遍历之前缓存的 InjectionMetadata通过反射机制在 Spring 的 IoC 容器中查找匹配的 Bean然后将其赋值给目标字段或作为参数传入方法中。为何同类型多个注入会报错Autowired 默认的装配策略是 按类型自动装配byType。当容器中存在多个相同类型的 Bean 时就会触发以下逻辑1.按类型查找Spring 首先根据字段或参数的类型去容器中查找。如果只找到一个直接注入如果找不到且 requiredtrue默认值则抛出 NoSuchBeanDefinitionException 异常。2.按名称消歧byName如果找到了多个同类型的 BeanSpring 会尝试将注入点的变量名作为 Bean 的名称去进一步匹配。例如如果你写的是 Autowired private UserService userService1;Spring 会尝试在多个同类型 Bean 中寻找名为 userService1 的那个。3.抛出异常如果变量名也无法匹配到唯一的 BeanSpring 就会陷入“不知道该注入哪一个”的困境从而抛出 NoUniqueBeanDefinitionException 异常。4.如何解决多个同类型 Bean 的冲突下面介绍的Qualifier可以用来解决这个问题QualifierQualifier配合Autowired使用当有多个同类型 Bean 时指定按名称byName注入具体的 Bean。ResourceResourceJava 原生标准注解非 Spring 独有默认按名称byName注入找不到名称再按类型注入不需要配合 Qualifier。一句话总结Autowired和Resource的用法区别Autowired 是 Spring 的亲儿子按类型找找不到再按名字找Resource 是 Java 的干儿子按名字找找不到再按类型找。在实际开发中优先使用 Autowired 进行构造函数注入需要按名称注入时再用 Resource。配置相关注解ConfigurationConfiguration声明一个类为配置类用来替代传统的 XML 配置文件里面通常配合 Bean 使用。PropertySource注解会告诉Spring从指定的类路径下加载jdbc.properties这个文件BeanBean注解的作用是告诉Spring这个方法的返回值是一个需要交给Spring容器管理的Bean对象Spring容器会自动调用这个方法把方法返回的对象创建出来存入IOC容器中。就比如以下两个方法是第三方的不是我写的但是我可以用Bean把他们的返回值注入到IOC容器中让它帮我创建。ValueValue用于注入配置文件中的基本数据类型或字符串属性值如 Value(${app.name})。如果数据量小的情况不用ConfigurationProperties适合批量注入的情况的情况下我们用Value和Configuration来配合注入文件。PropertySource将配置文件如 application.yml中的属性批量绑定到一个 Java 对象上比 Value 更适合管理大量配置。PropertySource和Value配合使用PropertySource 注解本身是直接标注在类上生效的它的作用就是加载指定的外部配置文件这里就是 jdbc.properties让配置文件中的属性能够被 Spring 容器识别后续才能通过 Value 注入属性值。PropertySource 负责做第一步指定要加载哪个外部properties配置文件Value 负责做第二步把配置文件中对应key的属性值注入到成员变量中。PropertySource 配合 Value 确实比硬编码写数据库连接信息要方便很多而如果要比一个个写 Value 更便捷的方式可以用 Spring Boot 提供的 ConfigurationProperties 批量注入属性这里讲的是基础注解不多赘述。

最新新闻

日新闻

周新闻

月新闻