it-swarm.asia

Bahar çerçevesi ne yapar? Kullanmalı mıyım? Neden ya da neden olmasın?

Bu yüzden, Java'da yepyeni bir projeye başlıyorum ve Spring'i kullanmayı düşünüyorum. Neden Spring'i düşünüyorum? Çünkü birçok insan bana Bahar kullanmam gerektiğini söylüyor! Cidden, insanların Bahar'ın tam olarak ne olduğunu veya ne yaptığını açıklamalarını sağlamaya çalıştığımda, bana asla doğrudan bir cevap veremezler. SpringSource sitesindeki tanıtımları kontrol ettim ve bunlar gerçekten karmaşık veya gerçekten öğretici odaklı ve hiçbiri bana neden kullanmam gerektiğine veya hayatımı nasıl kolaylaştıracağına dair iyi bir fikir vermiyor. Bazen insanlar beni daha da şaşırtan "bağımlılık enjeksiyonu" terimini atıyorlar çünkü bence bu terimin ne anlama geldiğine dair farklı bir anlayışa sahibim.

Her neyse, işte arka planım ve uygulamam hakkında biraz bilgi:

Java bir süredir gelişiyor, arka uç web geliştirme yapıyor. Evet, tonlarca birim testi yapıyorum. Bunu kolaylaştırmak için, genellikle bir yöntemin (en azından) iki sürümünü yapıyorum : örnek değişkenleri kullanan biri ve yalnızca yönteme iletilen değişkenleri kullanan örnek bir örnek değişkenleri kullanan diğeri örnek değişkenlerini sağlayarak diğerini çağırır. nesneler yukarı ve sonra örnek değişkenleri kullanmayan yönteme çağrılar .. Bu her zaman "bağımlılık enjeksiyon" olarak anladım.

Uygulamam CS perspektifinden oldukça basit. Küçük proje, 1-2 geliştirici ile başlayalım. Çoğunlukla bir grup arama ile CRUD tipi işlemler. Temelde bir grup RESTful web hizmeti, bir web ön ucu ve sonunda bazı mobil istemciler. Düz HTML/CSS/JS/JQuery ön uç yapmayı düşünüyorum, bu yüzden JSP kullanmak için gerçek bir plan yok. Web hizmetlerini uygulamak için Hazırda Bekletme'yi ORM ve Jersey olarak kullanma.

Zaten kodlamaya başladım ve orada alışveriş yapabileceğim ve kimsenin yatırım yapmak isteyip istemediğini görebileceğim bir demo almaya gerçekten hevesliyim. Açıkçası zaman çok önemlidir. Spring'in öğrenme eğrisine sahip olduğunu anlıyorum, artı tipik olarak veba gibi kaçınmaya çalıştığım bir sürü XML yapılandırması gerektiriyor gibi görünüyor. Ama eğer hayatımı kolaylaştırabilirse ve (özellikle) daha hızlı geliştirme ve test yapabiliyorsa, mermiyi ısırmaya ve Bahar öğrenmeye hazırım.

Yani lütfen. Beni eğit. Bahar kullanmalı mıyım? Neden ya da neden olmasın?

245
sangfroid

Bahar çerçevesi ne yapar? Kullanmalı mıyım? Neden ya da neden olmasın?

Bahar, farklı bileşenleri bir araya getirmenize yardımcı olan bir çerçevedir. Çok fazla bileşene sahip olduğunuz durumlarda ve bunları farklı şekillerde birleştirmeye karar verebileceğiniz veya farklı ayarlara veya ortamlara bağlı olarak bir bileşeni diğeriyle değiştirmeyi kolaylaştırabileceğiniz durumlarda en kullanışlıdır.

Bu her zaman "bağımlılık enjeksiyonu" olduğunu anladım.

Farklı bir tanım öneririm:

"Nesnelerinizi, bu bağımlılıkların her zaman herhangi biri normal işlerini yapmaya başlamalarını istemeden önce enjekte edildi . "

Bunu şununla karşılaştırın: "Her nesne, dışarı çıkıp ihtiyaç duyduğu her şeyi ve ihtiyacı olan herkesi bulmaktan sorumludur."

bir sürü XML yapılandırması gerektiriyor gibi görünüyor

