Dünyada bahar fasulyeleri nelerdir?


397

Henüz anlayabildiğim bahar çekirdeklerinin üst düzey bir tanımını bulamıyorum. Onları sık sık Grails belgelerinde ve kitaplarında referans aldığını görüyorum, ancak bunların ne olduğunu anlamanın faydalı olacağını düşünüyorum. Bahar fasulyesi nedir? Nasıl kullanılabilirler? Bağımlılık Enjeksiyonu ile ilgili bir şeyleri var mı?


2
Grails, Spring üzerine inşa edilmiştir. Spring'e aşina değilseniz, kullandığınız teknolojileri anlamanız için en azından bazı materyalleri okumanızı öneririm.
Jeff Storey

26
Bence buradaki yorumlar OP'nin Grails belgelerindeki ve kitaplarındaki referanslarda gördüğü aynı sorundan muzdariptir: sadece ne anlama geldiğini zaten bilen insanlar için kolaydır. Wikipedia makalesinin yeni başlayanlar için çok daha iyi tanımladığını görüyorum.
Elias Dorneles

12
@MarcoForberg, Spring'in eski versiyonunun Google'da en çok hit olmasının nedenlerinden biri, insanların SO ... static.springsource.org/spring/docs/3.2.x/… gibi yerlerden bağlantı kurmaya devam etmelerinden kaynaklanıyor. bugün başlamak için bir yer.
Ian Roberts

5
+1 @IanRoberts. İşte mevcut olan .
dmahapatro

IoC'nin DI olarak da bilindiğini söyleyerek IoC'yi tanıtmaya yardımcı olmuyor. İlişkiler evet, ancak IoC çok daha geniş.
Aluan Haddad

Yanıtlar:


212

Uygulamanızın omurgasını oluşturan ve Spring IoC * konteyneri tarafından yönetilen nesnelere fasulye denir. Fasulye bir Spring IoC konteyneri tarafından başlatılan, bir araya getirilen ve başka şekilde yönetilen bir nesnedir. Bu çekirdekler, kapsayıcıya sağladığınız yapılandırma meta verileriyle, örneğin XML <bean/>tanımları biçiminde oluşturulur .

SpringSource'tan fasulye ve kapsam hakkında daha fazla bilgi için :

Bir fasulye tanımı oluşturduğunuzda, aslında oluşturduğunuz şey, o fasulye tanımı tarafından tanımlanan sınıfın gerçek örneklerini oluşturmak için bir reçetedir. Fasulye tanımının bir reçete olduğu fikri önemlidir, çünkü bu, tıpkı bir sınıf gibi, potansiyel olarak tek bir tariften yaratılmış birçok nesne örneğine sahip olabileceğiniz anlamına gelir.

Yalnızca belirli bir fasulye tanımından oluşturulan bir nesneye takılacak çeşitli bağımlılıkları ve yapılandırma değerlerini değil, aynı zamanda belirli bir fasulye tanımından oluşturulan nesnelerin kapsamını da kontrol edebilirsiniz. Bu yaklaşım çok güçlüdür ve Java sınıf düzeyinde bir nesnenin kapsamını 'pişirmek' yerine yapılandırma yoluyla oluşturduğunuz nesnelerin kapsamını seçme esnekliği sağlar. Fasulye, birkaç kapsamdan birine yerleştirilecek şekilde tanımlanabilir

* IoC: Kontrolün Ters Çevrilmesi


10
Yani bunlar konteynerin yönettiği nesneler ve dokunmak zorunda değilim, ama bazı yöntemleri çağırmak veya özellikleri almak için bir fasülyeye erişmek istersem, o zaman fasulye için "sorabilir miyim"?
grantmcconnaughey

22
@grantmc Böyle bir şeydir, ancak kontrol olayının tersine çevrilmesinin "sor" un tersi olarak anlaşılması beklenir: şeyleri "sormak" yerine, buna ihtiyacınız olduğunu "beyan edersiniz". Ve sonra, uygulamayı başlattığınızda, çerçeve tüm bildirimleri kontrol eder ve uygun örneği ayarlar.
Elias Dorneles

6
@elias İhtiyacım olduğunu nasıl beyan ederim? Kullanırken @Autowiredmi? Ya benim basitçe ne zaman imports?
Mikhail Batcer

16
IoC'nin yeni başlayanlar için ne anlama geldiğini tanımlamak faydalı olacaktır.
Lucas

