2013-08-21 4 views
5

Mam klasę (klasa ABC), która jest tworzona przez wywołanie konstruktora. Klasa ABC ma z kolei klasę pomocniczą (klasa XYZ) wstrzykiwaną za pomocą automatycznego okablowania.spienianie sprężyn nie działa z nieinwazyjnie zarządzanej klasy

Nasza aplikacja jest aplikacją opartą na Spring MVC i nie widzę żadnego wyjątku podczas uruchamiania serwera.

Ale nadal widzę Class XYZ przychodzące jako null. Czy to z powodu faktu, że klasa ABC nie jest tworzona przez Spring Container?

W takich sytuacjach, w jaki sposób korzystać z automatycznego okablowania?

Dzięki.

+0

Jestem pewien, że nie może Autowire fasoli, które nie są zarządzane przez wiosnę .. Trzeba zdobyć odniesienia wystąpienie XYZ za pośrednictwem innego średniej. Jeśli jest to klasa pomocnicza, użyj metod XYZ static i użyj ich używając nazwy klasy. Tak właśnie zrobiłem. – dharam

+0

Proszę odnieść się do https://github.com/ahmedbhaila/non-managed-beans, próbowałem i to działa. – Sam

Odpowiedz

2

Prawidłowe: Nie można po prostu zadzwonić pod numer new i uzyskać połączenia telefonicznego; Wiosna musi zarządzać fasolą, aby mogła wykonać całą swoją magię.

Jeśli możesz dodać więcej szczegółów na temat użycia, być może będziemy w stanie zaproponować użyteczne opcje.

1

W skrócie, tak, ABC nie otrzymuje zastrzyku z XYZ, ponieważ Spring nie zarządza ABC. Spring nie może konfigurować obiektów, o których nie wie.

Możesz zarządzać ABC, opisując je za pomocą @Service lub @Component. Zauważ, że aby odebrać Wiosna na tych adnotacji, Wiosna musi mieć auto-skanowanie włączone:

<context:component-scan base-package="com.mypackage.awesomeproject" /> 
5

autowiring nie zadziała, ponieważ klasa ABC nie jest zarządzany przez wiosnę. Możesz sprawić, by Spring zarządzał ABC, używając jednej z adnotacji @Component (@Component, @Service, @Controller, itp.) Powyżej definicji klasy, a następnie używając kontekstu: skanowanie komponentów w kontekście XML aplikacji lub przejdź do starej szkoły i po prostu zdefiniuj komponent bezpośrednio w kontekście aplikacji.

Jeśli z jakiegoś powodu nie można dokonać Wiosna zarządzać klasy ABC, można załadować kontekst aplikacji w ABC użyciu coś jak:

ApplicationContext kontekście = new ClassPathXmlApplicationContext ("ścieżka/do/ApplicationContext. xml ");

i wtedy użyć:

XYZ someXyz = (X-Y) context.getBean ("MyXYZ");

aby ręcznie ustawić wartość fasoli.

0

Można opisywanie ABC klasę z @Configurable adnotacji. Następnie Spring IOC wstrzykuje instancję XYZ do klasy ABC. Jest zwykle używany z AspectJ AnnotationBeanConfigurerAspect.

+1

Nie działa dla mnie. – mafonya

10

można wykorzystywać w ten sposób używać sprężyny fasoli w non-wiosennym fasoli klasy

public class ApplicationContextUtils implements ApplicationContextAware { 

    private static ApplicationContext ctx; 

    @Override 
    public void setApplicationContext(ApplicationContext appContext) 
     throws BeansException { 
    ctx = appContext; 

    } 

    public static ApplicationContext getApplicationContext() { 
    return ctx; 
    } 
} 

teraz można uzyskać ApplicationContext obiektu poprzez getApplicationContext() tej metody.

z ApplicationContext można uzyskać obiektów wiosna fasoli jak to:

ApplicationContext appCtx = ApplicationContextUtils 
    .getApplicationContext(); 
String strFromContext = (String) appCtx.getBean(beanName); 
+0

Jak ustawić appContext? – CrazyJavaLearner

+0

Pojemnik sprężynowy wstrzyknie ten przedmiot. –

+0

Tak. Mam to. Dzięki za odpowiedź. – CrazyJavaLearner

2

Można użyć @Configurable adnotacji Wiosny w klasie chcesz autowire innych ziaren. Ponadto należy dodać adnotację do dowolnego komponentu bean konfiguracji za pomocą @EnableSpringConfigured, aby Spring wiedział o konfigurowalnych komponentach bean.

@EnableSpringConfigured documentation

@interface publicznego EnableSpringConfigured sygnalizuje aktualny kontekst aplikacji zastosowanie iniekcji zależność niebędących zarządzane klas, które są tworzone wystąpienia poza fabryki Wiosna Bean (zazwyczaj klas adnotacją z @Configurable adnotacji). Podobna do funkcji znalezionej w elemencie XML Spring. Często używane w połączeniu z @EnableLoadTimeWeaving.

@Configurable(autowire = Autowire.BY_TYPE) 
public class ABC { 
    @Autowire private XYZ xyz; 
    ... 
} 

@Configuration 
@EnableSpringConfigured 
public class Application { 
    ... 
} 

public class MyClass { 
    public void doSomething() { 
     ABC abc = new ABC(); // XYZ is successfully autowired 
     ... 
    } 
} 
+0

Hi ibai, Do czego służy MyClass? Jest to także obiekt nie-wiosenny. Czy możemy dodać nową klasę ABC() w klasie Application? Dzięki. – Sam

Powiązane problemy