📘 Spring 注解配置完全指南(随用随查)

总览

一、定义 Bean 相关注解

1. @Component / @Controller / @Service / @Repository

✅ 应用场景
  • @Component:通用注解,用于任何 Spring 管理的 Bean
  • @Controller:标注在控制层(Spring MVC)类上
  • @Service:标注在业务层类上
  • @Repository:标注在持久层(DAO)类上,自带异常转换功能
✅ 使用方法
@Component
public class CommonBean {}

@Controller
public class UserController {}

@Service
public class UserService {}

@Repository
public class UserDao {}
✅ 替代的 XML 配置
<bean id="userController" class="com.example.UserController"/>
<bean id="userService" class="com.example.UserService"/>
<bean id="userDao" class="com.example.UserDao"/>

2. @ComponentScan

✅ 应用场景
  • 配置 Spring 自动扫描的包路径,让注解生效
✅ 使用方法
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}

或在 Spring Boot 启动类上:

@SpringBootApplication // 内含 @ComponentScan
public class Application {}
✅ 替代的 XML 配置
<context:component-scan base-package="com.example"/>

二、依赖注入相关注解

1. @Autowired

✅ 应用场景
  • 自动装配 Bean,默认按类型注入
✅ 使用方法
@Component
public class UserService {
    
    @Autowired  // 字段注入
    private UserDao userDao;
    
    @Autowired  // 构造器注入(推荐)
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
    
    @Autowired  // Setter注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
✅ 替代的 XML 配置
<!-- setter注入 -->
<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

<!-- 构造器注入 -->
<bean id="userService" class="com.example.UserService">
    <constructor-arg ref="userDao"/>
</bean>

<!-- 自动装配 -->
<bean id="userService" class="com.example.UserService" autowire="byType"/>

2. @Qualifier

✅ 应用场景
  • 当同一类型有多个 Bean 时,配合 @Autowired 指定具体注入哪个 Bean
✅ 使用方法
@Component
public class UserService {
    
    @Autowired
    @Qualifier("userDaoImpl")  // 指定注入 id 为 userDaoImpl 的 Bean
    private UserDao userDao;
}
✅ 替代的 XML 配置
<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDaoImpl"/>  <!-- ref 指定具体 Bean -->
</bean>

3. @Value

✅ 应用场景
  • 注入简单类型值(字符串、基本类型),通常用于读取配置文件
✅ 使用方法
@Component
public class JdbcConfig {
    
    @Value("${jdbc.url}")      // 读取 properties 文件
    private String url;
    
    @Value("3306")              // 直接赋值
    private int port;
    
    @Value("#{systemProperties['user.home']}")  // SpEL 表达式
    private String userHome;
}
✅ 替代的 XML 配置
<bean id="jdbcConfig" class="com.example.JdbcConfig">
    <property name="url" value="${jdbc.url}"/>
    <property name="port" value="3306"/>
</bean>

三、配置第三方 Bean 相关注解

@Bean

✅ 应用场景
  • 在配置类中声明第三方库的 Bean(如数据源、Redis 客户端等)
✅ 使用方法
@Configuration
public class AppConfig {
    
    @Bean
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setUrl("jdbc:mysql://localhost:3306/test");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}
✅ 替代的 XML 配置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

四、作用范围相关注解

@Scope

✅ 应用场景
  • 设置 Bean 的作用范围:singleton(默认)、prototype、request、session 等
✅ 使用方法
@Component
@Scope("prototype")  // 每次获取都创建新实例
public class PrototypeBean {
}
✅ 替代的 XML 配置
<bean id="prototypeBean" class="com.example.PrototypeBean" scope="prototype"/>

五、生命周期相关注解

1. @PostConstruct

✅ 应用场景
  • 指定 Bean 初始化完成后执行的方法
✅ 使用方法
@Component
public class InitBean {
    
    @PostConstruct
    public void init() {
        System.out.println("Bean 初始化完成,执行此方法");
    }
}
✅ 替代的 XML 配置
<bean id="initBean" class="com.example.InitBean" init-method="init"/>

2. @PreDestroy

✅ 应用场景
  • 指定 Bean 销毁前执行的方法(仅适用于 singleton 作用域)
✅ 使用方法
@Component
public class DestroyBean {
    
    @PreDestroy
    public void cleanup() {
        System.out.println("Bean 销毁前,执行清理操作");
    }
}
✅ 替代的 XML 配置
<bean id="destroyBean" class="com.example.DestroyBean" destroy-method="cleanup"/>

六、所有注解对比总结表

注解 应用场景 使用方法 替代的 XML 配置
@Component 通用 Bean 定义 @Component public class A {} <bean class="A"/>
@Controller 控制层 Bean @Controller public class A {} <bean class="A"/>
@Service 业务层 Bean @Service public class A {} <bean class="A"/>
@Repository 持久层 Bean @Repository public class A {} <bean class="A"/>
@ComponentScan 配置扫描包路径 @ComponentScan("com.example") <context:component-scan.../>
@Autowired 自动装配依赖 @Autowired private A a; <property><constructor-arg>autowire
@Qualifier 指定注入的 Bean 名称 @Qualifier("aImpl") ref="aImpl"
@Value 注入简单类型值 @Value("${key}") <property name="" value=""/>
@Bean 配置第三方 Bean @Bean public DataSource ds() {} <bean class="..."/>
@Scope 设置作用范围 @Scope("prototype") scope="prototype"
@PostConstruct 初始化方法 @PostConstruct public void init() {} init-method="init"
@PreDestroy 销毁方法 @PreDestroy public void destroy() {} destroy-method="destroy"

以上内容涵盖了图片中所有注解的详细总结,每个注解都按照应用场景、使用方法、替代 XML 配置三个维度展开,最后用表格做了对比。如果有需要调整的地方,随时告诉我。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