4
@lucas Kabul etti. IoC "Kontrolün Ters Çevrilmesi" dir. Mükemmel Soru ve Cevaplara Bakın: Bahar Çerçevesinde Bağımlılık Enjeksiyonu ve Kontrolün Ters Çevrilmesi Nedir? ve Kontrolün Ters Çevrilmesi Nedir? .
mhradek

135

Bahar çekirdekleri sadece Bahar konteyner tarafından yönetilen örnek nesnelerdir, yani çerçeve tarafından oluşturulur ve kablolanır ve daha sonra alabileceğiniz bir "nesne çantası" (konteyner) içine konurlar.

"Kablolama" kısmı bağımlılık enjeksiyonunun ne olduğu hakkındadır, bunun anlamı sadece "Bu şeye ihtiyacım olacak" diyebilmenizdir ve çerçeve size uygun örneği almak için bazı kurallara uyacaktır.

Spring'e alışkın olmayan biri için, Wikipedia Spring'in makalesinin güzel bir açıklaması olduğunu düşünüyorum :

Spring Framework'ün merkezinde, yansıma kullanarak Java nesnelerini yapılandırmak ve yönetmek için tutarlı bir yol sağlayan kontrol konteynerinin ters çevrilmesidir. Kapsayıcı, belirli nesnelerin nesne yaşam döngülerini yönetmekten sorumludur: bu nesneleri oluşturmak, başlatma yöntemlerini çağırmak ve bu nesneleri birbirine bağlayarak yapılandırmak.

Kap tarafından oluşturulan nesnelere yönetilen nesneler veya fasulye de denir . Kap, XML dosyalarını yükleyerek veya yapılandırma sınıflarındaki belirli Java ek açıklamalarını algılayarak yapılandırılabilir. Bu veri kaynakları, çekirdekleri oluşturmak için gerekli bilgileri sağlayan fasulye tanımlarını içerir.

Nesneler, bağımlılık araması veya bağımlılık enjeksiyonu yoluyla elde edilebilir . Bağımlılık araması , arayanın kap nesnesini belirli bir ada veya belirli bir türe sahip bir nesne istediğinde bulunan bir kalıptır. Bağımlılık enjeksiyonu , kabın nesneleri yapıcılar, özellikler veya fabrika yöntemleri aracılığıyla diğer nesnelere adıyla geçirdiği bir modeldir.


Bir örnek, nesneler için yalnızca başka bir kelimedir. "Nesne örnekleri" kullandığınızda nesne nesneleri söylemiyor musunuz?
Udun Alevi

İlginç soru. Wikipedia'ya göre bunun yerine "örnek nesneler" demeliyim: en.wikipedia.org/wiki/Instance_(computer_science)
Elias Dorneles

2
Tavşan deliği daha derine iniyor.
Udun Alevi

Bugün "nesne nesneleri" nin (ve bu nedenle nesne örneklerinin) aslında bana mantıklı olduğunu fark ettim çünkü bir sınıfın aynı zamanda bir nesne olduğu dillere de alışkınım (yani sınıf nesneleriniz var, ve "nesne" nesnelerin ). Her neyse, Wikipedia makalesine göre "örnek nesneleri" kullanmak için açıklamayı güncelledim. ^^
Elias Dorneles

1
@ Düzenli bir nesneyi, yani bir sınıf örneğini ruizhi - bu tartışma, bir nesneye başvurmak için doğru ifadeyi kullanma hakkında bir açıklamadır. :)
Elias Dorneles

50

İlk önce Baharı anlayalım:

Bahar hafif ve esnek bir çerçevedir.

Analoji:
resim açıklamasını buraya girin

Fasulye: Spring Container'da yaratılan, yönetilen ve imha edilen bir nesnedir. Denetimin ters çevrilmesi denilen meta veriler (xml veya ek açıklama) aracılığıyla Bahar Kapsayıcısına bir nesne enjekte edebiliriz.

Analoji: Çiftçinin tohum (veya fasulye) ile yetiştirilen bir tarım arazisine sahip olduğunu varsayalım. Burada, çiftçi bahar çerçeve, tarım arazileri arazi bahar konteyner, fasulye bahar fasulye, yetiştirme bahar işlemciler.

resim açıklamasını buraya girin

