Rumah  >  Artikel  >  Java  >  Mengapakah syarikat besar melarang penggunaan anotasi @Autowired dalam projek Spring Boot?

Mengapakah syarikat besar melarang penggunaan anotasi @Autowired dalam projek Spring Boot?

Java后端技术全栈
Java后端技术全栈ke hadapan
2023-08-15 16:00:38992semak imbas

. ;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

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

Saya menyemak dokumen yang berkaitan dan mendapati bahawa gesaan ini mula muncul selepas <code style="outline: 0px;visibility: visible;"><span style="outline: 0px;font-size: 16px;visibility: visible;">spring framerwork 4.0</span>以后开始出现的,spring 4.0开始就不推荐使用属性注入,改为推荐构造器注入和setter注入。

下面将展示了spring框架可以使用的不同类型的依赖注入,以及每种依赖注入的适用情况。


2、依赖注入的类型

尽管针对<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.

🎜🎜🎜Yang berikut akan menunjukkan jenis suntikan kebergantungan yang berbeza yang boleh digunakan oleh rangka kerja spring dan situasi yang berkenaan bagi setiap suntikan kebergantungan. 🎜🎜🎜
🎜

2 Jenis suntikan pergantungan🎜🎜

🎜Walaupun dokumentasi untuk 🎜🎜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.
  • Anda juga boleh melihat kaedah suntikan ini dalam beberapa panduan Spring rasmi:
  • 2.1 Suntikan kebergantungan berasaskan konstruktor

fungsi binaan berasaskan suntikan @ bukan binaan Autowired dan mengandungi beberapa parameter yang berkaitan dengan objek yang akan disuntik.

@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...
}

基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。

2.2 基于Setter的依赖注入

在基于setter的依赖注入中,setter方法被标注为 @Autowired。一旦使用无参数构造函数或无参数静态工厂方法实例化Bean,为了注入Bean的依赖项,Spring容器将调用这些setter方法。

@Component
public class SetterBasedInjection {

    private InjectedBean injectedBean;

    @Autowired
    public void setInjectedBean(InjectedBean injectedBean) {
        this.injectedBean = injectedBean;
    }
}

和基于构造器的依赖注入一样,在官方文档中,基于Setter的依赖注入中的 @Autowired也可以省去。

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 基于属性的依赖注入

在基于属性的依赖注入中,字段/属性被标注为 @Autowired。一旦类被实例化,Spring容器将设置这些字段。

@Component
public class FieldBasedInjection {
    @Autowired
    private InjectedBean injectedBean;
}

正如所看到的,这是依赖注入最干净的方法,因为它避免了添加样板代码,并且不需要声明类的构造函数。代码看起来很干净简洁,但是正如代码检查器已经向我们暗示的那样,这种方法有一些缺点。


3. Kecacatan suntikan kebergantungan berasaskan medan

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

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.

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.

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.

3.4 Ketergantungan Tersembunyi

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.

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!

Kenyataan:
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam