首页 > 解决方案 > 通过 @Configuration 在自己的类上返回 @Bean

问题描述

我有以下课程:

@Configuration
@Component
@Getter
public class EndUserDisambiguator extends UserDisambiguator {
    private final Collection<UserCredentialDisambiguator<?, ?, ?>> endUserCredentialDisambiguators;

    @Autowired
    public EndUserDisambiguator(final EndUserRepository userRepository) {
        super(userRepository);

        val phoneNumberDisambiguator = new UserCredentialDisambiguator<>(EndUser::getPhoneNumber, userRepository::findByPhoneNumber, PhoneNumberExistsException::new);
        val socialSecurityNumberDisambiguator = new UserCredentialDisambiguator<>(EndUser::getSocialSecurityNumber, userRepository::findBySocialSecurityNumber, SocialSecurityNumberExistsException::new);

        this.endUserCredentialDisambiguators = Set.of(phoneNumberDisambiguator, socialSecurityNumberDisambiguator);
    }

    @Override
    public Collection<UserCredentialDisambiguator<?, ?, ?>> getUserCredentialDisambiguators() {
        val baseCredentialDismabiguators = super.getUserCredentialDisambiguators().stream();
        val specificUserCredentialDisambiguators = getEndUserCredentialDisambiguators().stream();

        val userCredentialDisambiguators = Stream.concat(baseCredentialDismabiguators, specificUserCredentialDisambiguators);

        return userCredentialDisambiguators.collect(Collectors.toUnmodifiableSet());
    }

    @Bean(UserDisambiguator.END_USER_QUALIFIER)
    public EndUserDisambiguator getEndUserDisambiguator() {
        return this;
    }
}

这是我的应用程序消歧层的一部分,该层确保在服务层中创建的任何非持久用户不会干扰现有的持久用户(例如,确保用户名是唯一的)。`

因此,它是@Autowired对用户存储库的引用,只有消歧层是@Autowired存储库(服务层不是)。服务层通过消歧层进行持久化。

EndUserService(相同类型用户的相应服务)因此需要@Autowired引用EndUserDisambiguator. 我不想将存储库层泄漏到服务层(服务层执行其持久的后消歧)。声明EndUserDisambiguatora@Configuration并有一个方法返回@Bean对应于自身的 a 是设计缺陷吗?

这是EndUserDisambiguator注入的位置:

@Service
public class EndUserService extends UserService {
    @Autowired
    public EndUserService(final VerificationTokenRepository verificationTokenRepository, final EndUserDisambiguator userDisambiguator) {
        super(verificationTokenRepository, userDisambiguator);
    }

    ...
}

标签: javaspringdependency-injectioninversion-of-controlspring-ioc

解决方案


推荐阅读