当前位置: 首页 > article >正文

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

📝 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 配置类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.alivinfer")
public class AppConfig {
}

2) 数据访问层
import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
    public String findUserById(int id) {
        return "User_" + id;
    }
}

3) 业务逻辑层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public String getUser(int id) {
        return userDao.findUserById(id);
    }
}

4) 控制层
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);

    @Autowired
    private UserService userService;

    public void showUser(int id) {
        logger.info("调用 showUser 方法,用户ID: {}", userService.getUser(id));
        logger.debug("这是调试级别的日志信息");
        System.out.println("执行具体的业务" + userService.getUser(id));
    }
}

5) 启动类
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.kler.cn/a/562274.html

相关文章:

  • VC++零基础入门之系列教程 【附录E MFC快速参考指南】
  • QT C++ QtConcurrent::run 异步任务 简单例子
  • Vue2+OpenLayers实现右键菜单功能(提供Gitee源码)
  • [深度学习]基于C++和onnxruntime部署yolov12的onnx模型
  • 全星FMEA软件系统是一款高效、智能的失效模式及影响分析工具,广泛应用于汽车、电子、机械等行业
  • 【论文带读(1)】《End-to-End Object Detection with Transformers》论文超详细带读 + 翻译
  • 什么是 OCP 数据库专家
  • 从头再来!社招找工作——算法题复习九:动态规划
  • 嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)
  • Linux与自动化的基础
  • 月之暗面改进并开源了 Muon 优化算法,对行业有哪些影响?
  • python 虚拟机的使用方式
  • 视频字幕识别和翻译
  • IP------PPP协议
  • FFMpegCore:.NET 中进行音视频处理解决方案
  • 快速入门——状态管理VueX
  • 数据安全_笔记系列07:数据泄露防护(DLP)(监控与阻断敏感数据外泄)深度解析
  • 【算法】滑动窗口(下)
  • 手撕FocalLoss
  • 【Android】类加载器热修复-随记