Apa yang dimaksud dengan kacang Spring?

398

Saya belum menemukan definisi tingkat tinggi dari kacang Spring yang dapat saya mengerti. Saya melihat mereka sering dirujuk dalam dokumentasi dan buku-buku Grails, tetapi saya pikir memahami apa itu akan bermanfaat. Jadi, apa itu kacang Spring? Bagaimana mereka bisa digunakan? Apakah ada hubungannya dengan Injeksi Ketergantungan?

terima kasih
sumber
2
Grails dibangun di atas Musim Semi. Jika Anda tidak terbiasa dengan Spring, saya sarankan Anda setidaknya membaca beberapa materi tentang itu sehingga Anda memahami teknologi yang Anda gunakan.
Jeff Storey
26
Saya pikir komentar di sini menderita masalah yang sama dengan yang OP lihat dalam referensi dalam dokumen dan buku Grails: mereka hanya mudah bagi orang yang sudah tahu apa artinya. Saya menemukan bahwa artikel Wikipedia menggambarkannya jauh lebih baik untuk pemula.
Elias Dorneles
12
@MarcoForberg salah satu alasan mengapa versi kuno Spring adalah yang paling populer di Google adalah karena orang terus menautkannya dari tempat-tempat seperti SO ... static.springsource.org/spring/docs/3.2.x/… akan menjadi lebih baik tempat untuk memulai hari ini.
Ian Roberts
5
+1 @IanRoberts. Ini yang sekarang .
dmahapatro
Tidak membantu mereka memperkenalkan IoC dengan mengatakan bahwa IoC juga dikenal sebagai DI. Mereka terkait ya, tetapi IoC jauh lebih luas.
Aluan Haddad

Jawaban:

212

Objek yang membentuk tulang punggung aplikasi Anda dan yang dikelola oleh wadah Spring IoC * disebut kacang. Kacang adalah objek yang dipakai, dirakit, dan dikelola oleh wadah Spring IoC. Kacang ini dibuat dengan metadata konfigurasi yang Anda berikan ke wadah, misalnya, dalam bentuk <bean/>definisi XML .

Lebih banyak belajar tentang kacang dan ruang lingkup dari SpringSource :

Saat Anda membuat definisi kacang, apa yang sebenarnya Anda buat adalah resep untuk membuat contoh aktual dari kelas yang ditentukan oleh definisi kacang itu. Gagasan bahwa definisi kacang adalah resep adalah penting, karena artinya, seperti kelas, Anda dapat berpotensi membuat banyak instance objek yang dibuat dari satu resep tunggal.

Anda dapat mengontrol tidak hanya berbagai dependensi dan nilai konfigurasi yang akan dicolokkan ke objek yang dibuat dari definisi kacang tertentu, tetapi juga ruang lingkup objek yang dibuat dari definisi kacang tertentu. Pendekatan ini sangat kuat dan memberi Anda fleksibilitas untuk memilih ruang lingkup objek yang Anda buat melalui konfigurasi alih-alih harus 'memanggang' ruang lingkup objek di tingkat kelas Java. Kacang dapat didefinisikan untuk ditempatkan di salah satu dari sejumlah lingkup

* IoC: Pembalikan Kontrol

Juned Ahsan
sumber
10
Jadi ini adalah objek yang dikelola wadah dan saya tidak perlu menyentuh, tetapi jika saya ingin akses ke kacang untuk memanggil beberapa metode atau mengambil properti, maka saya bisa "meminta" Spring untuk kacang?
grantmcconnaughey
22
@grantmc Seperti itu, kecuali inversi hal kontrol yang seharusnya dipahami sebagai kebalikan dari "meminta": alih-alih "meminta" hal-hal, Anda "menyatakan" bahwa Anda akan membutuhkannya. Dan kemudian, ketika Anda memulai aplikasi, kerangka kerja akan memeriksa semua deklarasi dan mengatur contoh yang sesuai.
Elias Dorneles
6
@elias Bagaimana saya menyatakan bahwa saya membutuhkannya? Apakah saat saya menggunakan @Autowired? Atau hanya ketika saya melakukan tugas saya import?
Mikhail Batcer
16
Akan sangat membantu untuk mendefinisikan apa arti IoC untuk pendatang baru Spring.
Lucas
4
@ Lucas Setuju. IoC adalah "Inversion of Control". Lihat T&J yang sangat baik: Apa itu Injeksi Ketergantungan dan Inversi Kontrol dalam Kerangka Kerja Pegas? dan Apa itu Pembalikan Kontrol? .
mhradek
135

