当前位置: 首页 > news >正文

IOC容器讲解以及Spring依赖注入最佳实践全解析

IOC容器:

因为web开发讲解三层架构,所以@Controller注解是在控制层,@Service注解是在业务层,@Repository是对数据访问层。

在实际开发当中,有些类是不归属与这三层架构,例如工具类,像这种想要交给IOC容器的类,但是不属于三层架构里的就可以用@Component注解

DI详解:

基于字段的注入(属性注入)

直接在类的字段上使用@Autowired注解,Spring容器会自动装配匹配的Bean。这种方式简洁但缺乏灵活性,且无法注入final字段。

@Service  
public class UserService {  @Autowired  private UserRepository userRepository;  
}  

基于构造方法的注入(构造方法注入)

在类的构造方法上使用@Autowired注解(Spring 4.3+可省略),推荐用于强制依赖或final字段。这种方式明确依赖关系,且便于单元测试。

@Service  
public class UserService {  private final UserRepository userRepository;  @Autowired  public UserService(UserRepository userRepository) {  this.userRepository = userRepository;  }  
}  

基于Setter方法的注入(Setter注入)

在Setter方法上使用@Autowired注解,适合可选依赖或需要动态变更依赖的场景。灵活性高但可能掩盖设计问题。

@Service  
public class UserService {  private UserRepository userRepository;  @Autowired  public void setUserRepository(UserRepository userRepository) {  this.userRepository = userRepository;  }  
}  

解决 @Autowired 注入相同类型 Bean 冲突的方法

当使用 @Autowired 自动注入时,若存在多个相同类型的 Bean,我们可以使用以下是几种常见的方案解决:

使用 @Qualifier 注解指定 Bean 名称

通过 @Qualifier 注解明确指定需要注入的 Bean 名称,确保唯一性。

@Autowired
@Qualifier("beanName")
private MyService myService;

使用 @Primary 标记主 Bean

在多个同类型 Bean 中,标记其中一个为 @Primary,Spring 会优先选择它。

@Bean
@Primary
public MyService primaryService() {return new MyServiceImpl();
}

通过 Bean 名称自动匹配

@Autowired 默认按类型匹配,但若字段名称与 Bean 名称一致,Spring 会尝试按名称匹配。

@Autowired
private MyService specificService; // 匹配名为 specificService 的 Bean

使用构造函数注入 + @Qualifier

构造函数注入结合 @Qualifier 更显式地指定 Bean。

private final MyService myService;public MyClass(@Qualifier("beanName") MyService myService) {this.myService = myService;
}

使用 @Resource 替代 @Autowired

@Resource 默认按名称匹配,可避免类型冲突。

@Resource(name = "beanName")
private MyService myService;

http://www.dtcms.com/a/266055.html

相关文章:

  • XILINX FPGA如何做时序分析和时序优化?
  • Linux之Socket编程Tcp
  • 【BurpSuite 2025最新版插件开发】基础篇7:数据的持久化存储
  • snail-job的oracle sql(oracle 11g)
  • 百度捂紧“钱袋子”
  • 冒泡排序及其优化方式
  • Javaweb - 10.1 Servlet
  • 两个手机都用同个wifi,IP地址会一样吗?如何更改ip地址
  • Redis实战:数据安全与性能保障
  • linux测试端口是否可被外部访问
  • ROS三维环境建模——基于OctoMap库
  • c++ 的标准库 --- std::
  • 【25-cv-07436】Keith律所代理《Four Season - Winter Breeze》画作维权!
  • NFSv4 ACL配置与参数
  • ubuntu防火墙使用
  • 【ChatTTS】ChatTTS使用体验
  • 关于系统无法找到 arm-linux-gcc 命令,这表明你的环境中尚未安装 ARM 交叉编译工具链。以下是详细的解决方案:(DIY机器人工房)
  • 通过HBA卡新增外接存储,详细流程
  • R 语言安装使用教程
  • Oracle面试题-体系结构
  • 《dlib库中的聚类》算法详解:从原理到实践
  • ABP VNext + Cosmos DB Change Feed:搭建实时数据变更流服务
  • 计算机科学导论(10)什么是BIOS
  • 探秘展销编辑器:相较于传统展销的卓越优势与甄选指南​
  • 按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
  • github如何创建一个自己的仓库保姆级教程
  • VBScript 安装使用教程
  • Gartner《Guidance Framework for a Modern Data Integration Architecture》学习心得
  • 分块矩阵怎么取逆?
  • svd分解求旋转平移矩阵