Spring 原始注解详解与实战指南

embedded/2025/2/26 22:38:52/

📝 1. 前言

在 Spring 框架的发展过程中,注解的引入大大简化了配置,提升了开发效率

本文将详细介绍 Spring 最初引入的核心注解,包括 @Component@Controller@Service@Repository@Autowired@Qualifier@Value 等,结合代码示例演示如何使用这些注解构建一个简单的 Spring 项目


📚 2. Spring 核心原始注解说明表格

注解作用适用场景
@Component标记为 Spring 容器中的 Bean,由 Spring 自动管理通用组件类
@Controller标识控制层组件,处理用户请求MVC 模式中的控制器
@Service标识业务逻辑层组件Service 层实现业务逻辑
@Repository标识数据访问层组件,提供数据库操作异常的转换DAO 层实现数据库访问
@Autowired自动注入 Bean,省去手动实例化属性、构造器、方法注入
@Qualifier指定多个同类型 Bean 中具体要注入的 Bean消除 @Autowired 注入多个 Bean 的歧义
@Value为属性注入配置文件中的值或默认值application.properties 文件读取配置

💻 3. 实战项目:用户信息管理系统

3.1 项目结构

spring-annotation-demo
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.alivinfer
│   │   │       ├── config
│   │   │       │   └── AppConfig.java
│   │   │       ├── controller
│   │   │       │   └── UserController.java
│   │   │       ├── service
│   │   │       │   └── UserService.java
│   │   │       └── dao
│   │   │           └── UserDao.java
│   │   ├── resources
│   │   │   ├── application.properties
│   │   │   └── logback.xml
└── pom.xml

✅ 3.2 代码实现

1) Spring 配置类
java">import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = "com.alivinfer")
public class AppConfig {
}

2) 数据访问层
java">import org.springframework.stereotype.Repository;@Repository
public class UserDao {public String findUserById(int id) {return "User_" + id;}
}

3) 业务逻辑层
java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserDao userDao;public String getUser(int id) {return userDao.findUserById(id);}
}

4) 控制层
java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;@Controller
public class UserController {private static final Logger logger = LoggerFactory.getLogger(UserController.class);@Autowiredprivate UserService userService;public void showUser(int id) {logger.info("调用 showUser 方法,用户ID: {}", userService.getUser(id));logger.debug("这是调试级别的日志信息");System.out.println("执行具体的业务" + userService.getUser(id));}
}

5) 启动类
java">import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {// 创建 Spring 应用程序上下文(使用反射技术)AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取 bean 实例UserController userController = context.getBean(UserController.class);userController.showUser(1);// 关闭应用程序上下文,释放所有资源context.close();}
}

6) logback.xml - 日志配置文件
<configuration><!--定义日志的输出方式为控制台--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--定义日志输出格式--><encoder><!--   %d{yyyy-MM-dd HH:mm:ss}  - 日志输出时间,格式为年-月-日 时:分:秒[%thread]                - 输出日志的线程名称,放在方括号内%-5level                 - 日志级别,左对齐,宽度为5个字符(例如 INFO、DEBUG)%logger{36}              - 打印日志所属的类名,最长36个字符,超出会截断%msg                     - 日志的具体信息%n                       - 换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!--根日志记录器,所有未被特定 <logger> 匹配的日志都会使用此配置--><root level="INFO"><appender-ref ref="CONSOLE" /></root><!--针对特定包或类设置日志级别,优先级高于 <root>--><!--additivity="false":关闭日志向上级传播,避免重复输出--><logger name="com.alivinfer" level="DEBUG" additivity="false"><appender-ref ref="CONSOLE" /></logger>
</configuration>
🔥 日志级别优先级
TRACE < DEBUG < INFO < WARN < ERROR
  • 日志级别设置为 INFO,则 DEBUGTRACE 不会输出
  • 特定 logger 可以单独设置更低的日志级别,例如 DEBUG

✅ 3.3 Maven 依赖

 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.14</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.16</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.5.16</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.16</version></dependency>
