Rozumiem, że @Component
adnotacja została wprowadzona wiosną 2.5 w celu pozbycia się definicji fasoli xml przy użyciu skanowania ścieżki klas.
@Bean
został wprowadzony wiosną 3.0 i można go używać z @Configuration
, aby w pełni pozbyć się pliku xml i zamiast tego użyć konfiguracji java.
Czy byłoby możliwe ponowne wykorzystanie @Component
adnotacji zamiast wprowadzania @Bean
adnotacji? Rozumiem, że ostatecznym celem jest stworzenie fasoli w obu przypadkach.
java
spring
annotations
autowired
użytkownik1396576
źródło
źródło
@Component
,@Repository
i@Service
adnotacje na wiosnę?Lite mode
. I nie jest to zalecane. Zobacz tutaj: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
zwraca zwracaną konfigurowalną instancję Spring Bean, a jednocześnie@component
definiuje klasę, która może być później zainicjowana przez wiosenny silnik IoC w razie potrzeby.Odpowiedzi:
@Component
i@Bean
zrobić dwie zupełnie różne rzeczy i nie należy ich mylić.@Component
(i@Service
i@Repository
) są używane do automatycznego wykrywania i automatycznej konfiguracji komponentów bean za pomocą skanowania ścieżki klas. Istnieje niejawne odwzorowanie jeden-do-jednego między klasą z adnotacjami a komponentem bean (tj. Jedna komponent bean na klasę). Kontrola okablowania jest dość ograniczona dzięki temu podejściu, ponieważ jest czysto deklaratywna.@Bean
służy do jawnego zadeklarowania pojedynczej fasoli, zamiast pozwalać Springowi robić to automatycznie, jak wyżej. Oddziela deklarację fasoli od definicji klasy i pozwala tworzyć i konfigurować fasole dokładnie tak, jak wybierzesz.Odpowiedzieć na Twoje pytanie...
Pewnie, pewnie; ale postanowili tego nie robić, ponieważ te dwie rzeczy są zupełnie inne. Wiosna jest już dość myląca, nie powodując dalszego mętnienia wód.
źródło
@Component
wtedy, gdy potrzebny jest autowired? Wydaje się, że@Bean
nie ma to wpływu@Autowired
@Autowired
ze@Bean
jeśli opatrzone swoją klasę z fasoli@Configuration
@ Komponent Preferowany do skanowania komponentów i automatycznego okablowania.
Kiedy należy używać @Bean ?
Czasami automatyczna konfiguracja nie jest opcją. Kiedy? Wyobraźmy sobie, że chcesz połączyć komponenty z bibliotek stron trzecich (nie masz kodu źródłowego, więc nie możesz dodawać adnotacji do jego klas za pomocą @Component), więc automatyczna konfiguracja nie jest możliwa.
@Bean adnotacja zwraca obiekt , że wiosna powinna zarejestrować się jako fasoli w kontekście aplikacji. Treść metody zawiera logikę odpowiedzialną za utworzenie instancji.
źródło
@Component
idzie na klasy, podczas gdy@Bean
idzie na metody klasowe (które dają instancje obiektów klasy).Rozważmy, że chcę konkretnej implementacji w zależności od pewnego stanu dynamicznego.
@Bean
jest idealny do tego przypadku.Jednak nie da się tego zrobić
@Component
.źródło
@Configuration
Oba podejścia mają na celu rejestrację typu docelowego w pojemniku Spring.
Różnica polega na tym, że
@Bean
dotyczy metod , podczas gdy@Component
dotyczy typów .Dlatego podczas korzystania z
@Bean
adnotacji kontrolujesz logikę tworzenia instancji w treści metody (patrz przykład powyżej ). Z@Component
adnotacją nie możesz.źródło
źródło
Widzę wiele odpowiedzi i prawie wszędzie wspomniany @Component służy do automatycznego okablowania, gdzie składnik jest skanowany, a @Bean dokładnie deklaruje, że fasola ma być używana w inny sposób. Pokażę, jak jest inaczej.
Najpierw jest to adnotacja na poziomie metody. Po drugie, zwykle używasz do konfigurowania komponentów bean w kodzie Java (jeśli nie używasz konfiguracji XML), a następnie wywołujesz go z klasy za pomocą metody getBean ApplicationContext. lubić
Jest to ogólny sposób na adnotację fasoli, a nie fasoli specjalistycznej. Adnotacja na poziomie klasy i służy do unikania tych wszystkich czynności konfiguracyjnych za pośrednictwem konfiguracji Java lub XML.
Dostajemy coś takiego.
Otóż to . Został właśnie wprowadzony, aby uniknąć wszystkich kroków konfiguracji w celu utworzenia instancji i użycia tego komponentu bean.
źródło
@Bean
podejścia. Nadal możesz użyć,@Autowire
aby uzyskać fasolę, tak jak w przypadku@Component
.@Bean
po prostu dodaje fasolę do kontenera wiosennego, tak jak by@Component
to zrobił . Różnica jest następująca. 1. Używając@Bean
, możesz dodać Klasy Zewnętrzne do Spring Container. 2. Używając@Bean
, możesz uzyskać pożądaną implementację interfejsu w czasie wykonywania (przy użyciu fabrycznego wzorca projektowego)Możesz użyć,
@Bean
aby udostępnić istniejącą klasę innej firmy w kontekście aplikacji Spring Framework.Za pomocą
@Bean
adnotacji można owinąć klasę innej firmy (może jej nie mieć@Component
i nie używać sprężyny), jako fasolę wiosenną. A potem, gdy jest opakowany za pomocą@Bean
, staje się obiektem singleton i jest dostępny w kontekście aplikacji Spring Framework. Teraz możesz łatwo udostępniać / ponownie używać tego komponentu bean w swojej aplikacji za pomocą wstrzykiwania zależności i@Autowired
.Pomyśl więc, że
@Bean
adnotacja jest opakowaniem / adapterem dla klas innych firm. Chcesz, aby klasy innych firm były dostępne w kontekście aplikacji Spring Framework.Używając
@Bean
powyższego kodu, jawnie deklaruję pojedynczą fasolę, ponieważ wewnątrz metody jawnie tworzę obiekt za pomocąnew
słowa kluczowego. Ręcznie wywołuję również metody ustawiające danej klasy. Więc mogę zmienić wartość pola przedrostka. Tak więc ta praca ręczna jest określana jako jawne tworzenie. Jeśli użyję tego@Component
dla tej samej klasy, fasola zarejestrowana w kontenerze Spring będzie miała domyślną wartość dla pola prefiksu.Z drugiej strony, kiedy adnotujemy klasę
@Component
, nie musimy ręcznie używaćnew
słowa kluczowego. Jest obsługiwany automatycznie przez Spring.źródło
Kiedy używasz
@Component
znacznika, jest to tak samo, jak posiadanie POJO (Plain Old Java Object) z metodą deklaracji wanilii (z adnotacją@Bean
). Na przykład następująca metoda 1 i 2 da ten sam wynik.Metoda 1
z fasolą dla „theNumber”:
Metoda 2
z fasolą dla obu:
Metoda 2 pozwala zachować razem deklaracje fasoli, jest nieco bardziej elastyczna itp. Możesz nawet dodać kolejną fasolę SomeClass inną niż waniliowa, jak poniżej:
źródło
Istnieją dwa sposoby generowania fasoli. Jednym z nich jest utworzenie klasy z adnotacją
@Component
. Drugim jest stworzenie metody i opatrzenie jej adnotacją@Bean
. W przypadku klas zawierających metodę z@Bean
należy dodać adnotację@Configuration
Po uruchomieniu projektu wiosennego klasa z@ComponentScan
adnotacją przeskanowałaby każdą klasę z@Component
nią i przywróciłaby instancję tej klasy do kontenera Ioc. Inną rzeczą, którą@ComponentScan
by to zrobiło, jest uruchomienie metod . Możesz napisać logikę i zwrócić żądany obiekt. Inną rzeczą, o której warto wspomnieć, jest nazwa metody z domyślną nazwą fasoli.@Bean
i przywrócenie obiektu zwracanego do kontenera Ioc jako komponentu bean. Więc kiedy musisz zdecydować, jaki rodzaj fasoli chcesz utworzyć w zależności od aktualnych stanów, musisz użyć@Bean
@Bean
źródło
źródło
@Bean został stworzony, aby uniknąć łączenia Springa i reguł biznesowych w czasie kompilacji. Oznacza to, że możesz ponownie wykorzystywać reguły biznesowe w innych ramach, takich jak PlayFramework lub JEE.
Co więcej, masz całkowitą kontrolę nad tym, jak tworzyć fasole, gdzie nie wystarczy domyślna instancja wiosenna.
Napisałem o tym post.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
źródło
Różnica między fasolą a składnikiem:
źródło
1. Informacje o @Component @Component
działa podobnie do @Configuracja.
Oba wskazują, że klasa z adnotacjami ma co najmniej jedną fasolę, którą należy zarejestrować
Spring-IOC-Container
.Klasa opatrzona adnotacją @Component, nazywamy to
Component of Spring
. Jest to koncepcja, która zawiera kilka ziaren.Component class
musi zostać automatycznie przeskanowane przez Spring w celu zarejestrowania tych ziarencomponent class
.2. Informacje o @Bean
@Bean służy do opisywania metody
component-class
(jak wspomniano powyżej). Wskazuje, że wystąpienie zachowane za pomocą metody z adnotacjami wymaga rejestracjiSpring-IOC-Container
.3. Wniosek
Różnica między nimi dwoma jest stosunkowo oczywista, są one używane w
different circumstances
. Ogólne zastosowanie to:źródło
Dodatkowe punkty z powyższych odpowiedzi
Załóżmy, że mamy moduł, który jest udostępniany w wielu aplikacjach i zawiera kilka usług. Nie wszystkie są potrzebne dla każdej aplikacji.
Jeśli używasz @Component na tych klasach usług i skanowaniu komponentów w aplikacji,
W takim przypadku trzeba było dostosować filtrowanie skanowania komponentu lub podać konfigurację, która może działać nawet nieużywane komponenty bean. W przeciwnym razie kontekst aplikacji nie uruchomi się.
W takim przypadku lepiej jest pracować z adnotacją @Bean i tworzyć tylko te fasole,
Zasadniczo użyj @Bean do dodania klas stron trzecich do kontekstu. I @Component, jeśli jest tylko w jednej aplikacji.
źródło