Kacang pegas adalah objek instan yang dikelola oleh wadah Spring, yaitu, mereka dibuat dan ditransfer oleh kerangka kerja dan dimasukkan ke dalam "kantong benda" (wadah) dari mana Anda bisa mendapatkannya nanti.

Bagian "perkabelan" di sana adalah apa yang dimaksud dengan injeksi ketergantungan, apa artinya adalah Anda hanya bisa mengatakan "Saya akan membutuhkan hal ini" dan kerangka kerja akan mengikuti beberapa aturan untuk memberi Anda contoh yang tepat.

Untuk seseorang yang tidak terbiasa dengan Spring, saya pikir artikel Wikipedia Spring memiliki deskripsi yang bagus :

Pusat Kerangka Kerja Pegas adalah inversi wadah kontrolnya, yang menyediakan cara yang konsisten untuk mengkonfigurasi dan mengelola objek Java menggunakan refleksi. Wadah bertanggung jawab untuk mengatur siklus hidup objek dari objek tertentu: membuat objek ini, memanggil metode inisialisasi mereka, dan mengkonfigurasi objek-objek ini dengan menghubungkannya bersama-sama.

Objek yang dibuat oleh wadah juga disebut benda yang dikelola atau kacang . Kontainer dapat dikonfigurasi dengan memuat file XML atau mendeteksi anotasi Java khusus pada kelas konfigurasi. Sumber data ini berisi definisi kacang yang menyediakan informasi yang diperlukan untuk membuat kacang.

Objek dapat diperoleh dengan cara pencarian ketergantungan atau injeksi ketergantungan . Ketergantungan lookup adalah pola di mana penelepon meminta objek objek untuk objek dengan nama tertentu atau jenis tertentu. Ketergantungan injeksi adalah pola di mana wadah melewati objek dengan nama ke objek lain, baik melalui konstruktor, properti, atau metode pabrik.

Elias Dorneles
sumber
Sebuah instance hanyalah kata lain untuk objek. Saat Anda menggunakan "objek objek" bukankah Anda mengatakan objek objek?
Flame of udun
Pertanyaan menarik. Menurut Wikipedia saya harus mengatakan "objek instan" sebagai gantinya: en.wikipedia.org/wiki/Instance_(computer_science)
Elias Dorneles
2
Lubang kelinci masuk lebih dalam.
Flame of udun
Saya menyadari hari ini bahwa "objek objek" (dan karenanya objek contoh) sebenarnya masuk akal bagi saya karena saya terbiasa dengan bahasa di mana kelas juga merupakan objek (jadi Anda memiliki objek kelas, dan, yah, objek "objek" ). Bagaimanapun, saya telah memperbarui deskripsi untuk menggunakan "objek instan" sesuai artikel Wikipedia. ^^
Elias Dorneles
1
@Ruizhi objek biasa, yaitu instance kelas - diskusi ini adalah sidetrack tentang penggunaan ekspresi yang benar untuk merujuk ke objek. :)
Elias Dorneles
50

Pertama mari kita pahami Spring:

Musim semi adalah kerangka kerja yang ringan dan fleksibel.

Analogi:
masukkan deskripsi gambar di sini

Bean: adalah objek, yang dibuat, dikelola, dan dihancurkan di Spring Container. Kami dapat menyuntikkan objek ke Spring Container melalui metadata (baik xml atau anotasi), yang disebut inversi kontrol.

Analogi: Mari kita asumsikan petani memiliki lahan pertanian yang ditanami dengan biji (atau kacang-kacangan). Di sini, Farmer adalah Spring Framework, Farmland land adalah Spring Container, Beans adalah Spring Beans, Budidaya adalah Spring Processors.

masukkan deskripsi gambar di sini

Seperti siklus hidup kacang, kacang musim semi juga memiliki siklus hidupnya sendiri.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

