
一、三大基础注入方式1. 构造器注入官方推荐首选Service public class XxxService { private final XxxDao xxxDao; // 强制注入依赖不可为空 public XxxService(XxxDao xxxDao) { this.xxxDao xxxDao; } }优点支持final、强制依赖、减少空指针、缓解循环依赖适用项目核心必选依赖2. Setter 设值注入Service public class XxxService { private XxxDao xxxDao; Autowired public void setXxxDao(XxxDao xxxDao) { this.xxxDao xxxDao; } }优点灵活容器初始化后可动态修改依赖适用非必需、可选依赖3. 字段注入不推荐生产使用Service public class XxxService { Autowired private XxxDao xxxDao; }缺点不能用 final、隐藏依赖、脱离 Spring 难以单元测试、更容易循环依赖二、配套注入注解1. AutowiredSpring 原生核心注入注解默认按类型匹配 Bean多个同类型 Bean 会报NoUniqueBeanDefinitionException歧义异常可作用于构造、set 方法、成员变量。2. QualifierAutowired 配套限定注解非独立注入方式作用同接口多实现时指定 Bean 名称精准匹配解决注入冲突。 使用位置构造参数、set 参数、成员变量上方// 多实现场景 Autowired Qualifier(mysqlUserDao) private UserDao userDao;3. PrimaryQualifier 替代方案在其中一个实现类添加Spring 自动优先注入该 Bean只能设置一个主 Bean灵活性差。Repository Primary public class MysqlUserDao implements UserDao {}4. ResourceJSR-250 规范优先按 Bean 名称匹配无需搭配Qualifier不支持构造方法注入。Resource(name mysqlUserDao) private UserDao userDao;5. InjectJSR-330 规范功能近似Autowired无required属性需额外引入依赖项目极少使用。6. Value普通值注入注入字面量、配置文件属性简单类型非对象 Bean 注入Value(${server.port}) private Integer port;三、集合批量注入同类型所有 Bean 可直接注入到集合 / 数组无需QualifierAutowired private ListUserDao daoList;四、三种注入方式对比注入方式优点缺点推荐度构造器注入依赖不可为空、线程安全、易测试、循环依赖少可选依赖需重载构造⭐⭐⭐⭐⭐ 生产首选Setter 注入可动态修改依赖适配可选依赖实例创建后赋值存在空指针风险⭐⭐⭐ 仅可选依赖使用字段注入代码简洁、书写少无法 final、难单元测试、隐藏依赖⭐ 不推荐五、总结注入方式只有三类构造注入、set 注入、字段注入Autowired/Resource/Inject是实现注入的注解Qualifier/Primary是辅助限定注解用来解决多 Bean 冲突不属于注入方式Value专门注入普通配置值不用于对象 Bean 依赖注入。