0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

对Spring中常用注解的原理进行剖析

冬至子 来源:good7ob 作者:good7ob 2023-06-06 16:11 次阅读

Spring 框架作为 Java 领域广泛使用的企业级框架,凭借其简洁优雅的编程方式,以及丰富的功能和生态,一直备受开发者们的喜爱。

在 Spring 框架中,注解是实现代码简洁、模块化、可配置的关键技术之一。

本文将对 Spring 中常用注解的原理进行剖析,并通过实际案例展示如何使用这些注解。

一、注解原理简介

  • 在 Java 编程中,注解是一种元数据,用于向编译器和运行时环境提供额外的信息
  • Spring 框架利用 Java 的注解机制,实现了依赖注入(DI)、面向切面编程(AOP)、声明式事务管理等功能,大大简化了 Java 企业级应用的开发。
  • 在 Spring 中,注解的原理主要涉及到三个方面:
  1. 注解定义:通过 Java 提供的 @interface 语法定义注解。
  2. 注解使用:将定义好的注解应用到类、方法、字段等地方。
  3. 注解解析:通过反射机制,在运行时读取注解的信息,并根据注解的定义来执行相应的逻辑。

接下来,我们将针对 Spring 中常用的几个注解,详细剖析其原理。

二、常用注解剖析

1,@Component

@Component 注解是 Spring 中用于标识一个类作为组件的注解,这意味着 Spring 容器会自动扫描到这个类,并将其实例化为一个 Bean。

@Component 注解是 @Service@Controller@Repository 注解的基础注解。

原理剖析

  • 当 Spring 容器启动时,会通过 ClassPathScanningCandidateComponentProvider 类扫描类路径下的所有类,然后检查这些类上是否有 @Component 注解。
  • 如果有,Spring 容器会将这个类实例化为一个 Bean,并加入到 IoC 容器中。

实际案例

@Component
public class UserService {
   //...
}

上述代码中,UserService 类被标记为一个组件,Spring 容器会自动创建并管理一个 UserService 的实例。

2,@Autowired

@Autowired 注解用于自动装配 Bean 之间的依赖关系。它可以应用在字段、构造方法和普通方法上。

原理剖析

  • Spring 容器在创建 Bean 实例后,会通过 AutowiredAnnotationBeanPostProcessor 类处理 @Autowired 注解。
  • 具体而言,它会查找与被注解字段或方法参数类型匹配的 Bean,并自动注入相应的依赖。

实际案例

@Component
public class UserController {
   private UserService userService;
   @Autowired
   public UserController(UserService userService) {
       this.userService = userService;
  }
}

上述代码中,UserController 中的 userService 字段被 @Autowired 注解修饰,Spring 容器会自动注入一个 UserService 的实例。

3,@RequestMapping

@RequestMapping 注解用于将 HTTP 请求映射到控制器的处理方法上。它可以应用在类和方法上,用于处理不同的 URL 请求。

原理剖析

  • Spring 容器在启动时,会扫描所有标注有 @Controller 注解的类,并解析其中所有的 @RequestMapping 注解。
  • 当接收到一个 HTTP 请求时,Spring 容器会根据请求的 URL 和请求方法,找到对应的处理方法,并执行相应的业务逻辑。

实际案例

@Controller
@RequestMapping("/user")
public class UserController {
   @RequestMapping("/login")
   public String login() {
       //...
  }
}

上述代码中,UserController 类被标注为一个控制器,@RequestMapping 注解指定了 /user 路径。login() 方法被 @RequestMapping 注解修饰,用于处理 /user/login 的请求。

4,@Transactional

@Transactional 注解用于声明式事务管理,它可以应用在类和方法上。

当一个方法被标记为 @Transactional 注解时,Spring 容器会在方法执行前开启一个事务,并在方法执行后根据执行结果提交或回滚事务。

原理剖析

Spring 的事务管理是基于 AOP 技术实现的。当一个类或方法被标记为 @Transactional 注解时,Spring 容器会通过 TransactionInterceptor 类生成一个代理对象,将事务逻辑织入到代理对象的方法中。

实际案例

@Service
public class UserService {
   @Autowired
   private UserDao userDao;
   @Transactional
   public void updateUser(User user) {
       userDao.updateUser(user);
  }
}

上述代码中,UserService 类中的 updateUser() 方法被 @Transactional 注解修饰,Spring 容器会在方法执行前开启一个事务,并在方法执行后根据执行结果提交或回滚事务。

三、注解的优点

注解作为一种元数据,具有以下优点:

  1. 简化配置:注解可以将配置信息直接写在代码中,而不需要繁琐的 XML 配置或属性文件配置。
  2. 可读性强:注解将元数据直接写在代码中,使得代码更加易读、易懂。
  3. 可重用性强:通过注解,可以将相同的元数据应用于不同的类、方法或字段,提高了代码的可重用性。
  4. 面向切面编程:注解在 AOP 中发挥了重要作用,可以方便地将切面逻辑织入到方法中,从而实现面向切面编程。