sumber img

Berikut ini adalah urutan siklus hidup kacang di Musim Semi:

  • Instantiate: Pertama wadah musim semi menemukan definisi kacang dari file XML dan instantiates bean.

  • Populate properties: Menggunakan injeksi dependensi, spring mengisi semua properti seperti yang ditentukan dalam definisi bean.

  • Set Bean Name: Jika bean mengimplementasikan BeanNameAwareantarmuka, pegas meneruskan id kacang ke setBeanName()metode.

  • Set Bean factory: Jika Bean mengimplementasikan BeanFactoryAwareantarmuka, pegas melewatkan beanfactory ke setBeanFactory()metode.

  • Pra-Inisialisasi: Disebut juga post process of bean. Jika ada kacang BeanPostProcessors terkait dengan kacang, postProcesserBeforeInitialization()metode panggilan Spring .

  • Inisialisasi kacang: Jika kacang mengimplementasikan IntializingBean, afterPropertySet()metodenya disebut. Jika kacang memiliki deklarasi metode init, metode inisialisasi yang ditentukan dipanggil.

  • Pasca Inisialisasi: - Jika ada yang BeanPostProcessorsterkait dengan kacang, postProcessAfterInitialization()metode mereka akan dipanggil.

  • Siap digunakan: Sekarang kacang siap digunakan oleh aplikasi

  • Hancurkan: Jika kacang diimplementasikan DisposableBean, itu akan memanggil destroy()metode

Premraj
sumber
23

Yah Anda memahaminya sebagian. Anda harus menyesuaikan kacang sesuai dengan kebutuhan Anda dan menginformasikan wadah Musim Semi untuk mengelolanya saat diperlukan, dengan menggunakan metodologi yang dikenal sebagai IoC ( Inversion of Control ) yang diciptakan oleh Martin Fowler , juga dikenal sebagai Dependency Injection (DI).

Anda memasang biji dengan cara tertentu, sehingga Anda tidak harus merawat instantiating atau mengevaluasi ketergantungan pada kacang. Ini dikenal sebagai Prinsip Hollywood .

Google adalah alat terbaik untuk mengeksplorasi lebih lanjut tentang ini selain tautan Anda akan kebanjiran di sini dalam pertanyaan ini. :)

dmahapatro
sumber
2
Tidak dapat menunjukkan bahwa IoC adalah konsepnya, dan DI adalah (salah satu) teknik yang dapat digunakan untuk mencapai IoC, mereka bukan definisi yang dapat diganti.
kekko12
9

Spring memiliki wadah IoC yang membawa Bag of Bean; pemeliharaan dan penghapusan kreasi adalah tanggung jawab Spring Container. Kita bisa memasukkan kacang ke Spring oleh Wiring dan Auto Wiring. Pengkabelan berarti kita mengkonfigurasi secara manual ke dalam file XML dan "Pengkabelan Otomatis" berarti kita meletakkan anotasi dalam file Java lalu Spring secara otomatis memindai konteks akar di mana file konfigurasi java, membuatnya dan memasukkannya ke dalam kantong Spring.

Berikut ini rincian URI tempat Anda mendapatkan informasi lebih lanjut tentang Kacang

Yasir Shabbir Choudhary
sumber
8

Kacang semi adalah kelas. Alih-alih membuat instance kelas (menggunakan new), Anda mendapatkan contoh sebagai beanpemain untuk tipe kelas Anda dari konteks aplikasi, di mana kacang adalah apa yang Anda konfigurasikan dalam konfigurasi konteks aplikasi. Dengan cara ini, seluruh aplikasi mempertahankan instance singleton-scope di seluruh aplikasi. Semua kacang diinisialisasi mengikuti pesanan konfigurasi mereka tepat setelah konteks aplikasi instantiated. Bahkan jika Anda tidak mendapatkan kacang apa pun dalam aplikasi Anda, semua instance kacang sudah dibuat sesaat setelah Anda membuat konteks aplikasi.

