spring装配bean有几种方式?
一 前言
- 在XML中进行显式配置。
- 在Java中进行显式配置。
- 隐式的bean发现机制和自动装配
关于xml配置不会在本篇说明,有兴趣的读者可以自行了解学习;
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 自动装配bean
自动装配Bean主要通过如下两个方式实现自动装备bean
- 组件扫描(component scanning):Spring会自动扫描发现上下文中所创建的bean;对应java配置
@ComponentScan
注解,其会默认会扫描与配置类相同的包和其子包;如果是xml就是<context:component-scan>
- 自动装配(autowiring):Spring自动化管理bean之间的依赖关系;java配置@Autowiring注解,相当于java规范中的@Inject注解;其可以使用在任何类的任何方法上;不建议将required属性设置为false,否则如果在bean未装配的情况下就会报空指针异常;
- @Component注解:赋予spring上下文组件类一个ID;如果不指定value默认就是将类名的第一个字母变为小写形式;其相当于java规范中的@Name注解;
敲黑板了:
理下思路我们可以通过@Component注解使用在多个类上实现多个bean;然后通过@Autowiring使用在方法上实现bean之间的依赖注入;最后通过@ComponentScan将所有bean扫入spring应用上下文;当然里面还有许多使用的小细节,要不然很容易出错;
实现如下
2.1 棉被类
/**
* @Author lsc
* <p>棉被 </p>
*/
@Component
public class Quilt {
// 质量
private String quality;
public void product(){
System.out.println("生产与中国");
}
// 省略set/get
}
2.2 被单类
/**
* @Author lsc
* <p> 被单</p>
*/
@Component//相当于@Component("sheet")
public class Sheet {
// 颜色
private String color;
// 长度
private String length;
private Quilt quilt;
// 使用构造器注入方式将Quilt注入到Sheet,你也可以使用set方式;原则上还可以其它方法
public Sheet(Quilt quilt){
this.quilt = quilt;
}
// 省略set/get
}
2.3被单配置类
/**
* @Author lsc
* <p>被单配置类 </p>
*/
@Configuration//告诉spring这是一个配置类
@ComponentScan//这边的包是com.zszxz.auto 相当于@ComponentScan(basePackages = {"com.zszxz.auto"})
public class SheetConfig {
}
2.4 测试类
/**
* @Author lsc
* <p> </p>
*/
@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes= SheetConfig.class)//加载配置类
public class SheetTest {
@Autowired
Sheet sheet;
@Test
public void sheetTest(){
// 生产与中国
sheet.getQuilt().product();
}
}
三 java配置
java配置只需要通过如下注解即可完成,通常使用在引入第三方类时;
- @Configuration注解:告诉spring这是一个配置类
- @Bean注解:告诉spring这是一个bean,使用在方法上,默认bean的名称就是方法名也就是前面提到的bean的ID;
思路:@Configuration注解声明的配置类中使用注解@Bean,就实现了java配置;
3.1 棉类
/**
* @Author lsc
* <p>棉 </p>
*/
public class Cotton {
// 质量
private String quality;
public void product(){
System.out.println("cotton生产与中国");
}
// 省略set/get
}
3.2 毛毯
/**
* @Author lsc
* <p> 毛毯</p>
*/
public class Blanket {
// 颜色
private String color;
// 长度
private String length;
// 构造器注入
private Cotton cotton;
@Autowired
public Blanket(Cotton cotton){
this.cotton = cotton;
}
// 省略set/get
}
3.3 毛毯配置类
/**
* @Author lsc
* <p>毛毯配置类 </p>
*/
@Configuration//告诉spring这是一个配置类,spring会扫描其所有配置纳入spring容器
public class BlanketConfig {
// 将Cotton注入到spring应用上下文
@Bean
public Cotton cotton(){
return new Cotton();
}
// 将 Cotton注入到Blanket注入到spring应用上下文
@Bean
public Blanket blanket(Cotton cotton){
return new Blanket(cotton);
}
}
3.4 测试类
/**
* @Author lsc
* <p> </p>
*/
@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes= BlanketConfig.class)//加载配置类
public class BlanketTest {
@Autowired
Blanket blanket;
@Test
public void sheetTest(){
// cotton生产与中国
blanket.getCotton().product();
}
}
四 配置结合
使用 @Import
注解能将一个配置类导入另一个配置类, 通常用来合并配置类,下面的示例使用方式更加优雅;
使用示例
/**
* @Author lsc
* <p> </p>
*/
@Configuration
@Import({SheetConfig.class, BlanketConfig.class})
public class MergeConfig {
}
测试示例
/**
* @Author lsc
* <p> </p>
*/
@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes= MergeConfig.class)//加载配置类
public class MergeTest {
@Autowired
Blanket blanket;
@Test
public void sheetTest(){
// cotton生产与中国
blanket.getCotton().product();
}
}
更多精彩原创内容关注公众号:知识追寻者
分类:
spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix