. ;jarak huruf: 0.034em;saiz fon: 14px;jejari sempadan: 4px;warna latar belakang: rgba(27, 31, 35, 0.05);keluarga fon: "Operator Mono", Consolas, Monaco, Menlo, monospace ;word-break: break-all;color: rgb(239, 112, 96);visibility: visible;">rangka kerja musim bunga 3.0 Saya menyemak dokumen yang berkaitan dan mendapati bahawa gesaan ini mula muncul selepas 下面将展示了spring框架可以使用的不同类型的依赖注入,以及每种依赖注入的适用情况。 2、依赖注入的类型 尽管针对 2 Jenis suntikan pergantungan🎜🎜 🎜Walaupun dokumentasi untuk 🎜 fungsi binaan berasaskan suntikan @ bukan binaan Autowired dan mengandungi beberapa parameter yang berkaitan dengan objek yang akan disuntik. 基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。 在基于setter的依赖注入中,setter方法被标注为 @Autowired。一旦使用无参数构造函数或无参数静态工厂方法实例化Bean,为了注入Bean的依赖项,Spring容器将调用这些setter方法。 和基于构造器的依赖注入一样,在官方文档中,基于Setter的依赖注入中的 @Autowired也可以省去。 在基于属性的依赖注入中,字段/属性被标注为 @Autowired。一旦类被实例化,Spring容器将设置这些字段。 正如所看到的,这是依赖注入最干净的方法,因为它避免了添加样板代码,并且不需要声明类的构造函数。代码看起来很干净简洁,但是正如代码检查器已经向我们暗示的那样,这种方法有一些缺点。 3. Kecacatan suntikan kebergantungan berasaskan medan
S dalam SOLID mewakili prinsip tanggungjawab tunggal, iaitu, kelas hanya perlu bertanggungjawab untuk satu tanggungjawab, dan semua perkhidmatan yang disediakan oleh kelas ini hanya perlu bertanggungjawab ke atas tanggungjawab yang dipertanggungjawabkan. untuk Hidangkan. Menggunakan suntikan kebergantungan berasaskan medan, untuk kelas yang kerap digunakan, dari masa ke masa, kami secara beransur-ansur akan menambah lebih banyak kebergantungan pada kelas Kami sangat gembira dengannya, dan lebih mudah untuk mengabaikan kebergantungan dalam kelas . Tetapi jika anda menggunakan suntikan kebergantungan berasaskan pembina, kerana semakin banyak kebergantungan ditambahkan pada kelas, pembina akan menjadi lebih besar dan lebih besar, dan kita boleh memberitahu ada sesuatu yang salah sepintas lalu. Mempunyai pembina dengan lebih daripada 10 parameter adalah petanda jelas bahawa kelas telah berubah menjadi koleksi fungsi yang besar dan komprehensif dan perlu dipecahkan kepada bahagian yang lebih kecil dan lebih boleh diselenggara. Jadi, walaupun suntikan harta bukan punca langsung melanggar prinsip tanggungjawab tunggal, ia menyembunyikan isyarat dan memudahkan kita mengabaikannya. . Akhirnya, ini bermakna bahawa satu-satunya cara untuk menetapkan medan ini adalah dengan membuat instantiate kelas melalui bekas Spring dan menyuntiknya menggunakan pantulan, jika tidak medan akan kekal batal. Ini bermakna jika anda ingin menggunakan kelas anda di luar bekas aplikasi, contohnya untuk ujian unit, anda akan terpaksa menggunakan bekas Spring untuk membuat instantiate kelas anda kerana tiada cara lain yang mungkin (kecuali refleksi) untuk menyediakan medan pendawaian automatik. Apabila menggunakan suntikan kebergantungan, kelas yang terjejas harus mendedahkan kebergantungan ini dengan jelas menggunakan antara muka awam, dengan mendedahkan kebergantungan yang diperlukan dalam pembina, atau menggunakan Kaedah (penetap) mendedahkan kebergantungan pilihan. Apabila menggunakan suntikan kebergantungan berasaskan medan, kebergantungan ini pada dasarnya tersembunyi dari dunia luar. 4. Ringkasan Kita telah melihat bahawa suntikan berasaskan lapangan harus dielakkan sebanyak mungkin kerana ia mempunyai banyak kelemahan, tidak kira betapa elegannya ia kelihatan. Pendekatan yang disyorkan ialah menggunakan suntikan pergantungan berasaskan pembina dan penetap. Untuk kebergantungan yang diperlukan, disyorkan untuk menggunakan suntikan berasaskan pembina, menjadikannya tidak berubah dan mengelakkannya daripada menjadi batal. Untuk kebergantungan pilihan, disyorkan untuk menggunakan suntikan berasaskan setter. Naik taraf kepada
<span style="outline: 0px;font-size: 16px;visibility: visible;">5.0<span style="outline: 0px;font-size: 20px;visibility: visible;"></span></span>
, dan kemudian semasa saya menulis kod , saya tiba-tiba mendapati bahawa idea itu adalah Anotasi @Autowired
untuk suntikan atribut memberi amaran, seperti di bawah, yang agak mengelirukan, ia telah ditulis seperti ini selama bertahun-tahun.
<span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 3.0</span>
升级到<span style="outline: 0px;font-size: 16px;visibility: visible;">5.0</span>
Suntikan medan tidak digalakkan
<code style="outline: 0px;visibility: visible;"><span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 4.0</span>
以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。<span style="outline: 0px;font-size: 16px;">spring framerwork 5.1.3</span>
spring framerwork 4.0, tetapi ia tidak akan muncul selepas spring 4.0 Adalah disyorkan untuk menggunakan suntikan harta, dan suntikan pembina dan suntikan penetap disyorkan.
🎜🎜spring framerwork 5.1.3🎜
🎜 hanya mentakrifkan dua jenis utama suntikan pergantungan, sebenarnya terdapat tiga;🎜 🎜Suntikan berasaskan Suntikan berasaskan Suntikan Berbasis-berasaskan Suntikan Berbasis Berbasis Berbasis Berasaskan Suntikan Berbasis Diwhere
<li style="outline: 0px;font-size: 16px;">Suntikan pergantungan berasaskan medan<section style="margin-top: 5px;margin-bottom: 5px;outline: 0px;line-height: 26px;color: rgb(1, 1, 1);"></section>
</li>
digunakan secara meluas, tetapi idea atau alat analisis kod statik lain akan memberikan mesej segera dan tidak disyorkan. @Component
public class ConstructorBasedInjection {
private final InjectedBean injectedBean;
@Autowired
public ConstructorBasedInjection(InjectedBean injectedBean) {
this.injectedBean = injectedBean;
}
}
<span style="outline: 0px;font-size: 16px;">基于字段的依赖注入</span>
Kemudian dalam dokumen rasmi musim bunga, anotasi @Autowired juga boleh ditinggalkan. public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on a MovieFinder
private MovieFinder movieFinder;
// a constructor so that the Spring container can inject a MovieFinder
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
2.2 基于Setter的依赖注入
@Component
public class SetterBasedInjection {
private InjectedBean injectedBean;
@Autowired
public void setInjectedBean(InjectedBean injectedBean) {
this.injectedBean = injectedBean;
}
}
public class SimpleMovieLister {
// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;
// a setter method so that the Spring container can inject a MovieFinder
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// business logic that actually uses the injected MovieFinder is omitted...
}
2.3 基于属性的依赖注入
@Component
public class FieldBasedInjection {
@Autowired
private InjectedBean injectedBean;
}
3.1 Medan tidak berubah-ubah tidak dibenarkan diisytiharkan fincy berdasarkan medan
s diisytiharkan sebagai muktamad/tidak berubah Tidak berfungsi kerana medan ini mesti dijadikan instantiated apabila kelas itu instantiated. Satu-satunya cara untuk mengisytiharkan kebergantungan tidak berubah adalah dengan menggunakan suntikan kebergantungan berasaskan pembina. 3.2 Mudah untuk melanggar prinsip reka bentuk tanggungjawab tunggal
Dalam pengaturcaraan berorientasikan objek, lima prinsip reka bentuk SOLID digunakan secara meluas (biasanya enam prinsip reka bentuk di China) untuk meningkatkan kebolehgunaan semula kod. Kebolehbacaan, kebolehpercayaan dan kebolehselenggaraan Corak reka bentuk Suntikan Ketergantungan memisahkan penciptaan kebergantungan kelas daripada kelas itu sendiri dan memindahkan tanggungjawab ini kepada bekas suntikan kelas, membolehkan reka bentuk program dipisahkan dan mengikut prinsip penyongsangan tanggungjawab dan kebergantungan tunggal (sama-sama boleh dipercayai ). Oleh itu, penyahgandingan kelas yang dicapai oleh medan pendawaian automatik akhirnya hilang dengan menggabungkannya semula ke bekas suntikan kelas (Spring dalam kes ini), sekali gus menjadikan kelas tidak berguna di luar bekas Spring.
3.4 Ketergantungan Tersembunyi
Atas ialah kandungan terperinci Mengapakah syarikat besar melarang penggunaan anotasi @Autowired dalam projek Spring Boot?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!