主题
面试速答(先看这里)
**一句话结论:**注入 Bean,就是说已经有一个 Bean 了,我想在其他的 Bean 中使用它,就要注入。
60秒标准回答:
注入 Bean,就是说已经有一个 Bean 了,我想在其他的 Bean 中使用它,就要注入。比如场景的我们在 Service 中注入Dao
在 Spring 中,Bean 的注入也是非常常见的操作了,有以下几种形式
@Autowired 注解是Spring框架的一部分,用于自动装配(自动注入)Spring Bean到其他Bean中
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- 使用 @Autowired 注解:@Autowired 注解是Spring框架的一部分,用于自动装配(自动注入)Spring Bean到其他Bean中。
- **使用 @Resource 和 @Inject 注解:**Bean的注入,除了用 Spring 中提供的注解以外,还可以用 JDK 给我们提供的注解,包括了 @Resource 和 @Inject 。
- **使用XML 配置文件:**除了用注解以外,还可以用传统的XML 文件的配置方式,也能实现 Bean 的注入。
- **FactoryBean:**说 FactoryBean 你可能不理解,看以下代码:
**记忆锚点:**Bean → Spring → FactoryBean → Autowired → DubboReference → Resource
易错提醒:
- 除了以上几种情况意外,还有一个可能很少有人注意到,其实从 Spring 4.3 开始,除非一个类中声明了至少两个构造函数,否则不需要用 @Autowired 标注构造函数,这个构造函数也能直接注入 Bean: FactoryBean 说 FactoryBean 你可能不理解,看以下代码: 这里用到了@DubboReference把HollisRemoteFa…
加分表达:
- 比如场景的我们在 Service 中注入Dao。
追问准备:
- 围绕「Bean」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Spring」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「FactoryBean」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
注入 Bean,就是说已经有一个 Bean 了,我想在其他的 Bean 中使用它,就要注入。比如场景的我们在 Service 中注入Dao。
在 Spring 中,Bean 的注入也是非常常见的操作了,有以下几种形式。
使用@Autowired 注解
@Autowired 注解是Spring框架的一部分,用于自动装配(自动注入)Spring Bean到其他Bean中。
他可以标注在字段(成员变量)、构造器、以及 setter 方法上。
字段注入
plain
@Component
public class HollisService {
@Autowired
private HollisRepository hollisRepository;
}打开文档:✅为什么Spring不建议使用基于字段的依赖注入?
构造器注入
plain
@Component
public class HollisService {
private HollisRepository hollisRepository;
@Autowired
public HollisService(HollisRepository hollisRepository){
this.hollisRepository = hollisRepository;
}
}setter 注入
plain
@Component
public class HollisService {
private HollisRepository hollisRepository;
@Autowired
public void setHollisRepository(HollisRepository hollisRepository){
this.hollisRepository = hollisRepository;
}
}使用 @Resource 和 @Inject 注解
Bean的注入,除了用 Spring 中提供的注解以外,还可以用 JDK 给我们提供的注解,包括了@Resource 和 @Inject 。
plain
@Component
public class HollisService {
@Resource
private HollisRepository hollisRepository;
}
@Component
public class HollisService {
@Inject
private HollisRepository hollisRepository;
}使用XML 配置文件
除了用注解以外,还可以用传统的XML 文件的配置方式,也能实现 Bean 的注入。
plain
<beans>
<bean id="hollisRepository" class="com.java.bagu.demo.HollisRepository"/>
<bean id="hollisService" class="com.java.bagu.demo.HollisService">
<property name="hollisRepository" ref="hollisRepository"/>
</bean>
</beans>构造器自动注入
除了以上几种情况意外,还有一个可能很少有人注意到,其实从 Spring 4.3 开始,除非一个类中声明了至少两个构造函数,否则不需要用 @Autowired 标注构造函数,这个构造函数也能直接注入 Bean:
plain
@Component
public class HollisService {
private HollisRepository hollisRepository;
public HollisService(HollisRepository hollisRepository){
this.hollisRepository = hollisRepository;
}
}FactoryBean
说 FactoryBean 你可能不理解,看以下代码:
plain
@Configuration
public class HollisService {
@DubboReference(version = "1.0.0")
private HollisRemoteFacadeService hollisRemoteFacadeService;
}这里用到了@DubboReference把HollisRemoteFacadeService这个 bean给注入进来了。@DubboReference其实是RPC 框架Dubbo 提供的一个注解,他的实现原理其实就是基于 FactoryBean来创建并配置Dubbo服务的代理对象的。
具体的实现原理及过程可以参考: