Menggunakan @Autowired di Kelas Abstrak

1. Perkenalan

Dalam tutorial singkat ini, kami akan menjelaskan cara menggunakan anotasi @Autowired dalam kelas abstrak.

Kami akan menerapkan @Autowired ke kelas abstrak, dan fokus pada poin penting yang harus kami perhitungkan.

2. Injeksi Setter

Kita bisa menggunakan @Autowired pada metode penyetel:

public abstract class BallService { private LogRepository logRepository; @Autowired public final void setLogRepository(LogRepository logRepository) { this.logRepository = logRepository; } }

Ketika kita menggunakan @ Autowired pada metode setter, kita harus menggunakan yang akhir kata kunci, sehingga subclass tidak dapat mengganti metode setter . Jika tidak, anotasi tidak akan berfungsi seperti yang kami harapkan.

3. Injeksi Konstruktor

Kita tidak dapat menggunakan @Autowired pada konstruktor kelas abstrak.

Spring tidak mengevaluasi anotasi @Autowired pada konstruktor kelas abstrak. Subclass harus menyediakan argumen yang diperlukan untuk konstruktor super .

Sebagai gantinya, kita harus menggunakan @Autowired pada konstruktor subclass:

public abstract class BallService { private RuleRepository ruleRepository; public BallService(RuleRepository ruleRepository) { this.ruleRepository = ruleRepository; } }
@Component public class BasketballService extends BallService { @Autowired public BasketballService(RuleRepository ruleRepository) { super(ruleRepository); } }

4. Lembar Cheat

Mari kita akhiri dengan beberapa aturan untuk diingat.

Pertama, kelas abstrak tidak dipindai komponen karena tidak dapat dibuat instance-nya tanpa subkelas konkret.

Kedua, injeksi penyetel dimungkinkan dalam kelas abstrak , tetapi berisiko jika kita tidak menggunakan kata kunci terakhir untuk metode penyetel. Aplikasi mungkin tidak stabil jika subclass mengganti metode penyetel.

Ketiga, karena Spring tidak mendukung injeksi konstruktor dalam kelas abstrak, kita biasanya harus membiarkan subkelas konstruk menyediakan argumen konstruktor . Ini berarti kita perlu mengandalkan injeksi konstruktor pada subclass beton .

Dan terakhir, menggunakan injeksi konstruktor untuk dependensi yang diperlukan dan injeksi setter untuk dependensi opsional adalah aturan praktis yang baik. Namun, seperti yang dapat kita lihat dengan beberapa nuansa dengan kelas abstrak, injeksi konstruktor lebih disukai di sini secara umum.

Jadi, sebenarnya kita dapat mengatakan bahwa subclass konkret mengatur bagaimana induk abstraknya mendapatkan dependensinya . Pegas akan melakukan injeksi selama pegas menghubungkan subkelas.

5. Kesimpulan

Dalam artikel ini, kami berlatih menggunakan @Autowired dalam kelas abstrak dan menjelaskan beberapa poin penting namun penting.

Kode sumber dari tutorial ini dapat ditemukan di proyek Github seperti biasa.