</dependencies>

🧩 4. 执行结果

2025-02-25 22:58:06 [main] INFO  c.a.controller.UserController - 这是 INFO 级别的日志信息
2025-02-25 22:58:06 [main] DEBUG c.a.controller.UserController - 这是 DEBUG 级别的日志信息
执行具体的业务: User_1

🕶️ 5. 总结

Spring 原始注解@Component@Controller@Service@Repository@Autowired 等,使得开发更加高效、可读性更强。通过这些注解,我们可以实现组件自动扫描、依赖注入和配置管理,减少繁琐的 XML 配置,极大地提升开发体验 😊!


http://www.ppmy.cn/embedded/167376.html

相关文章

Halcon 3D加快表面匹配速度

文章目录 gen_box_object_model_3d 创建一个代表盒子的 3D 物体模型write_surface_model — 将表面模型写入文件read_surface_model — 将表面模型读取prepare_object_model_3d - 为某个操作准备三维对象模型select_points_object_model_3d - 对 3D 物体模型的属性应用阈值。se…

蓝桥杯之阶段考核

&#x1f4d6; Day 7&#xff1a;阶段考核 - 蓝桥杯官方模拟赛&#xff08;限时 4 小时&#xff09; &#x1f4d6; 一、如何高效完成模拟赛&#xff1f; 模拟赛是一种接近真实竞赛的训练方式。要高效完成模拟赛&#xff0c;需要掌握以下策略&#xff1a; 1. 赛前准备 ✅ 环…

蓝桥杯试题:小明的彩灯(差分 前缀和)

一、题目描述 小明拥有 N 个彩灯&#xff0c;第 ii个彩灯的初始亮度为 ai​。 小明将进行 Q次操作&#xff0c;每次操作可选择一段区间&#xff0c;并使区间内彩灯的亮度 x&#xff08;x 可能为负数&#xff09;。 求 QQ次操作后每个彩灯的亮度&#xff08;若彩灯亮度为负数…

如何使用 Python 连接 MySQL 数据库?

在Python开发中&#xff0c;连接MySQL数据库是一个常见的需求。 我们可以使用多种库来实现这一功能&#xff0c;其中最常用的是mysql-connector-python和PyMySQL。 下面我将详细介绍如何使用这两个库来连接MySQL数据库&#xff0c;并提供一些实际开发中的建议和注意事项。 1…

GB 44496-2024《汽车软件升级通用技术要求》标准解读|标准结构、测试方法、测试内容

2024年08月23日&#xff0c;我国工业和信息化部发布了GB 44496-2024《汽车软件升级通用技术要求》&#xff0c;该标准将于2026年01月01日起实施。该标准是一项强制性国家标准&#xff0c;适用于M类、N类和O类汽车。自该项标准实施之日起&#xff0c;所有需要申请道路机动车辆产…

git基本用法

原理图&#xff1a; 显示工作目录和暂存区的状态。 git status 三种状态&#xff1a;已提交&#xff08;committed&#xff09;、已修改&#xff08;modified&#xff09; 和 已暂存&#xff08;staged&#xff09; 配置 git config --global user.name "Your Name&qu…

C语言番外篇(4)--------->goto语句

在C语言中&#xff0c;有一个很特殊的语法&#xff0c;这就是goto语句。goto用于实现同一函数的跳转&#xff0c;goto后面会有一个标志&#xff0c;执行goto语句时&#xff0c;就会跳转到标志的位置。 一、goto语句的语法 &#xff08;1&#xff09;goto在前&#xff0c;标志…

【深度学习神经网络学习笔记(二)】神经网络基础

神经网络基础 神经网络基础前言1、Logistic 回归2、逻辑回归损失函数3、梯度下降算法4、导数5、导数计算图6、链式法则7、逻辑回归的梯度下降 神经网络基础 前言 Logistic 回归是一种广泛应用于统计学和机器学习领域的广义线性回归模型&#xff0c;主要用于解决二分类问题。尽…