四、总结

  • 本文针对 Spring 框架中常用的几个注解进行了原理剖析,并通过实际案例展示了如何使用这些注解。
  • 注解作为一种元数据,具有简化配置、可读性强、可重用性强、面向切面编程等优点,是 Java 开发中不可或缺的一部分。
  • 在实际开发中,合理使用注解可以让代码更加简洁、易读、易维护。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16136

    浏览量

    177157
  • JAVA
    +关注

    关注

    19

    文章

    2952

    浏览量

    104496
  • URL
    URL
    +关注

    关注

    0

    文章

    139

    浏览量

    15299
  • AOP
    AOP
    +关注

    关注

    0

    文章

    40

    浏览量

    11085
  • XML技术
    +关注

    关注

    0

    文章

    15

    浏览量

    6008
收藏 人收藏

    评论

    相关推荐

    Spring Boot如何实现异步任务

    ,用来告诉 Spring 这个方法是一个异步方法,Spring 会将这个方法的执行放在异步线程中进行。使用 @Async 注解需要满足以下条件: 需要在
    的头像 发表于 09-30 10:32 1385次阅读

    使用Spring自定义注解的实现

    执行器。其本质就是通过外部参数进行一次路由和Spring mvc做的事情类似。简单看了Spring mvc的实现原理之后,决定使用自定义注解的方式来实现以上功能。 自定义TaskHan
    发表于 09-28 11:55 0次下载

    Spring应用 1 springXML配置说明

    开发过程。会使用注解形式的开发模式。但使用相应的注解需要spring.xml中定义相应的BeanProcessor,这样显得很笨重。 使用@Autowired注解,必须事先在
    发表于 01-13 12:20 380次阅读

    Spring Boot常用注解与使用方式

    企业开发项目SpringBoot已经是必备框架了,其中注解是开发中的小工具(谁处可见哦),用好了开发效率大大提升,当然用错了也会引入缺陷。
    的头像 发表于 07-08 10:57 1331次阅读

    浅谈Spring事务底层原理

    开启Spring事务本质上就是增加了一个Advisor,但我们使用@EnableTransactionManagement注解来开启Spring事务是,该注解代理的功能就是向
    的头像 发表于 12-06 09:56 668次阅读

    Spring Web MVC注解

    RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射。Spring MVC和Spring WebFlux都通过`RquestMappingHandler
    的头像 发表于 04-07 11:32 571次阅读
    <b class='flag-5'>Spring</b> Web MVC<b class='flag-5'>注解</b>

    Spring Bean相关的4个注解及使用方法

    ComponentScan`注解用于配置Spring需要扫描的被组件注解注释的类所在的包。可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名。此
    的头像 发表于 04-07 11:33 1306次阅读
    <b class='flag-5'>Spring</b> Bean相关的4个<b class='flag-5'>注解</b>及使用方法

    Spring Dependency Inject与Bean Scops注解

    DependsOn`注解可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象。下面是此注解使用示例代码:
    的头像 发表于 04-07 11:35 648次阅读
    <b class='flag-5'>Spring</b> Dependency Inject与Bean Scops<b class='flag-5'>注解</b>

    容器配置及Spring Boot注解

    Autowired注解用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数、字段和setter方法上。
    的头像 发表于 04-07 11:45 548次阅读
    容器配置及<b class='flag-5'>Spring</b> Boot<b class='flag-5'>注解</b>

    Spring中@Component注解是怎么实现的

    想必`@Component`注解大家一直在使用,只要类上加上它,就可以被Spring容器管理,那大家有想过它是怎么实现的吗?本篇文章就带领到家揭秘。
    的头像 发表于 04-07 15:23 1522次阅读
    <b class='flag-5'>Spring</b>中@Component<b class='flag-5'>注解</b>是怎么实现的

    JAVA中注解是怎么做到的(上)

    注解想必大家在项目中经常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本
    的头像 发表于 05-11 10:57 614次阅读

    JAVA中注解是怎么做到的(下)

    注解想必大家在项目中经常使用,比如Spring框架中常用的一些注解:`@Controller`、`@Service`、`@RequestMapping`等等,它是JDK1.5及以后版本
    的头像 发表于 05-11 10:57 541次阅读
    JAVA中<b class='flag-5'>注解</b>是怎么做到的(下)

    springmvc常用5种注解

    SpringMVC是一种基于Java的Web框架,使用注解可以更加方便灵活地开发和管理控制器,实现请求的映射和处理。在SpringMVC中,有许多常用注解,本文将详细介绍其中的五种注解
    的头像 发表于 11-22 16:51 779次阅读

    springboot核心注解

    Spring Boot 是基于 Spring 框架的开源框架,它可以帮助开发者快速构建、部署和运行独立的、生产级的 Spring 应用程序。Spring Boot 提供了一系列核心
    的头像 发表于 11-23 09:23 483次阅读

    SpringBoot核心注解由几个注解组成

    Spring Boot 是一个开源的 JavaEE 开发框架,它以简化 Spring 框架的配置与开发为目标,旨在让开发者能快速构建独立、生产级别的应用程序。Spring Boot 提供了大量用于
    的头像 发表于 12-03 15:09 690次阅读