📝 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
,则DEBUG
和TRACE
不会输出 - 特定 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 配置,极大地提升开发体验 😊!