web-dev-qa-db-ja.com

抽象クラスと子へのコンストラクター注入

次のようなクラスがあります

_@Component
public abstract class NotificationCenter {
    protected final EmailService emailService;
    protected final Logger log = LoggerFactory.getLogger(getClass());

    protected NotificationCenter(EmailService emailService) {
        this.emailService = emailService;
    }

    protected void notifyOverEmail(String email, String message) {
        //do some work
        emailService.send(email, message);
    }
}
_

EmailServiceは_@Service_であり、コンストラクターインジェクションによって自動配線される必要があります。

これで、NotificationCenterを拡張し、コンポーネントを自動ワイヤリングするクラスができました

_@Service
public class NotificationCenterA extends NotificationCenter {    
    private final TemplateBuildingService templateBuildingService;

    public NotificationCenterA(TemplateBuildingService templateBuildingService) {
        this.templateBuildingService = templateBuildingService;
    }
}
_

上記の例に基づくと、抽象クラスNotificationCenterにデフォルトのコンストラクターがないため、コードはコンパイルされません。NotificationCenterAコンストラクターの最初のステートメントとしてsuper(emailService);を追加しない限り、私はemailServiceのインスタンスを持っていません。また、ベースフィールドに子を設定するつもりはありません。

この状況に対処する適切な方法は何ですか?多分私はフィールドインジェクションを使うべきですか?

6
prettyvoid

子クラスにemailServiceを含めたくないと言ったので、フィールドインジェクションを使用するのがよいでしょう。

もう1つの方法は、EmailService BeanをNotificationCenterAコンストラクターに注入し、それをsuper(emailService)に渡すことです。

したがって、次のようなものになります。

        @Autowired
        public NotificationCenterA(EmailService emailService, TemplateBuildingService templateBuildingService) {
            super(emailService);
            this.templateBuildingService = templateBuildingService;
        }
0
Nitin1706