Fasulye yaşam döngüsü gibi, bahar fasulyeleri de kendi yaşam döngüsüne sahiptir.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

img kaynağı

İlkbaharda bir fasulye yaşam döngüsünün sırası aşağıdadır:

  • Örnek: İlk olarak bahar kap, çekirdeğin tanımını XML dosyasından bulur ve çekirdeği başlatır.

  • Özellikleri doldurma: Yay, bağımlılık enjeksiyonunu kullanarak, fasulye tanımında belirtilen tüm özellikleri doldurur.

  • Fasulye Adını Ayarla: Fasulye BeanNameAwarearayüzü uygularsa , yay fasulyenin kimliğini setBeanName()yönteme geçirir .

  • Fasulye fabrikasını ayarla: Fasulye BeanFactoryAwarearayüzü uygularsa , bahar fasulyeyi setBeanFactory()yönteme geçirir .

  • Başlangıç ​​Öncesi: Fasulye sonrası süreç olarak da adlandırılır. Fasulye ile ilişkili herhangi bir fasulye BeanPostProcessors varsa, Bahar postProcesserBeforeInitialization()yöntemini çağırır .

  • Fasulyeleri başlatın: Fasulye uygularsa IntializingBean, afterPropertySet()yöntemi denir. Çekirdeğin başlatma yöntemi bildirimi varsa, belirtilen başlatma yöntemi çağrılır.

  • Başlatma Sonrası: - BeanPostProcessorsFasulye ile ilişkili varsa , postProcessAfterInitialization()yöntemleri çağrılır.

  • Kullanıma hazır: Şimdi fasulye uygulama tarafından kullanıma hazır

  • Yok et: Fasulye uygularsa DisposableBean, destroy()yöntemi çağıracaktır.


23

Eh, kısmen anladın. Fasulyeleri ihtiyacınıza göre uyarlamalı ve Bağımlılık Enjeksiyonu (DI) olarak da bilinen Martin Fowler tarafından oluşturulan IoC ( Kontrolün İnversiyonu ) olarak bilinen bir metodoloji kullanarak Spring konteyneri gerektiğinde yönetmek için bilgilendirmelisiniz .

Çekirdekleri bir şekilde teller, böylece somutlaştırmaya dikkat etmeniz veya çekirdeğe herhangi bir bağımlılığı değerlendirmeniz gerekmez. Bu popüler olarak Hollywood Prensibi olarak bilinir .

Google, bu soruda su basmış olacağınız bağlantılara ek olarak bununla ilgili daha fazla bilgi edinmek için en iyi araçtır. :)


2
IoC'nin kavram olduğunu ve DI'nin (IoC) elde etmek için kullanılabilecek teknik (biri) olduğunu gösteremez, bunlar değiştirilebilir tanımlar değildir.
kekko12

9

Bahar Fasulye Torbası taşıyan IoC konteyner var; Yaratılışın korunması ve silinmesi Spring Container'ın sorumluluklarıdır. Kablolama ve Otomatik Kablolama ile fasulyeyi İlkbahara koyabiliriz. Kablolama, XML dosyasına manuel olarak yapılandırdığımız anlamına gelir ve "Otomatik Kablolama", Java dosyasındaki ek açıklamaları koyduğumuz anlamına gelir, ardından Bahar, java yapılandırma dosyasının bulunduğu kök bağlamı otomatik olarak tarar, yapar ve Spring çantasına koyarız.

Fasulye hakkında daha fazla bilgiye sahip olduğunuz detay URI'sı


8

Bahar fasulyesi sınıflardır. Bir sınıfı başlatmak (kullanarak new) yerine,bean , uygulama bağlamından sınıf türünüze döküm ; burada çekirdek, uygulama bağlamı yapılandırmasında yapılandırdığınız şeydir. Bu şekilde, tüm uygulama, uygulama boyunca tek kapsamlı örneği korur. Tüm çekirdekler, uygulama içeriği somutlaştırıldıktan hemen sonra yapılandırma sıralarına göre başlatılır. Uygulamanızda herhangi bir fasulye almasanız bile, tüm fasulye örnekleri uygulama bağlamını oluşturduktan hemen sonra oluşturulur.


1
Fasulye sınıflar değil , bir konteyner uygulaması tarafından yönetilen sınıf örnekleri olarak nesnelerdir.
Chatatata

