2013-08-21 4 views
5

У меня есть класс (класс ABC), созданный при вызове конструктора. Класс ABC, в свою очередь, имеет вспомогательный класс (класс XYZ), введенный с использованием автоматической проводки.spring autowiring не работает из класса, не связанного с весной

Ours - это приложение на основе Spring MVC, и я не вижу никаких исключений при запуске сервера.

Но я все еще вижу, что класс XYZ приходит как null. Это из-за того, что Class ABC не создается экземпляром Spring Container?

В таких сценариях, как я могу использовать автоматическую проводку?

Спасибо.

+0

Я уверен, что вы не можете Autowire бобы, которые не управляются весной .. Вам нужно раздобыть ссылки экземпляра XYZ некоторым другим средним. Если это класс Helper, создайте методы XYZ static и используйте их, используя имя класса. Это то, что я сделал. – dharam

+0

Обратитесь к https://github.com/ahmedbhaila/non-managed-beans, я пробовал и работает. – Sam

ответ

2

Исправить: вы не можете просто позвонить new по классу и получить все проводное соединение; Весна должна управлять бобами, чтобы она могла справиться со всей своей магией.

Если вы можете разместить более подробную информацию о вашем прецеденте, мы сможем предложить полезные опции.

1

Короче говоря, да, ABC не вводится XYZ, потому что Spring не управляет ABC. Spring не может настроить объекты, о которых он не знает.

Вы можете управлять ABC, аннотируя его @Service или @Component. Обратите внимание, что для того, чтобы Spring, чтобы забрать на эти аннотации, весна должна иметь автоматическое сканирование включено:

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

не будет автоматического связывания работать, потому что класс ABC не управляется Spring. Вы можете заставить Spring управлять ABC, используя одну из аннотаций @Component (@Component, @Service, @Controller и т. Д.) Над определением класса, а затем используя контекст: компонентное сканирование в XML-контексте вашего приложения или старую школу и просто определите компонент непосредственно в контексте вашего приложения.

Если по каким-то причинам вы не можете сделать Spring управлять класса ABC, вы можете загрузить контекст приложения в ABC, используя что-то вроде:

ApplicationContext контексте = новый ClassPathXmlApplicationContext ("путь/к/ApplicationContext. XML ");

, а затем использовать:

XYZ someXyz = (XYZ) context.getBean ("MyXYZ");

, чтобы вручную установить значение компонента.

0

Вы можете аннотировать ABC класс с @Configurable аннотацию. Затем Spring IOC будет вводить XYZ экземпляр в класс ABC. Он обычно используется с AspectJ AnnotationBeanConfigurerAspect.

+1

Не работал для меня. – mafonya

10

Вы можете использовать этот способ, чтобы использовать родниковую фасоль в без пружинного фасоли класса

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; 
    } 
} 

теперь вы можете получить ApplicationContext объект по getApplicationContext() этот метод.

от ApplicationContext вы можете получить объекты весной фасоли, как это:

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

Как установить appContext? – CrazyJavaLearner

+0

Весенний контейнер будет вводить этот объект. –

+0

Да. Я понял. Спасибо за ответ. – CrazyJavaLearner

2

Вы можете использовать @Configurable аннотации Spring в классе вы хотите autowire других бобов. Кроме того, вам нужно будет аннотировать любой конфигурационный компонент с @EnableSpringConfigured, чтобы Spring знал о ваших настраиваемых компонентах.

@EnableSpringConfigured documentation

общественный @interface EnableSpringConfigured Сигналов текущего контекста приложения, чтобы применить инъекции зависимостей для неуправляемых классов, экземпляры которых за пределами Spring фасоли завода (как правило, классы аннотированных с @Configurable аннотации). Аналогично функциональности, найденной в элементе Spring Spring. Часто используется в сочетании с @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, Для чего предназначен MyClass? Это также не управляемый пружиной объект. Может ли новый класс ABC() в классе Application? Спасибо. – Sam