2008-11-21 3 views
49

Я являюсь конечным пользователем одного из продуктов моей компании. Это не очень подходит для интеграции в Spring, однако я могу получить дескриптор контекста и получить требуемый компонент по имени. Тем не менее, я все равно хотел бы знать, можно ли вводить компонент в этот класс, хотя класс не управляется самой Spring.Внедрение bean-компонентов в класс за пределами контекста, управляемого Spring

Уточнение: то же приложение, которое управляет жизненным циклом какого-либо класса MyClass, также управляет жизненным циклом контекста Spring. Spring не имеет никакого знания о экземпляре MyClass, и я хотел бы, чтобы кто-то предоставил экземпляр контексту, но не смог создать экземпляр в самом контексте.

+0

Просьба уточнить: Вы хотите вставлять компонент через Spring Configuration, Spring динамически во время выполнения или программно через сеттер? – 2008-11-21 21:45:06

+0

Любой способ в порядке. Дело в том, что приложение создало объект, в который я хочу вставить компонент, поэтому исходный объект не управляется контекстом Spring. – 2008-11-21 22:01:21

+0

Также рассмотрите возможность использования фабричного метода, чтобы вы могли поместить класс в контекст приложения и настроить его в соответствии с обычным весовым компонентом. Посмотрите на справочные документы Spring о фанерных заводах. – cletus 2008-11-22 00:54:25

ответ

50

You ca п это сделать:

ApplicationContext ctx = ... 
YourClass someBeanNotCreatedBySpring = ... 
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
    someBeanNotCreatedBySpring, 
    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true); 

Вы можете использовать @Autowired и так далее в пределах YourClass указать поля для инъекций и т.д.

2

Предположим, что и имеют следующую цепочку зависимостей:

A -> B -> C -> х -> у -> Z

А, В, С управляются весной бобы (построены и обработаны пружинным каркасом) x, y действительно простые POJO, созданные по вашему приложению, без помощи пружины

Теперь, если вы хотите, чтобы у вас будет ссылка на Z с использованием пружины, вам необходимо иметь «рукоятка» к пружине ApplicationContext

один из способов сделать это, чтобы реализовать интерфейс ApplicationContextAware. В этом случае я бы предположил, что либо A, B, либо C реализует этот интерфейс и сохранит ссылку applicationContext в статическом члене.

так что позволяет принимать класса C, например:

class C implmenets ApplicationContextAware{ 
    public static ApplicationContex ac; 
    void setApplicationContext(ApplicationContext applicationContext) { 
       ac = applicationContext; 
    } 
............. 
} 

теперь, в классе у вас должно быть:

(Z)(C.ac.getBean("classZ")).doSomething() 

HTH - Йонатан

1

Поиск бесконечные комбо autowire впрыснуть пружинный боб в POJO applicationcontextaware beanaware и т.д. кружил меня здесь, но это не обеспечило достаточно полного решения для меня.

Это намного лучшее внедрение/учебное пособие по этой ИМО: Надеюсь, это поможет всем, кому это наконец помогло.

Accessing Spring Beans from outside Spring Context

1

Один из способов, чтобы привести боб в Спринг, несмотря на его производство является внешним является использование вспомогательного класса отмечен как @Configuration боба, который имеет метод (обозначаемый @Bean), что на самом деле делает экземпляр и передает его обратно через Spring (который делает свою инъекцию свойств и создание прокси в этой точке).

Я не совсем уверен, какой объем вам нужен; с prototype, вы получите свежую фасоль в каждом месте.

@Configuration 
public class FooBarMaker { 
    @Bean(autowire = Autowire.BY_TYPE) 
    @Scope("prototype") 
    public FooBar makeAFooBar() { 
     // You probably need to do some more work in here, I imagine 
     return new FooBar(); 
    } 
} 

Вы можете впрыскивать свойства, необходимые для производства, в фасоль @Configuration. (Я использую это для создания экземпляров интерфейса, где имя экземпляра для экземпляра определяется во время выполнения.)

0

Если вы хотите создать объект вне контекст Spring и сделать этот объект доступным для инъекций другие бобы, которые являются в контексте Spring, вы можете выполнить шаги в this article.

В принципе, вы создаете контекст родительского приложения и вставляете свой внешний объект в этот родительский контекст как одноэлементный. Затем вы создаете основной контекст приложения (например, из xml-файлов), в качестве родительского контекста родительского приложения.

Object externalObject = ... 
GenericApplicationContext parent = new StaticApplicationContext(); 
parent.getBeanFactory().registerSingleton("externalObject", externalObject); 
parent.refresh(); 
ApplicationContext appContext = new ClassPathXmlApplicationContext(... , parent); 
Смежные вопросы