7
  • Bahar çekirdekleri sadece Spring IOC konteyneri tarafından yönetilen nesne örnekleridir.

  • Bahar IOC konteyner Fasulye Torbası taşır.Bean oluşturma, bakım ve silme Bahar Konteyner sorumluluklarıdır.

  • Kablolama ve Otomatik Kablolama ile fasulyeyi İlkbahara koyabiliriz.

  • Kablolama, XML dosyasına manuel olarak yapılandırdığımız anlamına gelir.

  • Otomatik Kablolama, ek açıklamaları Java dosyasına koyduğumuz, ardından Bahar otomatik olarak java yapılandırma dosyasının bulunduğu kök bağlamı tarar, yapar ve Spring çantasına koyarız.


7

Fasulye, bahar konteyneri tarafından yönetilen bir POJO'dur (Düz Eski Java Nesnesi).

Yaylı kaplar varsayılan olarak çekirdeğin sadece bir örneğini oluşturur. Bu fasulye bellekte önbelleğe alınır, böylece fasulye için tüm istekler aynı çekirdeğe paylaşılan bir referans döndürür.

@Bean ek açıklaması, uygulama bağlamında yayın fasulye olarak kaydedildiği bir nesne döndürür. Yöntemin içindeki mantık, örneği oluşturmaktan sorumludur.

@Bean ek açıklamasını ne zaman kullanıyoruz?

Otomatik yapılandırma bir seçenek olmadığında. Örneğin, bileşenleri üçüncü taraf kitaplığından bağlamak istediğimizde, kaynak kodu kullanılamadığından, sınıflara @Component ile ek açıklama ekleyemeyiz.

Gerçek zamanlı senaryo, birisinin Amazon S3 grubuna bağlanmak istemesi olabilir. Kaynak mevcut olmadığından, @bean yaratması gerekir.

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

Yukarıdaki kod için kaynak -> https://www.devglan.com/spring-mvc/aws-s3-java

Çünkü yukarıdaki @Bileşen Açıklaması'ndan bahsetmiştim.

@Component Açıklamalı bir sınıfın "bileşen" olduğunu belirtir. Bu sınıflar, ek açıklama tabanlı yapılandırma ve sınıf yolu taraması kullanılırken otomatik algılama adayları olarak kabul edilir.

Bileşen açıklaması, sınıfı tek bir fasulye olarak kaydeder.


2

İlkbaharda, uygulamanızın omurgasını oluşturan ve Spring IoC konteyneri tarafından yönetilen nesnelere fasulye denir. Fasulye basitçe bir Spring IoC konteyneri tarafından başlatılan, bir araya getirilen ve başka şekilde yönetilen bir nesnedir;


1

Bahar için tüm nesneler fasulye! Bahar Çerçevesinin temel adımı nesnelerinizi fasulye olarak tanımlamaktır. Fasulye, sınıf tanımlarına bakarak bahar çerçevesi tarafından yaratılacak nesne örneklerinden başka bir şey değildir. Bu tanımlar temel olarak yapılandırma meta verilerini oluşturur. Çerçeve daha sonra bu yapılandırma meta verilerine dayanarak nesnelerin somutlaştırılması, hangi bağımlılıkların ayarlanması ve enjekte edilmesi gerektiği, yeni oluşturulan örneğin kapsamı vb.

Meta veriler, tıpkı ilk bölümde olduğu gibi basit bir XML dosyasında sağlanabilir. Alternatif olarak, meta veriler Ek Açıklama veya Java Yapılandırması olarak sağlanabilir.

Kitap: Just Spring


1

Spring'in XML konfigürasyonu Fasulyeden oluşur ve Fasulye temelde sınıflardır. Bunlar sadece ApplicationContext içinde kullandığımız POJO'lar. Fasulye tanımlamak yeni anahtar kelimeyi değiştirmek olarak düşünülebilir. Dolayısıyla, uygulamanızda yeni anahtar kelimeyi nerede kullanırsanız kullanın:

MyRepository myRepository =new MyRepository ();

Bu anahtar kelimeyi nerede kullandığınız yeni yerde bu yapılandırmayı kaldırıp bir XML dosyasına yerleştirmeye bakabilirsiniz. Yani şöyle kodlayacağız:

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

Şimdi sadece Setter Enjeksiyon / Yapıcı Enjeksiyonunu kullanabiliriz. Setter Injection kullanıyorum.

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.