XML (veya ek açıklama tabanlı) öğelerin çoğu, Spring öğelerini şöyle anlatıyor:

  • Birisi "HammerStore" istediğinde, bir example.HammerStore Örneği oluşturmanızı ve geri vermenizi istiyorum. Yalnızca bir mağaza olması gerektiğinden, örneği bir dahaki sefere önbelleğe alın.
  • Birisi "SomeHammer" istediğinde, kendinizden bir "HammerStore" istemenizi ve mağazanın makeHammer() yönteminin sonucunu döndürmenizi istiyorum. Bu sonucu önbelleğe almayın .
  • Birisi "SomeWrench" istediğinde, example.WrenchImpl Örneğini oluşturmanızı istiyorum, gaugeAmount yapılandırma ayarını kullanın ve örneğin setWrenchSize() özelliğine koyun. Sonucu önbelleğe almayın.
  • Birisi "LocalPlumber" istediğinde, example.PlumberImpl Örneğini oluşturmanızı istiyorum. "Pedro" dizesini setName() yöntemine, setHammer() yöntemine bir "SomeHammer" koyun ve setWrench() yöntemine bir "SomeWrench" koyun. Sonucu döndürün ve yalnızca bir tesisatçıya ihtiyacımız olduğu için sonucu daha sonra önbelleğe alın.

Bu şekilde, Spring bileşenlerinizin bağlantı kurmasına, etiketlemesine, yaşam döngülerini/önbelleklerini kontrol etmesine ve yapılandırmaya bağlı olarak davranışlarını değiştirmesine izin verir.

[Test] işlemini kolaylaştırmak için genellikle bir yöntemin (en azından) iki sürümünü yaparım: biri örnek değişkenleri, diğeri ise yalnızca yönteme iletilen değişkenleri kullanır.

Bu benim için çok fazla fayda sağlamak için çok fazla yük gibi geliyor. Bunun yerine, örnek değişkenlerinizin protected veya paket görünürlüğü olmasını sağlayın ve birim testlerini aynı com.mycompany.whatever Paketinde bulun. Bu şekilde, test sırasında istediğiniz zaman örnek değişkenlerini inceleyebilir ve değiştirebilirsiniz.

113
Darien

İlk olarak, bağımlılık enjeksiyonu nedir?

Basit. Bir sınıfınız var, özel bir alanı var (null olarak ayarlanmış) ve bu alanın değerini sağlayan bir genel ayarlayıcı bildiriyorsunuz. Başka bir deyişle, sınıfın (alana) bağımlılığı harici bir sınıf tarafından (ayarlayıcı aracılığıyla) enjekte edilmektedir. Bu kadar. Büyülü bir şey yok.

İkincisi, Bahar XML olmadan kullanılabilir (veya çok az)

Spring 3.0.5.GA veya üstü ile dalış yaparsanız JDK6 + 'dan bağımlılık enjeksiyon desteğini kullanabilirsiniz. Bu, @Component ve @Resource ek açıklamalar.

Neden Spring kullanıyorsunuz?

Açıkçası, bağımlılık enjeksiyonu çok kolay ünite testini teşvik eder, çünkü tüm sınıflarınız önemli bağımlılıklar için ayarlayıcılara sahiptir ve bunlar gerekli davranışı sağlamak için favori alaycı çerçevenizi kullanarak kolayca alay edilebilir.

Bu bir yana, Spring ayrıca JEE standart teknolojilerini kullanmak için bir esinti yapmak için temel sınıflar olarak hareket eden birçok şablon da sağlar. Örneğin, JdbcTemplate JDBC ile iyi çalışır, JpaTemplate JPA ile iyi işler yapar, JmsTemplate JMS'yi oldukça basit hale getirir. RestTemplate basitliği ile harika. Örneğin:

RestTemplate restTemplate = new RestTemplate();
MyJaxbObject o = restTemplate.getForObject("https://secure.example.org/results/{param1}?param2={param2}",MyJaxbObject.class,"1","2");

ve işiniz bitti. Parametreler enjekte edilir ve sadece MyJaxbObject için JAXB ek açıklamaları sağlamanız gerekir. Maven JAXB eklentisini kullanarak bir XSD'den otomatik olarak oluşturduysanız, hiç zaman almaz. Orada herhangi bir dökümün olmadığını ve bir mareşalin beyan etmeye gerek olmadığını unutmayın. Her şey senin için yapıldı.

Ben Bahar harikaları hakkında sonsuza dek patlama olabilir, ama belki de yapılacak en iyi şey işlemleri destekleyen bir enjekte DAO veri dışarı pompalamak için RESTful bir web hizmeti telkin deneyin basit bir kod başak deneyin.

