Konwersja pliku XML spring do klasy konfiguracyjnej spring @
Podążając za pytaniem zrozumienie użycia sprężyny @Autowired chciałem stworzyć kompletną bazę wiedzy dla innej opcji okablowania sprężyny, klasy @Configuration
.
Załóżmy, że mam plik XML spring, który wygląda tak:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="another-application-context.xml"/>
<bean id="someBean" class="stack.overflow.spring.configuration.SomeClassImpl">
<constructor-arg value="${some.interesting.property}" />
</bean>
<bean id="anotherBean" class="stack.overflow.spring.configuration.AnotherClassImpl">
<constructor-arg ref="someBean"/>
<constructor-arg ref="beanFromSomewhereElse"/>
</bean>
</beans>
Jak mogę użyć @Configuration
zamiast tego? Czy ma to jakiś wpływ na sam kod?
1 answers
(Disclaimer - Ta odpowiedź jest oparta na moim blogu )
Migracja XML do @Configuration
Xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml-xml]}
-
Utwórz klasę
@Configuration
przypisaną:@Configuration public class MyApplicationContext { }
-
Dla każdego znacznika
<bean>
Utwórz metodę z adnotacją@Bean
:@Configuration public class MyApplicationContext { @Bean(name = "someBean") public SomeClass getSomeClass() { return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty } @Bean(name = "anotherBean") public AnotherClass getAnotherClass() { return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse } }
-
Aby zaimportować
beanFromSomewhereElse
musimy zaimportować jego definicję. Może być zdefiniowany w XML i będziemy używać@ImportResource
:@ImportResource("another-application-context.xml") @Configuration public class MyApplicationContext { ... }
Jeśli bean jest zdefiniowany w innej klasie
@Configuration
możemy użyć adnotacji@Import
:@Import(OtherConfiguration.class) @Configuration public class MyApplicationContext { ... }
-
Po zaimportowaniu innych klas XML lub
@Configuration
, możemy użyć beans, które deklarują w naszym kontekście, deklarując prywatny członek do klasy@Configuration
w następujący sposób:@Autowired @Qualifier(value = "beanFromSomewhereElse") private final StrangeBean beanFromSomewhereElse;
Lub użyć go bezpośrednio jako parametru w metodzie, która definiuje ziarno, które zależy od tego
beanFromSomewhereElse
, używając@Qualifier
w następujący sposób:@Bean(name = "anotherBean") public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) { return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); }
-
Importowanie właściwości jest bardzo podobny do importowania bean z innej klasy xml lub
@Configuration
. Zamiast używać@Qualifier
użyjemy {[24] } z właściwościami w następujący sposób:@Autowired @Value("${some.interesting.property}") private final String someInterestingProperty;
Może być również używany z wyrażeniami SpEL.
-
Aby spring mógł traktować takie klasy jak kontenery beans, musimy oznaczyć to w naszym głównym xml poprzez umieszczenie tego znacznika w kontekście:
<context:annotation-config/>
Możesz teraz zaimportować
@Configuration
klasy dokładnie tak samo, jak tworzysz prosty bean:<bean class="some.package.MyApplicationContext"/>
Istnieją sposoby na całkowite uniknięcie spring XML, ale nie są one objęte zakresem tej odpowiedzi. Jedną z tych opcji można znaleźć w moim blogu, na którym opieram swoją odpowiedź.
Zalety i wady stosowania tej metody
Zasadniczo uważam, że ta metoda deklarowania fasoli jest znacznie wygodniejsza niż używanie XMLs ze względu na kilka korzyści, które widzę: {]}
-
literówki -
@Configuration
zajęcia są kompilacji i literówek po prostu nie pozwalają na Kompilacje [41]} - Jeśli nie uda Ci się wprowadzić fasoli, to nie uda Ci się w czasie kompilacji, a nie w czasie wykonywania, jak w przypadku XMLs]}
- łatwiej poruszać się w IDE - pomiędzy konstruktorami beans, aby zrozumieć drzewo zależności.
- możliwość łatwego debugowania konfiguracji startowej
Wad nie jest wiele, jak je widzę, ale jest kilka, które mógłbym myśleć of:
- Abuse - kod jest łatwiejszy do nadużycia niż XMLs
- Z XMLs można definiować zależności na podstawie klas, które nie są dostępne w czasie kompilacji, ale są dostarczane w czasie wykonywania. Z klasami
@Configuration
musisz mieć klasy dostępne w czasie kompilacji. Zazwyczaj to nie jest problem, ale są przypadki, że może być.
Reasumując: idealnie jest łączyć XMLS, @Configuration
i adnotacje w kontekście aplikacji. Wiosna nie obchodzi mnie sposób, w jaki fasola została zadeklarowana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:19