Spring 引导 - 抽象内自动装配 null class

Spring Boot - Autowiring null inside abstract class

我有以下 classes.

public interface Operation
public abstract class AbstractOperation  implements Operation
public class Operation extends AbstractOperation

Class操作

public interface Operation {
     GenericClientResponse validateCustomerId();

Class抽象操作

public abstract class AbstractOperation  implements Operation {

    protected GenericClientRequest buildClientValidationRequest() {
        return new GenericClientRequest();
    }

在操作 class 中有自动装配的属性。

public class Operation extends AbstractOperation {
    @Autowired
    UserAccountsRepository userAccountsRepository; // not autowiring
    @Autowired
    WebClient.Builder webClientBuilder; // not autowiring

但是 none 这些属性是自动装配的。它们在 运行 时为空。 但是如果我在我的服务中自动装配这些 class 自动装配成功完成。

    @Service
    @Transactional
    public class TransactionServiceImpl implements TransactionService {

          @Autowired
          UserAccountsRepository userAccountsRepository; // Autowires successfully.

请在下面找到存储库 class。

public interface UserAccountsRepository extends 
             JpaRepository<UserAccountsEntity, Integer> {

    @Query("SELECT account FROM UserAccountsEntity account where 
                 account.accountNo = :acc")
    UserAccountsEntity getAccountByAccNo(@Param("acc") String userId);

在我的代码中,我保留了操作 classes 的映射,并根据键获取相关操作 class。

 operationMap.put("test_op1", new Operation());
 operationMap.put("test_op2", new Operation2());

然后我调用它来获得正确的操作

Optional.ofNullable(operationMap.get("test_op1"));

现在我不明白创建新实例会导致空自动装配。我如何在没有新关键字的情况下获得新对象?

您可能正在用 new 实例化 Operation,如下所示:

Operation operation = new Operation(...);

这会使您的 Operation 实例成为非 Spring 托管。因此,由于 Spring 不知道您的实例,它无法自动装配您的依赖项。

如果您喜欢:

@Component
public class Operation {
...
}

您将正确地自动装配您的依赖项。如果您真的需要自己实例化 Operation 并保留自动装配的依赖项,则需要选择 Configurable。查看一些参考资料:

根据您分享的内容,我可以看到几种可能性:

  1. 包结构不正确 - 如果 class Operationmain 不在同一个包(或子包)中class,组件扫描可能会选择你的class。 请参考 答案以确保您已正确实施包结构。

  2. 您可能缺少 class Operation 上的 Spring 注释,例如 @Component@Service。或者您可能在 Spring 应用程序上下文之外的代码中手动实例化 class。请确认您正在正确创建 bean。

如果您尝试手动创建 bean,您应该在 class.

配置中 using @Bean