2013-05-08 2 views
4

Какова эквивалентность провайдера Guice весной?Эквивалентность провайдера Guice весной

Вот код Guice Мне нужно заменить весной:

public class MyProxyProvider implements Provider<MyProxy> { 

@Inject 
Config config; 

@Override 
public MyProxy get() { 
    return new MyProxy(httpsclient, config.server, config.user, config.password, config.version); 
} 

}

и здесь связывание определяется:

public class MyModule implements Module { 

@Override 
public void configure(Binder g) { 
    g.bind(MyProxy.class).toProvider(MyProxyProvider.class); 
} 

}

Наконец, мой целью является использование @Autowired для прокси-объекта следующим образом:

public class ConnectionTest { 

@Autowired 
MyProxy proxy; 

}

Также обратите внимание, что класс MyProxy в во внешнем файле банку, который не может быть изменен.

ответ

6

Эквивалент Provider визитной карточки FactoryBean весной.

Из документации:

FactoryBean интерфейс является точкой pluggability в инстанцирования логики Spring IoC контейнера. Если у вас есть сложный код инициализации , который лучше выражен в Java, а не (потенциально) подробный объем XML, вы можете создать свой собственный FactoryBean, написать комплексную инициализацию внутри этого класса и , а затем подключить свой пользовательский FactoryBean к контейнер.

Образец

public class MyFactoryBean implements FactoryBean<MyClassInterface> { 

    @Override 
    public MyClassInterface getObject() throws Exception { 
     return new MyClassImplementation(); 
    } 

    @Override 
    public Class<?> getObjectType() { 
     return MyClassInterface.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 

} 

Это хороший подход, когда у вас есть внешние библиотеки и создание сложного объекта, чтобы избежать длительной конфигурации XML для установки ваших бобов.

Для того, чтобы использовать его в своем контексте, вы можете просто представить его как обычный боб в вашем контексте XML, как:

... 
<bean id="myClass" class="foo.bar.MyFactoryBean" /> 
... 

НО, если ваш боб достаточно просто экземпляр класса (не много зависимостей), вы можете установить его непосредственно на контекст XML, как:

<bean id="myClass" class="foo.bar.MyClassImplementation" /> 

Alternative

Если вы используете Spring 3, вы можете написать класс конфигурации (класс, аннотированный @Configuration), как описано в документе here.При таком подходе вы могли бы сделать что-то вроде:

@Configuration 
public class MyConfiguration { 

    @Bean 
    public MyClassInterface getMyClass() { 
     return new MyClassImplementation(); 
    } 

} 

Это добавит экземпляр к прыжку контекст и пусть autowire его в других классах. Но требуется некоторая конфигурация, и это довольно легко в соответствии с предоставленной документацией.

+0

3.14 тот же документ: «Используйте ApplicationContext, если у вас нет веских причин не делать этого». FactoryBean используется в первую очередь для компиляции bacword. –

+0

'FactoryBean' и' BeanFactory' - это две разные вещи;) 'BeanFactory' - это раздел 3.8.3. –

+0

. Ваше право жаль +1 –

0

Вы не используете поставщика весной, но настройте свой класс MyProxy как стереотип. Это можно сделать, аннотируя класс с @Component или @Service или другим стереотипом. И включите сканирование компонентов для вашего пакета или его можно настроить как стереотип в applicationContext.xml

+0

Проблема заключается в том, что MyProxy находится в файле extern jar, поэтому я не могу его аннотировать. Я уточню свой вопрос. – luksmir

+1

Затем вы можете установить его в своем примере applicationContext.xml wil crate –

Смежные вопросы