1. 概述

自注入是指Spring Bean将自己作为依赖项进行注入。它利用Spring容器获取到自身的引用,然后使用这个引用执行某些操作。

在本简短教程中,我们将了解如何在Spring中使用自注入。

2. 自注入的应用场景

自注入最常见的用途是在必要时绕过Spring AOP的限制,特别是当需要对自我引用的方法或类应用切面时。假设我们有一个执行业务逻辑的服务类,其中部分逻辑需要调用自身的方法:

@Service
public class MyService {
    public void doSomething() {
        // ...
        doSomethingElse();
    }

    @Transactional
    public void doSomethingElse() {
        // ...
    }
}

然而,在运行应用时,我们可能会注意到[@Transactional]并未生效。这是因为doSomething()方法直接调用了doSomethingElse(),从而绕过了Spring代理。

为了解决这个问题,我们可以使用自注入获取Spring代理的引用,通过代理调用方法。

3. 使用 @Autowired 进行自注入

我们可以通过在Bean的字段、构造函数参数或setter方法上使用@Autowired注解来进行Spring中的自注入。

以下是使用字段进行自注入的例子:

以及使用构造函数参数的例子:

@Component
public class MyBean {
    private MyBean self;

    @Autowired
    public MyBean(MyBean self) {
        this.self = self;
    }

    // ...
}

4. 通过 ApplicationContextAware 实现自注入

另一种自注入的方式是实现ApplicationContextAware接口。这个接口允许Bean意识到Spring应用程序上下文,并获取到自身的引用:

@Component
public class MyBean implements ApplicationContextAware {
    private ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        this.context = context;
    }

    public void doSomething() {
        MyBean self = context.getBean(MyBean.class);
        // ...
    }
}

5. 缺点

当Bean自我注入时,可能会导致关于Bean职责的混淆,使得跟踪应用程序中的数据流动变得更加困难

自注入也可能产生循环依赖问题。从Spring Boot 2.6版本开始,如果项目存在循环依赖,Spring Boot会抛出异常。当然,也有一些解决办法。

6. 总结

在这篇快速文章中,我们学习了在Spring中使用自注入的不同方式以及何时使用。同时也了解了自注入在Spring中的潜在缺点。