次のようなクラスがあります
_@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
のインスタンスを持っていません。また、ベースフィールドに子を設定するつもりはありません。
この状況に対処する適切な方法は何ですか?多分私はフィールドインジェクションを使うべきですか?
子クラスにemailService
を含めたくないと言ったので、フィールドインジェクションを使用するのがよいでしょう。
もう1つの方法は、EmailService
BeanをNotificationCenterA
コンストラクターに注入し、それをsuper(emailService)
に渡すことです。
したがって、次のようなものになります。
@Autowired
public NotificationCenterA(EmailService emailService, TemplateBuildingService templateBuildingService) {
super(emailService);
this.templateBuildingService = templateBuildingService;
}