69
Gary Rowe

Her şeyden önce, bağımlılık enjeksiyonu anlayışınız temelde yanlış değildir, ancak çoğu insan terimi kullandıklarında ne anlama geldiğinden oldukça farklıdır. Tanımladığınız şey, test edilebilirliğe ulaşmak için oldukça garip ve alışılmadık bir yoldur. Diğer geliştiriciler bu tür kodlardan oldukça şaşkına döneceğinden, bundan uzaklaşmanızı tavsiye ederim.

Genel olarak anlaşıldığı (ve Spring tarafından uygulandığı gibi) bağımlılık enjeksiyonu, bir sınıfın sahip olduğu bağımlılıkların (örneğin, bir JDBC Veri Kaynağı) sınıfın kendisi tarafından alınmadığı, ancak örnek oluşturulduğunda bir kap tarafından "enjekte edildiği" anlamına gelir. Bu nedenle, Datasource kullanan her yöntemin iki sürümüne sahip değilsiniz; bunun yerine, "gerçek" Veri kaynağının enjekte edildiği ve bir taklitin enjekte edildiği bir bağımlılık enjeksiyon yapılandırmanız vardır. Veya, enjeksiyon yapıcı veya alıcı tarafından gerçekleşirse, test kodu enjeksiyonu açıkça yapabilir.

İkincisi, Bahar sadece bağımlılık enjeksiyonu değildir, ancak temel işlevi budur. Ayrıca, gereksinim duyabileceğiniz bildirici işlemler, iş zamanlaması, kimlik doğrulama ve bir dizi diğer işlevsellik (tam teşekküllü bir MVC web çerçevesi dahil) sağlar. Aynı işlevselliği sağlayan diğer çerçeveler de vardır, ancak Bahar dışında yalnızca Java EE'nin hepsine entegre edilmiştir.

29

Neden Spring'i kullanmak istiyorsun, okuyabilirsin http://www.wrox.com/WileyCDA/Section/Why-Use-the-Spring-Framework-.id-130098.html =

Özetle :

  • J2EE uygulamaları aşırı miktarda "sıhhi tesisat" kodu içerir. Birçok kod incelemesi art arda hiçbir şey yapmayan yüksek bir kod oranını ortaya çıkarır: JNDI arama kodu, Nesneleri Aktar, JDBC kaynaklarını almak ve serbest bırakmak için blokları denemek/yakalamak. . . . Bu tür bir sıhhi tesisat kodunun yazılması ve sürdürülmesi, uygulamanın iş alanına odaklanması gereken kaynaklar üzerinde büyük bir tahliye olduğunu kanıtlamaktadır.

  • Birçok J2EE uygulaması, bunun uygun olmadığı yerlerde dağıtılmış bir nesne modeli kullanır. Bu, aşırı kod ve kod çoğaltmasının en önemli nedenlerinden biridir. Birçok durumda da kavramsal olarak yanlıştır; dahili olarak dağıtılan uygulamalar, ortak konumdaki uygulamalardan daha karmaşıktır ve genellikle daha az performans gösterir. Tabii ki, iş gereksinimleriniz dağıtılmış bir mimariyi dikte ederse, dağıtılmış bir mimari uygulamanız ve gerçekleşen ödünleşmeyi kabul etmeniz gerekir (ve Spring bu senaryolarda yardımcı olacak özellikler sunar). Fakat bunu zorlayıcı bir sebep olmadan yapmamalısınız.

  • EJB bileşen modeli aşırı derecede karmaşıktır. EJB, J2EE uygulamalarında iş mantığını uygularken karmaşıklığı azaltmanın bir yolu olarak düşünülmüştür; pratikte bu amaca ulaşamamıştır.

  • EJB aşırı kullanıldı. EJB esasen dahili olarak dağıtılmış, işlemsel uygulamalar için tasarlanmıştır. Önemsiz olan uygulamaların neredeyse tamamı işlemsel olmakla birlikte, dağıtım temel bileşen modeline dahil edilmemelidir.

  • Birçok "J2EE tasarım deseni" aslında tasarım deseni değil, teknoloji sınırlamaları için geçici çözümlerdir. Aşırı dağıtım ve EJB gibi karmaşık API'lerin kullanımı, birçok şüpheli tasarım deseni oluşturmuştur; bunları eleştirel bir şekilde incelemek ve daha basit, daha üretken yaklaşımlar aramak önemlidir.

  • J2EE uygulamaları birim testi zor. J2EE API'leri ve özellikle EJB bileşen modeli, çevik hareket başlamadan önce tanımlandı. Bu nedenle, tasarımları birim test kolaylığını dikkate almaz. Hem API'ler hem de örtülü sözleşmeler yoluyla, EJB'ye dayalı uygulamaları ve bir uygulama sunucusu dışındaki birçok J2EE API'sini test etmek şaşırtıcı derecede zordur. Yine de, bir uygulama sunucusu dışında birim sınama, yüksek sınama kapsamı elde etmek ve bir veritabanına bağlantı kaybı gibi birçok hata senaryosu oluşturmak için gereklidir. Geliştirme veya bakım sürecinde testlerin hızlı bir şekilde yürütülmesini sağlamak ve yeniden dağıtım için bekleyen verimsiz zamanı en aza indirmek de çok önemlidir.

  • Bazı J2EE teknolojileri basitçe başarısız olmuştur. Buradaki ana suçlu, üretkenlik ve nesne yönelimi üzerindeki kısıtlamalarında çok az felaketin kısa olduğu kanıtlanan varlık fasulye.

