Używam Spring MVC dla mojej aplikacji internetowej. Moje ziarna są zapisane w spring-servlet.xml
pliku " "
Teraz mam klasę MyClass
i chcę uzyskać do niej dostęp za pomocą fasoli wiosennej
W tym spring-servlet.xml
napisałem
<bean id="myClass" class="com.lynas.MyClass" />
Teraz muszę uzyskać dostęp do tego za pomocą ApplicationContext
ApplicationContext context = ??
Więc mogę to zrobić
MyClass myClass = (MyClass) context.getBean("myClass");
Jak to zrobić??
java
spring
spring-mvc
servlets
LynAs
źródło
źródło
Odpowiedzi:
Po prostu wstrzyknij to ..
lub zaimplementuj ten interfejs: ApplicationContextAware
źródło
ApplicationContextProvider.java
odpowiedź wydaje się być najbardziej niezawodnym rozwiązaniem tego problemu.Myślę, że ten link pokazuje najlepszy sposób na uzyskanie kontekstu aplikacji w dowolnym miejscu, nawet w klasie innej niż fasola. Uważam, że jest to bardzo przydatne. Mam nadzieję, że dla ciebie to samo. Poniżej znajduje się jego abstrakcyjny kod
Utwórz nową klasę ApplicationContextProvider.java
Dodaj wpis w pliku application-context.xml
W przypadku adnotacji (zamiast application-context.xml)
Uzyskaj taki kontekst
Twoje zdrowie!!
źródło
ApplicationContextProvider.getApplicationContext()
. Następnie, gdyApplicationContextProvider appContext = ApplicationContextProvider.getApplicationContext()
@Component
naApplicationContextProvider
konfiguracji może uniknąć waplication-context.xml
W przypadku, gdy potrzebujesz uzyskać dostęp do kontekstu z poziomu HttpServlet, który sam nie jest tworzony przez Spring (a zatem ani @Autowire, ani ApplicationContextAware nie będą działać) ...
lub
Jeśli chodzi o niektóre inne odpowiedzi, zastanów się dwa razy, zanim to zrobisz:
... ponieważ nie daje to aktualnego kontekstu, a raczej tworzy dla Ciebie kolejną jego instancję. Oznacza to, że 1) znaczna część pamięci i 2) ziarna nie są współdzielone między tymi dwoma kontekstami aplikacji.
źródło
Jeśli implementujesz klasę, która nie jest tworzona przez Spring, na przykład JsonDeserializer, możesz użyć:
źródło
ContextLoader.getCurrentWebApplicationContext()
Dodaj to do swojego kodu
Spowoduje to po prostu wstrzyknięcie myClass do Twojej aplikacji
źródło
w oparciu o odpowiedź Viveka, ale myślę, że lepiej:
Zapisywanie z metody instancji do pola statycznego jest złą praktyką i niebezpiecznym, jeśli manipuluje się wieloma instancjami.
źródło
org.springframework.core.io.ContextResource
interfejs. Proponuję wybrać inną nazwę dla klasy wewnętrznej,ContextResource
aby uniknąć bałaganu.Istnieje wiele sposobów uzyskania kontekstu aplikacji w aplikacji Spring. Poniżej podano:
Za pośrednictwem ApplicationContextAware :
Tutaj
setApplicationContext(ApplicationContext applicationContext)
otrzymasz metodę applicationContextPrzez Autowired :
Tutaj
@Autowired
słowo kluczowe zapewni applicationContext.Więcej informacji znajdziesz w tym wątku
Dzięki :)
źródło
Innym sposobem jest wstrzyknięcie applicationContext przez serwlet.
To jest przykład, jak wstrzyknąć zależności podczas korzystania z usług internetowych Spring.
Alternatywnym sposobem jest dodanie kontekstu aplikacji do pliku web.xml, jak pokazano poniżej
Zasadniczo próbujesz powiedzieć apletowi, że powinien szukać ziaren zdefiniowanych w tych plikach kontekstowych.
źródło
Krok 1 : Wprowadź następujący kod w klasie
Krok 2 : Napisz Getter & Setter
Krok 3 : zdefiniuj autowire = "byType" w pliku xml, w którym zdefiniowany jest bean
źródło
Nawet po dodaniu @Autowire, jeśli twoja klasa nie jest RestController lub Configuration Class, obiekt applicationContext przychodził z wartością null. Próbowałem utworzyć nową klasę z poniższymi i działa dobrze:
możesz następnie zaimplementować metodę pobierającą w tej samej klasie, jak na swoje potrzeby, na przykład pobranie odwołania do klasy implementowanej przez:
źródło
Następnie możesz odzyskać fasolę:
Źródła : springbyexample.org
źródło