Spring 注解

Spring 注解是 Spring 框架中用于简化配置、实现依赖注入(DI)和控制反转(IoC)的核心机制。通过注解,开发者可以直接在 Java 类或方法上声明 Bean、依赖关系、事务管理等功能,无需依赖 XML 配置。以下是 Spring 中常用注解的详细介绍:


一、核心注解

1. @Component
  • 作用:标记一个类为 Spring Bean,由 Spring 容器管理。
  • 衍生注解
    • @Service:标注业务层组件(Service)。
    • @Repository:标注数据访问层组件(DAO)。
    • @Controller:标注 Web 层控制器(如 Spring MVC 的 Controller)。
  • 示例
    @Service
    public class UserService { ... }
    
2. @Autowired
  • 作用:自动注入依赖(按类型匹配)。
  • 特性
    • 默认按类型(byType)注入,如果存在多个同类型 Bean,再按名称(byName)匹配。
    • 可标注在字段、构造器、Setter 方法上。
  • 示例
    @Autowired
    private UserRepository userRepository;
    
3. @Resource
  • 作用:自动注入依赖(按名称匹配)。
  • 特性
    • 由 JSR-250 规范定义,需引入 javax.annotation 依赖。
    • 优先按名称(byName)匹配,找不到则按类型匹配。
  • 示例
    @Resource(name = "orderService")
    private OrderService orderService;
    
4. @Qualifier
  • 作用:与 @Autowired 配合使用,显式指定注入的 Bean 名称。
  • 示例
    @Autowired
    @Qualifier("mysqlDataSource")
    private DataSource dataSource;
    

二、配置类相关注解

1. @Configuration
  • 作用:标记一个类为配置类(替代 XML 配置文件)。
  • 特性
    • 类中可以定义 @Bean 方法,由 Spring 容器执行这些方法生成 Bean。
  • 示例
    @Configuration
    public class AppConfig {
        @Bean
        public DataSource dataSource() {
            return new HikariDataSource();
        }
    }
    
2. @Bean
  • 作用:标注一个方法,该方法返回的对象将被注册为 Spring Bean。
  • 示例
    @Configuration
    public class DatabaseConfig {
        @Bean
        public JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    
3. @ComponentScan
  • 作用:指定 Spring 自动扫描的包路径,用于发现 @Component@Service 等注解的类。
  • 属性
    • basePackages:指定要扫描的包。
  • 示例
    @Configuration
    @ComponentScan(basePackages = "com.example.service")
    public class AppConfig { ... }
    

三、AOP 相关注解

1. @Aspect
  • 作用:标记一个类为切面类。
  • 示例
    @Aspect
    @Component
    public class LoggingAspect {
        // 定义切点和通知
    }
    
2. @Before@After@Around
  • 作用:定义切面的通知类型(前置、后置、环绕通知)。
  • 示例
    @Aspect
    @Component
    public class LoggingAspect {
        @Before("execution(* com.example.service.*.*(..))")
        public void logBefore() {
            System.out.println("方法执行前记录日志");
        }
    }
    

四、事务管理注解

@Transactional
  • 作用:声明事务性方法,由 Spring 管理事务。
  • 属性
    • propagation:事务传播行为(默认 REQUIRED)。
    • isolation:事务隔离级别。
    • readOnly:是否为只读事务。
  • 示例
    @Service
    public class OrderService {
        @Transactional
        public void createOrder(Order order) {
            // 数据库操作
        }
    }
    

五、其他常用注解

1. @Value
  • 作用:注入配置文件中的属性值或静态常量。
  • 示例
    @Value("${app.name}")
    private String appName;
    
2. @Scope
  • 作用:定义 Bean 的作用域(如 singletonprototype)。
  • 示例
    @Component
    @Scope("prototype")
    public class PrototypeBean { ... }
    
3. @PostConstruct@PreDestroy
  • 作用
    • @PostConstruct:Bean 初始化后执行的方法。
    • @PreDestroy:Bean 销毁前执行的方法。
  • 示例
    @Component
    public class DatabaseService {
        @PostConstruct
        public void init() {
            // 初始化连接池
        }
    
        @PreDestroy
        public void destroy() {
            // 关闭连接池
        }
    }
    

六、启用注解配置

在 Spring Boot 中,注解默认启用,无需额外配置。在传统 Spring 项目中,需通过 XML 或 Java Config 启用注解支持:

1. XML 配置
<context:component-scan base-package="com.example"/>
<context:annotation-config/>
2. Java Config
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig { ... }

七、注解 vs XML

特性 注解 XML
配置位置 直接写在代码中 独立 XML 文件
可维护性 代码即配置,直观 配置与代码分离,集中管理
灵活性 修改需重新编译代码 动态修改 XML 无需重新编译
类型安全 编译时检查 运行时解析

八、最佳实践

  1. 优先使用注解:减少 XML 配置,提高开发效率。
  2. 合理选择作用域:默认 singleton,非线程安全对象用 prototype
  3. 避免过度依赖 @Autowired:在构造器注入时优先使用 @RequiredArgsConstructor(Lombok)。
  4. 慎用 @Value:敏感配置(如密码)建议通过环境变量或加密方式注入。

通过合理使用 Spring 注解,可以显著简化配置、提升代码可读性,是现代 Spring 开发的核心技能。

你可能感兴趣的:(后端技术,spring,java,后端)