Downhillski
sumber
1
Kacang bukanlah kelas, tetapi objek sebagai instance kelas, dikelola oleh implementasi wadah.
Chatatata
7
  • Kacang musim semi hanyalah contoh objek yang dikelola oleh wadah Musim Semi IOC.

  • Spring IOC container membawa Bag of Bean. Kreasi, pemeliharaan, dan penghapusan Bean adalah tanggung jawab Spring Container.

  • Kita bisa memasukkan kacang ke Spring oleh Wiring dan Auto Wiring.

  • Pengkabelan berarti kami mengkonfigurasinya secara manual ke dalam file XML.

  • Pengkabelan otomatis berarti kita meletakkan anotasi dalam file Java lalu Spring secara otomatis memindai konteks root di mana file konfigurasi java, membuatnya dan dimasukkan ke dalam kantong Spring.

maniBrock
sumber
7

A Bean adalah POJO (Plain Old Java Object), yang dikelola oleh wadah pegas.

Wadah musim semi hanya membuat satu instance kacang secara default. Kacang ini di-cache dalam memori sehingga semua permintaan kacang akan mengembalikan referensi yang dibagikan ke kacang yang sama.

Anotasi @Bean mengembalikan objek yang muncul register sebagai kacang dalam konteks aplikasi. Logika di dalam metode bertanggung jawab untuk membuat instance.

Kapan kita menggunakan anotasi @Bean?

Ketika konfigurasi otomatis bukan opsi. Misalnya ketika kita ingin mengirim komponen dari pustaka pihak ketiga, karena kode sumber tidak tersedia sehingga kita tidak dapat membubuhi keterangan kelas dengan @Component.

Skenario waktu nyata adalah seseorang ingin terhubung ke Amazon S3 bucket. Karena sumbernya tidak tersedia, ia harus membuat @bean.

@Bean
public AmazonS3 awsS3Client() {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
    return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}

Sumber untuk kode di atas -> https://www.devglan.com/spring-mvc/aws-s3-java

Karena saya menyebutkan @Component Annotation di atas.

@Component Menunjukkan bahwa kelas beranotasi adalah "komponen". Kelas semacam itu dianggap sebagai kandidat untuk deteksi otomatis ketika menggunakan konfigurasi berbasis anotasi dan pemindaian jalur kelas.

Anotasi komponen mendaftarkan kelas sebagai satu kacang.

IonKat
sumber
2

Di Musim Semi, objek yang membentuk tulang punggung aplikasi Anda dan yang dikelola oleh wadah Spring IoC disebut sebagai kacang. Kacang hanya objek yang dipakai, dirakit dan dikelola oleh wadah Spring IoC;

pengguna3472473
sumber
1

Untuk Musim Semi, semua objek adalah kacang! Langkah mendasar dalam Kerangka Pegas adalah mendefinisikan objek Anda sebagai kacang. Kacang hanyalah contoh objek yang akan dibuat oleh kerangka kerja pegas dengan melihat definisi kelas mereka. Definisi-definisi ini pada dasarnya membentuk metadata konfigurasi. Kerangka kerja kemudian membuat rencana untuk objek yang perlu dipakai, yang dependensi perlu ditetapkan dan disuntikkan, ruang lingkup contoh yang baru dibuat, dll, berdasarkan metadata konfigurasi ini.

Metadata dapat diberikan dalam file XML sederhana, seperti pada bab pertama. Atau, seseorang dapat memberikan metadata sebagai Anotasi atau Konfigurasi Java.

Buku: Just Spring

BERGUIGA Mohamed Amine
sumber
1

Konfigurasi XML Spring terdiri dari Beans dan Beans pada dasarnya adalah kelas. Itu hanya POJO yang kami gunakan di dalam ApplicationContext kami. Mendefinisikan Kacang dapat dianggap sebagai mengganti kata kunci baru. Jadi di mana pun Anda menggunakan kata kunci baru di aplikasi Anda, seperti:

MyRepository myRepository =new MyRepository ();

Di mana Anda menggunakan kata kunci baru itu di suatu tempat Anda dapat melihat menghapus konfigurasi itu dan menempatkannya dalam file XML. Jadi kita akan kode seperti ini:

<bean name="myRepository " 
      class="com.demo.repository.MyRepository " />

Sekarang kita cukup menggunakan Setter Injection / Constructor Injection. Saya menggunakan Setter Injection.

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
Muhammad Waqas Dilawar
sumber