news 2026/8/18 22:06:25

Spring开发系列教程(4)——IoC容器之使用Annotation配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring开发系列教程(4)——IoC容器之使用Annotation配置

使用Spring的IoC容器,实际上就是通过类似XML这样的配置文件,把我们自己的Bean的依赖关系描述出来,然后让容器来创建并装配Bean。一旦容器初始化完毕,我们就直接从容器中获取Bean使用它们。

使用XML配置的优点是所有的Bean都能一目了然地列出来,并通过配置注入能直观地看到每个Bean的依赖。它的缺点是写起来非常繁琐,每增加一个组件,就必须把新的Bean配置到XML中。

有没有其他更简单的配置方式呢?

有!我们可以使用Annotation配置,可以完全不需要XML,让Spring自动扫描Bean并组装它们。

我们把上一节的示例改造一下,先删除XML配置文件,然后,给UserServiceMailService添加几个注解。

首先,我们给MailService添加一个@Component注解:

@Component public class MailService { ... }

这个@Component注解就相当于定义了一个Bean,它有一个可选的名称,默认是mailService,即小写开头的类名。

然后,我们给UserService添加一个@Component注解和一个@Autowired注解:

@Component public class UserService { @Autowired MailService mailService; ... }

使用@Autowired就相当于把指定类型的Bean注入到指定的字段中。和XML配置相比,@Autowired大幅简化了注入,因为它不但可以写在set()方法上,还可以直接写在字段上,甚至可以写在构造方法中:

@Component public class UserService { MailService mailService; public UserService(@Autowired MailService mailService) { this.mailService = mailService; } ... }

我们一般把@Autowired写在字段上,通常使用package权限的字段,便于测试。

最后,编写一个AppConfig类启动容器:

@Configuration @ComponentScan public class AppConfig { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = context.getBean(UserService.class); User user = userService.login("bob@example.com", "password"); System.out.println(user.getName()); } }

除了main()方法外,AppConfig标注了@Configuration,表示它是一个配置类,因为我们创建ApplicationContext时:

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

使用的实现类是AnnotationConfigApplicationContext,必须传入一个标注了@Configuration的类名。

此外,AppConfig还标注了@ComponentScan,它告诉容器,自动搜索当前类所在的包以及子包,把所有标注为@Component的Bean自动创建出来,并根据@Autowired进行装配。

整个工程结构如下:

spring-ioc-annoconfig ├── pom.xml └── src └── main └── java └── com └── itranswarp └── learnjava ├── AppConfig.java └── service ├── MailService.java ├── User.java └── UserService.java

使用Annotation配合自动扫描能大幅简化Spring的配置,我们只需要保证:

  • 每个Bean被标注为@Component并正确使用@Autowired注入;
  • 配置类被标注为@Configuration@ComponentScan
  • 所有Bean均在指定包以及子包内。

使用@ComponentScan非常方便,但是,我们也要特别注意包的层次结构。通常来说,启动配置AppConfig位于自定义的顶层包(例如com.itranswarp.learnjava),其他Bean按类别放入子包。

思考

如果我们想给UserService注入HikariDataSource,但是这个类位于com.zaxxer.hikari包中,并且HikariDataSource也不可能有@Component注解,如何告诉IoC容器创建并配置HikariDataSource?或者换个说法,如何创建并配置一个第三方Bean?

小结

使用Annotation可以大幅简化配置,每个Bean通过@Component@Autowired注入;

必须合理设计包的层次结构,才能发挥@ComponentScan的威力。

本文转载自廖雪峰老师的官方网站 liaoxuefeng.com 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 22:04:15

吃透 ABAP 动态数据对象共享:从字符串、内表到 copy-on-write 的内存语义

在日常的 ABAP 开发里,很多人一看到赋值语句,就会下意识认为系统已经把一整份数据复制完了。这个直觉放在很多场景里并不完全正确。尤其当你处理的是 string、xstring、internal table 这类动态数据对象,或者你正在使用 data reference、object reference 时,ABAP 的运行时…

作者头像 李华
网站建设 2026/7/14 16:20:40

示波器存储深度:如何优化信号捕获效率与精度

1. 存储深度:不只是个数字,而是你的“观察窗”大小 很多刚接触示波器的朋友,看到“存储深度”这个参数,第一反应可能就是“哦,内存大小嘛”。这么说对,但也不全对。我干了这么多年硬件调试,发现…

作者头像 李华
网站建设 2026/7/14 16:20:40

Windows下WireGuard NAT配置的自动化解决方案

1. 为什么我们需要自动化?聊聊Windows下WireGuard NAT的那点事儿 如果你和我一样,在Windows上折腾过WireGuard,并且需要让连接到你WireGuard服务端的其他设备(比如家里的另一台电脑、树莓派或者手机)也能访问你本地局域…

作者头像 李华
网站建设 2026/7/14 16:20:54

php结婚网系统的设计与实现毕业论文

目录摘要引言系统需求分析系统设计系统实现系统测试总结与展望参考文献附录(可选)项目技术支持源码LW获取详细视频演示 :文章底部获取博主联系方式!同行可合作摘要 简要介绍系统开发背景、目的、技术栈及创新点。 引言 阐述婚恋…

作者头像 李华