Skip to content

面试速答(先看这里)

**一句话结论:**注入 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不建议使用基于字段的依赖注入?

打开文档:✅为什么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;
}

📄 ✅Autowired和Resource的关系?

打开文档:✅Autowired和Resource的关系?

使用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服务的代理对象的。

具体的实现原理及过程可以参考:

📄 ✅BeanFactory和FactroyBean的关系?

打开文档:✅BeanFactory和FactroyBean的关系?