注解(Annotation)

ops/2025/2/4 7:50:04/

注解(Annotation)在 Java 中可以用来简化类的使用,使得被注解的类能够被自动发现、自动创建并在需要的地方直接调用,而不需要手动创建实例。具体来说,注解是用来标识类、方法、字段等的,它们通常与一些框架或工具结合使用(如 Spring、MyBatis 等),让程序更加简洁和灵活。

1. 注解的作用

注解本身不会改变程序的执行逻辑,但它们提供了一种元数据,使得框架或工具能够根据这些元数据做出不同的处理。例如,Spring 使用注解来标识 Spring 管理的 Bean、自动注入依赖、定义事务等。

2. Spring 框架中的注解:

在 Spring 中,注解的使用使得类可以自动被扫描和管理,避免了我们手动创建对象。例如,使用 @Service@Component@Repository@Controller 注解时,Spring 会自动将这些类注册为 Spring 容器中的 Bean,后续可以通过依赖注入的方式直接使用这些类。

示例:使用注解自动注入 Bean
java">import org.springframework.stereotype.Service;@Service // 让 Spring 自动管理这个类的实例
public class MyService {public void performAction() {System.out.println("Action performed!");}
}
java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyController {@Autowired // 自动注入 MyService 的实例private MyService myService;public void executeAction() {myService.performAction(); // 使用自动注入的 MyService 实例}
}

3. 解释

  • @Service 注解:告诉 Spring 该类是一个服务类,Spring 会自动将其注册为一个 Bean。这样你不需要手动创建 MyService 类的实例,Spring 会自动管理它的生命周期。

  • @Autowired 注解:告诉 Spring 自动注入 MyService 的实例到 MyController 类中。Spring 会根据类型自动找到合适的 Bean(即 MyService)并将其注入到 myService 字段中。

通过这种方式,你不需要手动创建 MyServiceMyController 实例,Spring 会自动完成这项工作。

4. 依赖注入(DI)

Spring 使用注解来实现 依赖注入,即通过注解标记的类和字段,Spring 会自动进行类的实例化和注入。通过 @Autowired 注解,Spring 自动将相关依赖注入到目标类中,消除了手动创建和传递对象的繁琐步骤。

5. MyBatis 中的注解:

在 MyBatis 中,注解也用于简化 SQL 映射过程。例如,使用 @Select@Insert 等注解,可以直接在接口方法中执行 SQL,而不需要写 XML 文件。

示例:MyBatis 中使用注解
java">import org.apache.ibatis.annotations.Select;public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User getUserById(Long id);
}

在上面的例子中,@Select 注解使得 getUserById 方法不需要在 XML 映射文件中定义 SQL,直接通过注解执行 SQL。

在 Java 和常见的框架(如 Spring、MyBatis 等)中,注解是用来提供元数据并使得框架能够执行相应操作的。以下是一些常用的注解,按框架和用途分类。

1. Java 常用注解

这些是 Java 核心库中提供的常见注解。

  • @Override:用于标识方法重写。编译器会检查方法是否正确地重写了父类的方法。

    java">@Override
    public String toString() {return "Custom String";
    }
    
  • @Deprecated:标记已废弃的类或方法,表示该类或方法不再推荐使用,并可能在将来版本中删除。

    java">@Deprecated
    public void oldMethod() {// 不推荐使用
    }
    
  • @SuppressWarnings:用于抑制编译器警告。

    java">@SuppressWarnings("unchecked")
    public void someMethod() {List<String> list = new ArrayList();
    }
    
  • @FunctionalInterface:用于标识接口是一个函数式接口,即只包含一个抽象方法的接口。

    java">@FunctionalInterface
    public interface MyFunctionalInterface {void performAction();
    }
    

2. Spring 常用注解

Spring 框架提供了大量注解,用于依赖注入、声明式事务、事件监听等。

  • @Component:将类标记为 Spring 的 Bean,Spring 会自动扫描并创建该类的实例。所有的组件(@Controller@Service@Repository)本质上都是 @Component

    java">@Component
    public class MyComponent {// Class implementation
    }
    
  • @Service:标记一个服务类,通常用于标记业务层的类。

    java">@Service
    public class MyService {// Service implementation
    }
    
  • @Controller:标记控制器类,通常用于 Web 层,处理请求和响应。

    java">@Controller
    public class MyController {// Controller implementation
    }
    
  • @RestController:是 @Controller@ResponseBody 的组合,表示这是一个 RESTful 风格的控制器,直接返回 JSON 数据。

    java">@RestController
    public class MyRestController {@GetMapping("/data")public Map<String, String> getData() {return Collections.singletonMap("message", "Hello, world!");}
    }
    
  • @Autowired:自动注入 Bean,用于在类的字段、构造函数或方法中自动注入所需的依赖。

    java">@Autowired
    private MyService myService;
    
  • @Value:注入外部配置文件中的值,如 application.propertiesapplication.yml 中的配置。

    java">@Value("${app.name}")
    private String appName;
    
  • @RequestMapping:定义 HTTP 请求与控制器方法的映射,通常用于定义 RESTful API 的 URL 路径。

    java">@RequestMapping("/home")
    public String home() {return "Welcome Home!";
    }
    
  • @PostMapping, @GetMapping, @PutMapping, @DeleteMapping:用于简化 HTTP 请求方法的映射。

    java">@PostMapping("/submit")
    public ResponseEntity<String> submitData(@RequestBody MyData data) {return ResponseEntity.ok("Data submitted successfully!");
    }
    
  • @Transactional:声明事务管理,确保操作的一致性。常用于数据库操作。

    java">@Transactional
    public void performTransaction() {// Transactional operations
    }
    

3. MyBatis 常用注解

MyBatis 提供了一些注解,用于替代 XML 映射文件来执行 SQL 操作。

  • @Mapper:标记一个接口为 MyBatis 的 Mapper 接口,Spring Boot 会自动扫描并注册该接口。

    java">@Mapper
    public interface UserMapper {User getUserById(Long id);
    }
    
  • @Select:指定查询 SQL,通常用于单一查询操作。

    java">@Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);
    
  • @Insert:指定插入操作。

    java">@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    void insertUser(User user);
    
  • @Update:指定更新操作。

    java">@Update("UPDATE users SET name = #{name} WHERE id = #{id}")
    void updateUser(User user);
    
  • @Delete:指定删除操作。

    java">@Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(Long id);
    
  • @Results:用于指定复杂查询时的映射结果。

    java">@Select("SELECT * FROM user WHERE id = #{id}")
    @Results({@Result(property = "name", column = "username"),@Result(property = "age", column = "user_age")
    })
    User getUserById(Long id);
    

4. JavaEE 常用注解

  • @Entity:标记一个类为实体类,用于 ORM 映射。

    java">@Entity
    @Table(name = "users")
    public class User {@Idprivate Long id;private String name;
    }
    
  • @Id:标记主键字段。

    java">@Id
    private Long id;
    
  • @GeneratedValue:用于标记主键的生成策略。

    java">@GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
  • @Column:用于指定实体类属性与数据库列的映射关系。

    java">@Column(name = "username")
    private String name;
    

5. JUnit 常用注解

JUnit 是 Java 的单元测试框架,常用注解如下:

  • @Test:标记一个方法为测试方法。

    java">@Test
    public void testAddition() {assertEquals(5, 2 + 3);
    }
    
  • @Before@After:在每个测试方法执行前后执行的操作。

    java">@Before
    public void setUp() {// setup code before each test
    }@After
    public void tearDown() {// cleanup code after each test
    }
    
  • @BeforeClass@AfterClass:在所有测试方法执行前后执行的操作(静态方法)。

    java">@BeforeClass
    public static void setUpBeforeClass() {// setup code before all tests
    }@AfterClass
    public static void tearDownAfterClass() {// cleanup code after all tests
    }
    

http://www.ppmy.cn/ops/155514.html

相关文章

各种CNN 卷积特征图可视化理解方法(链接)

1.链接一 C/DNN Explainer CNN Explainerhttps://poloclub.github.io/cnn-explainer/ 2.Scaling Deep Learning Interpretability by Visualizing Activation and Attribution Summit: Scaling Deep Learning Interpretability by Visualizing Activation and Attribution Sum…

分层多维度应急管理系统的设计

一、系统总体架构设计 1. 六层体系架构 #mermaid-svg-QOXtM1MnbrwUopPb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QOXtM1MnbrwUopPb .error-icon{fill:#552222;}#mermaid-svg-QOXtM1MnbrwUopPb .error-text{f…

为什么就Kafka有分区?

引言 消息队列很多&#xff0c;RocketMQ RabbitMQ ActiveMQ 多数是BrokerQuene的策略&#xff0c;本篇文章详细分析Kafka的分区技术选型的意义和作用 并发处理能力 并行处理消息&#xff1a;分区允许 Kafka 在多个分区上并行处理消息。不同的分区可以分布在不同的 Broker 节…

【数据结构】并查集

1.基本操作 void makeset(){ for(int i1;i<n;i)fa[i]i; }int findd(int x){ while(fa[x]!x)xfa[x]fa[fa[x]]; return x; }void unionn(int x,int y){ int zxfindd(x);int zyfindd(y); if(zx!zy)fa[zy]zx; }2.种类并查集 Parity Game 关押罪犯 [NOIP 2010 提高组] 关押罪…

【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解

一、SIB33信令概述 在5G非地面网络&#xff08;NTN&#xff09;中&#xff0c;卫星的高速移动性和广域覆盖特性使得地面设备&#xff08;UE&#xff09;需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息&#xff0c;SystemInformationBlockType33&#x…

力扣经典题目之14. 最长公共前缀

今天继续给大家分享一道力扣的做题心得今天这道题目是14. 最长公共前缀 - 力扣&#xff08;LeetCode&#xff09; 题目如下 1&#xff0c;题目分析 题目给出了一个字符串数组&#xff0c;我们需要找出这个数组中所有字符串元素的最长的公共前缀字符&#xff0c;公共前缀和即为…

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…

第四章 基于本地部署的大语言模型OLlamaNeo4j图数据库的知识图谱搭建

目录 一、部署本地大语言模型Ollama 二、安装Neo4j数据库 三、应用本地大语言模型搭建知识图谱 1、导入依赖库 2、连接数据库 3、加载CSV文档 4、初始化&#xff08;载入&#xff09;大模型 5、编写实体关系识别函数 6、处理文档生成知识图谱 7、将大模型识别出的关系…