spring依赖注入核心是启用注解驱动并扫描bean,通过@autowired(bytype)、@resource(byname)、@value(配置值)实现装配,需确保被注入类本身为容器管理的bean。

Spring 框架通过注解实现依赖注入,核心是结合 @Autowired、@Resource、@Value 等注解,配合 Spring 的 IoC 容器自动完成对象装配。关键不在于注解本身,而在于 Spring 启用注解驱动并扫描到这些注解后,由容器在创建 Bean 时执行注入逻辑。
启用注解支持
Spring 需明确开启注解处理能力:
- XML 配置中添加:
(启用注解注入,但不扫描类) - 更常用的是:
,它自动包含 annotation-config,并扫描指定包下的 @Component 及其派生注解(如 @Service、@Repository、@Controller) - Java 配置类中使用 @Configuration + @ComponentScan,效果等同
@Autowired 注入方式
这是 Spring 原生的按类型(byType)注入注解,可作用于字段、构造器、setter 方法:
-
字段注入:最简写法,但不利于单元测试和不可变设计
@Autowired
private UserService userService; -
构造器注入:推荐方式,保证依赖不为 null,天然支持 final 字段
public UserController(@Autowired UserService userService) { ... } -
Setter 注入:兼容老代码,需提供 public setter 方法
@Autowired
public void setUserService(UserService userService) { ... }
当存在多个同类型 Bean 时,可用 @Qualifier("beanName") 指定具体 Bean 名称,避免歧义。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Resource 和 @Value 补充场景
@Resource(JSR-250 标准)默认按名称(byName)注入,找不到再按类型 fallback,常用于替代 @Autowired 避免 @Qualifier:
- @Resource(name = "userService") private UserService service;
@Value 用于注入外部配置值(如 properties/yml 中的属性):
- @Value("${app.timeout:3000}") private int timeout;(冒号后是默认值)
- 支持 SpEL 表达式,例如:@Value("#{systemProperties['os.name']}")
自定义注解 + @Component 实现可注入组件
若想让自己的类被 Spring 管理并参与注入,只需加一个 Spring 识别的组件注解:
- 直接加 @Component,或语义化更强的 @Service / @Repository / @Controller
- 自定义注解需搭配 @Component 或元注解 @Component 才能被扫描注册为 Bean
- 例如:@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface MyService { },之后用 @MyService 标记类即可注入
不复杂但容易忽略:所有被注入的目标类,本身也必须是 Spring 容器管理的 Bean(即被 @Component 等标记且被 component-scan 扫描到),否则注入会失败(报 NoSuchBeanDefinitionException)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