19
Rudy

Bahar çerçevesi ne yapar?

Bahar bugün olduğu gibi basit bir çerçeve olarak bilinen şey, tam bir ekosistemdir.

Bahar ekosisteminin kapsadığı konular:

  • Yay Çerçevesi (örn. Bağımlılık Enjeksiyonu, AOP ...)

  • Bahar bulut

  • Bahar Verileri

  • Bahar Güvenliği

  • Yaylı Parti

  • Bahar Sosyal

Ekosistemin tam kapsamı için bkz. burada . Projeleri kiraz toplamak mümkündür, böylece DI için Google Guice kullanabilirsiniz ve ör. Güvenlikle ilgili şeyleri yönetmek için Spring Security. Tüm ekosistemi satın almak zorunda değilsiniz.

Bahar çerçevesinin kendisi bugün

  • Bağımlılık Enjeksiyonu

  • Spring'in bildirimsel işlem yönetimini içeren Unsura Dayalı Programlama

  • Bahar MVC web uygulaması ve RESTful web hizmeti çerçevesi

  • JDBC, JPA, JMS için temel destek

Kaynak spring.io

Genel olarak, Spring'in uygulama geliştirme döngünüzü iyileştirmenize veya hızlandırmanıza yardımcı olabilecek, kodda uygulanan Paternler ve Uygulamaların bir koleksiyonu olduğunu söyleyebilirsiniz.

Bunun için (çekirdek çerçeve) en çok bilinen şey bağımlılık enjeksiyonu alanındaki yetenekleridir. Baharın kendisi, ne denir Kontrol konteynerinin ters çevrilmesi veya kısa IoC Konteyner veya daha kısa konteyner (bunun için "bahar "bazen eşanlamlı olarak kullanılır).

Bağımlılık enjeksiyonu nedir?

Bağımlılık enjeksiyonu, nesnenizin harici bir mekanizma yoluyla diğer nesnelere her bağımlılığı aldığı anlamına gelir.

Diyelim ki, bir arabanız var, tipik bir şekilde uygulandığı:

public class Car {

    Engine e;

    public Car() { 
        e = new Engine(); 
    }

}

Araba nesnesi bir motora bağımlıdır. Motor arabanın bir üyesi olarak uygulandığından, örn. bir test motoru.

Şimdi bağımlılık enjeksiyonu devreye giriyor:

public class Car {

    Engine e;

    public Car(Engine e) { 
        this.e = e; 
    }

}

Bundan sonra motorları değiştirebilirsiniz. Yukarıda gördüğünüze kurucu enjeksiyonu denir. Ör. ayarlayıcı - enjeksiyon veya yöntem - enjeksiyon. Spring size bu konuda nasıl yardımcı olur? Yay, enjekte edilecek bileşenleri @Autowired ve enjekte edilen nesnenin kablolarını otomatik olarak yapar - enjekte etmek istediğiniz bileşenin kendisinin bağımlılıkları olabilir. Enjekte edilebilirler - tabiri caizse - @Component

public class Car {

    Engine e;

    @Autowired
    public Car(Engine e) { 
        this.e = e; 
    }

}

