2022-06-07:使用Annotation配置
使用Spring的IoC容器,实际上就是通过类似XML这样的配置文件,把我们自己的Bean的依赖关系描述出来,然后让容器来创建并装配Bean。一旦容器初始化完毕,我们就直接从容器中获取Bean使用它们。
使用XML配置的优点是所有的Bean都可以一目了然地列出来,并通过配置注入能直观地看到每个Bean的依赖。其缺点是写起来很繁琐,每增加一个组件,就必须把新的Bean配置到XML中。
有没有更简单的配置方式呢?
有!我们可以使用Annotation配置,这样就完全不需要XML,让Spring自动扫描Bean并组装它们。
我们把上一节的示例改造一下,先删除XML配置文件,然后给UserService和MailService添加几个注解。
①我们给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,它告诉容器,自动搜索当前类所在的包以及子包,把所有标注为@Componet的Bean自动创建出来,并根据@Autowired进行装配。
整个工程结构如下:
使用Annotation配合自动扫描能大幅简化Spring的配置,我们只需要保证:
- 每个Bean被标注为@Component并正确使用@Autowired注入;
- 配置类被标注为@Configuration和@ComponentScan;
- 所有的Bean均在指定包和子包中。
使用@ComponentScan很方便,但是我们也要特别注意包的层次结构。通常来说,启动配置AppConfig位于自定义的顶层包(例如com.itranswarp.learnjava),其他Bean按类别放入子包。
小结
使用Annotation可以大幅度简化配置,每个Bean通过@Component和@Autowired注入;
必须合理设计包的层次结构,才能发挥@ComponentScan的作用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2021-06-07 QT:中文字符串与“常量中有字符串”报错
2020-06-07 Pycharm:设置自带控制台的python版本