首页 > Java > java教程 > Spring 的 @Autowired 注解如何工作,以及使用它的最佳实践是什么?

Spring 的 @Autowired 注解如何工作,以及使用它的最佳实践是什么?

Susan Sarandon
发布: 2024-12-18 17:42:10
原创
621 人浏览过

How Does Spring's @Autowired Annotation Work, and What are the Best Practices for Using It?

揭示 Spring @Autowired 的细微差别:综合指南

在 Spring 领域,@Autowired 是一个强大的注解,它简化了bean 连接,使开发人员免于手动配置 XML 文件。然而,对于外行来说,理解其复杂的工作原理可能是一项令人困惑的任务。

示例分析

考虑提供的代码示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class SimpleMovieLister {

 

    private MovieFinder movieFinder;

 

    @Autowired

    public void setMovieFinder(MovieFinder movieFinder) {

        this.movieFinder = movieFinder;

    }

}

 

public class MovieRecommender {

 

    private MovieCatalog movieCatalog;

 

    private CustomerPreferenceDao customerPreferenceDao;

 

    @Autowired

    public void prepare(MovieCatalog movieCatalog,

                    CustomerPreferenceDao customerPreferenceDao) {

        this.movieCatalog = movieCatalog;

        this.customerPreferenceDao = customerPreferenceDao;

    }

}

登录后复制

在这些示例中,@Autowired 将 bean 依赖项注入到字段或 setter 方法中。通过指定应该自动装配 Bean,Spring 会自动检测并关联必要的 Bean,从而使开发人员免于显式 Bean 装配的麻烦。

了解自动装配

要启用自动装配,Spring 执行基于提供的基础包进行组件扫描,检测带注释的类(例如@Component、@Controller)作为潜在的bean。在扫描过程中,@Autowired 注解被识别,将属性或方法标记为注入点。

当bean被创建时,Spring会遍历自动装配的属性或方法,搜索匹配类型的bean。如果存在多个相同类型的 bean,则会引发异常,除非使用 @Qualifier 来指定所需的 bean。

自动装配示例

为了说明自动装配场景,请考虑以下示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

interface Color {

    void design();

}

 

class Red implements Color {

    @Override

    public void design() {

        // Red design logic

    }

}

 

class Blue implements Color {

    @Override

    public void design() {

        // Blue design logic

    }

}

 

class MainClass {

    @Autowired

    private Color color;

 

    public static void main(String[] args) {

        MainClass mainClass = new MainClass();

        mainClass.color.design(); // Red or Blue?

    }

}

登录后复制

在此示例中,Red 和 Blue 都实现了 Color 接口。 MainClass.color 上的 @Autowired 注释指示 Spring 应自动注入 Color 接口的实例。然而,如果没有进一步的指导,Spring 无法确定要注入哪个具体实现。

要解决这种歧义,必须利用 @Qualifier 或 @Resource 注解:

使用 @Qualifier

1

2

3

4

5

@Qualifier("redBean")

class Red implements Color {}

 

@Qualifier("blueBean")

class Blue implements Color {}

登录后复制

在 MainClass 中使用时,@Qualifier 缩小了自动装配的选择范围,确保

使用@Resource

1

2

@Resource(name="redBean")

private Color color;

登录后复制

@Resource 结合了@Autowired 和@Qualifier 注解,注入名为“redBean”的bean。

最好的实践

为了获得最佳的自动装配实践,请考虑以下准则:

  • 使用 @Inject 而不是 @Autowired,因为它遵循 JSR-330 标准并且不是 Spring-具体。
  • 注释构造函数而不是方法,从而启用空检查和早期错误检测。

以上是Spring 的 @Autowired 注解如何工作,以及使用它的最佳实践是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板