Ancak bu, Spring'in sunduğu birçok özellikten sadece biri.

Bahar kullanmalı mıyım? Neden ya da neden olmasın?

Bahar çok müdahaleci olmadığı ve bahar kullanmayı düşünmeniz gereken pek çok yardım sunduğundan. Özellikle yeni projeler için Spring Boot çok çekici. start.spring.io başlamak için bir proje şablonu oluşturmak için kullanımı kolay point'n'click - arayüz sunar. Bir şablonu almak için curl kullanmak bile mümkündür:

curl start.spring.io

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

:: Spring Initializr ::  https://start.spring.io

This service generates quickstart projects that can be easily customized.
Possible customizations include a project's dependencies, Java version, and
build system or build structure. See below for further details.

The services uses a HAL based hypermedia format to expose a set of resources
to interact with. If you access this root resource requesting application/json
as media type the response will contain the following links:
+-----------------+-----------------------------------------+
| Rel             | Description                             |
+-----------------+-----------------------------------------+
| gradle-build    | Generate a Gradle build file            |
| gradle-project  | Generate a Gradle based project archive |
| maven-build     | Generate a Maven pom.xml                |
| maven-project * | Generate a Maven based project archive  |
+-----------------+-----------------------------------------+

...

Öte yandan, spark veya dropwizard gibi çerçeveler hızlı web uygulaması oluşturmak için de iyi bir başlangıç ​​noktası sunar.

13
Thomas Junk

Eskiden sadece temel Java, Servlets ve JSP, html ve xml, JDBC API kullanarak basit, verimli, hızlı uygulamalar ve web hizmetleri yazdık. Yeterince iyiydi; JUnit test etmek için iyi bir araçtır. Kodumuzun çalışmasını kolaylaştırdık.

Hazırda Bekletme, SQL'i basitleştirmek ve Java nesnelerle Veritabanı tablolarının gerçek eşlenmesini sağlamak için) bir araya geldi ve hiyerarşik ilişkilerin bizim dediğimiz gibi Nesne İlişkileri Eşlemesine veya ORM'ye yansıtılmasına izin verdi. ResultSet'i tekrar bir Java nesne veya veri türüne) eşlememiz gerekmedi.

Struts, Model Görünüm Denetleyicisi desenini Web uygulamalarımıza eklemek için geldi, iyiydi.

EJBs büyük bir yük vardı ve acı ve ek açıklamaları kod tavuk çizik gibi görünüyordu ve şimdi Bahar bize masum insanlar yayıldı. Bana çok abartılı geliyor.

Örneğin, şimdi basit jdbc url, kullanıcı, önce jdbc.properties geçmek, sonra ikinci hazırda bekleme özellikleri ve daha sonra bahar fasulye üçüncü kez paket!

Tüm bunlara rağmen, ihtiyacınız olan yerde bir bağlantı almayı düşünün, saf Java'da aşağıda gösterildiği gibi gerçekten basit, bu da Spring ile tüm bu sıcak hava malzemelerinden geçtikten sonra gerçekten yaptığımız şey:

Connection connection = DriverManager.getConnection(url, user, pass);

Bu, kendi başına açıklayıcıdır, basit bir şey yapmak için yuvarlak ve yuvarlak sarmak ve diğer büyük faydaları olmayan hızlı ve kolay bir şey yapmaktır. Tonları ve tonlarca hediye kağıdını, gerçekten de sakladığınız tek şey olan küçük güzel bir hediyenin etrafına sarmak gibi.

Başka bir örnek, toplu güncelleme. Spring ile toplu iş güncellemesi yapmak için JdbcTemplate kullanabilmeniz için birkaç sınıf, arabirim içeren kıvrıktır. Sade jdbc ile basitçe:

Statement statement = connection.createStatement();
statement.addBatch(sqlquery);
statement.executeBatch();

Bundan daha basit veya daha hızlı olamazsınız.

Bu çerçeveyi desteklemiyorum. Afedersiniz. Dünyadaki kim her şeye ihtiyaç duyduklarında enjeksiyon ister?

13
Uma

Java) web uygulamanızı işlevsel hale getirmek için birçok şeyi içeren bir çerçevedir (örn. Uluslararasılaştırma desteği). uzun vadede size çok zaman kazandıracak.

Bahar hakkında bilgi edinmek için iyi bir kitap: zman Bahar MVC ve Web Akışı

4
Bernard