Spring Boot 学习笔记:深入理解@Component和@Autowired注解

Spring Boot 学习笔记:深入理解@Component和@Autowired注解

spring-boot-learning 🍀 Hướng dẫn tất tần tật về Spring Boot, Spring Cloud ☘️ Code mẫu tiếng việt, có bài viết hướng dẫn đi kèm hình ảnh dễ hiểu 🍄 spring-boot-learning 项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-learning

前言

在Spring Boot框架中,@Component@Autowired是两个最基础也是最重要的注解。理解它们的工作原理对于掌握Spring Boot至关重要。本文将通过一个简单的示例项目,带你深入理解这两个注解的核心概念和使用方法。

项目准备

Maven配置

首先,我们需要配置Maven项目来使用Spring Boot。在pom.xml文件中添加以下依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

项目结构

典型的Spring Boot项目结构如下:

src/main/java
└── me
    └── loda
        └── spring
            └── helloworld
                ├── App.java
                ├── Girl.java
                ├── Outfit.java
                └── Bikini.java

Spring Boot应用启动

每个Spring Boot应用都需要一个主类作为入口点:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(App.class, args);
    }
}

@SpringBootApplication注解实际上是一个复合注解,包含了@Configuration@EnableAutoConfiguration@ComponentScan三个注解的功能。

理解Spring容器

当调用SpringApplication.run()方法时,Spring Boot会创建一个ApplicationContext实例,这就是Spring的IoC容器。容器的主要职责是:

  1. 创建和管理Bean实例
  2. 解决Bean之间的依赖关系
  3. 提供对Bean的访问

@Component注解详解

@Component是Spring中最基本的注解之一,用于标识一个类应该被Spring容器管理。

基本用法

public interface Outfit {
    void wear();
}

@Component
public class Bikini implements Outfit {
    @Override
    public void wear() {
        System.out.println("穿上比基尼");
    }
}

当Spring容器启动时,它会扫描所有带有@Component注解的类,并创建它们的实例(称为Bean)放入容器中。

组件扫描

Spring默认会扫描主类所在包及其子包中的所有组件。如果需要扫描其他包,可以在@SpringBootApplication中添加scanBasePackages属性:

@SpringBootApplication(scanBasePackages = {"me.loda.spring", "com.other.package"})

@Autowired注解详解

@Autowired用于自动装配依赖关系,Spring会自动将合适的Bean注入到标记了@Autowired的字段、构造函数或方法中。

字段注入

@Component
public class Girl {
    @Autowired
    private Outfit outfit;
    
    // getter和setter
}

构造函数注入(推荐方式)

@Component
public class Girl {
    private final Outfit outfit;
    
    @Autowired
    public Girl(Outfit outfit) {
        this.outfit = outfit;
    }
}

方法注入

@Component
public class Girl {
    private Outfit outfit;
    
    @Autowired
    public void setOutfit(Outfit outfit) {
        this.outfit = outfit;
    }
}

Bean的作用域

默认情况下,Spring中的Bean都是单例(Singleton)的,这意味着整个应用中只有一个实例。可以通过@Scope注解改变作用域:

@Component
@Scope("prototype") // 每次请求都创建新实例
public class Bikini implements Outfit {
    // ...
}

其他可用的作用域包括:

  • singleton(默认)
  • prototype
  • request(Web应用)
  • session(Web应用)
  • global-session(Web应用)

实际应用示例

让我们看一个完整的示例:

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(App.class, args);
        
        // 从容器中获取Bean
        Outfit outfit = context.getBean(Outfit.class);
        System.out.println("Outfit实例: " + outfit);
        outfit.wear();
        
        Girl girl = context.getBean(Girl.class);
        System.out.println("Girl实例: " + girl);
        System.out.println("Girl的Outfit: " + girl.getOutfit());
        girl.getOutfit().wear();
    }
}

输出结果可能如下:

Outfit实例: me.loda.spring.helloworld.Bikini@2e16f13a
穿上比基尼
Girl实例: me.loda.spring.helloworld.Girl@353cb1cb
Girl的Outfit: me.loda.spring.helloworld.Bikini@2e16f13a
穿上比基尼

从输出可以看到,两个地方使用的Outfit是同一个实例,这验证了默认的单例作用域。

最佳实践

  1. 优先使用构造函数注入:这种方式更明确,也更容易进行单元测试
  2. 合理使用作用域:理解不同作用域的应用场景
  3. 避免循环依赖:设计时要考虑类之间的依赖关系
  4. 使用接口而非具体实现:这符合依赖倒置原则

总结

@Component@Autowired是Spring框架的核心基础:

  • @Component告诉Spring哪些类需要被管理
  • @Autowired告诉Spring如何解决依赖关系

理解这两个注解的工作原理,是掌握Spring Boot开发的关键第一步。通过本文的示例和解释,你应该已经对它们有了深入的理解。在实际开发中,这些概念会不断被应用和扩展,形成更复杂的应用架构。

spring-boot-learning 🍀 Hướng dẫn tất tần tật về Spring Boot, Spring Cloud ☘️ Code mẫu tiếng việt, có bài viết hướng dẫn đi kèm hình ảnh dễ hiểu 🍄 spring-boot-learning 项目地址: https://gitcode.com/gh_mirrors/sp/spring-boot-learning

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍盛普Silas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值