2014-09-20 5 views
1

Я использую контейнер HK2 в приложении на Джерси. Мне нужно использовать свой собственный заводской метод для получения инъецированного экземпляра из контейнера HK2. Например,Использование изготовленной на заказ фабрики HK2 DI с Джерси

// Here I declare the IOC binding. 
public class ApplicationBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
     bind(Logger.class).to(ILogger.class).in(Singleton.class);;  
     bind(MySqlRepository.class).to(IRepository.class).in(Singleton.class); 
    } 
} 



public class MyApplication extends ResourceConfig { 
    public static ApplicationBinder binder ; 
    public MyApplication() { 
     binder = new ApplicationBinder(); 
     register(binder); 
     packages(true, "com.myapplication.server"); 
    } 
    } 

Вот мой код:

public class BusinessLogic 

    { 
     //@Inject 
     //ILogger logger ; 

     //Instead 
     ILogger logger = DependencyResolver .resolve(ILogger.class) // resolve will get ILogger from HK2 container 
    } 

Причина мне нужно сделать, так это потому что иногда, я выделяю классы вручную, который имеет зависимость, так что в этом случае каждого использовании @Inject возвращает null. Например, если я использую новый BusinessLogic(), то регистратор с @Inject имеет значение null. Мне также необходимо связать бизнес-логику и использовать МОК, чтобы получить ILogge.

мне нужно что-то вроде этого:

public class DependencyResolver {  

    public static <T> T resolve(Class<T> beanClass){   
     return instance; 
    }  
} 

мне нужно использовать DependencyResolver для того, чтобы получить экземпляры я зарегистрированных в MyApplication.

Любые предложения. Спасибо заранее ...

+0

Вы пытались создать org.glassfish.hk2.api.Factory для своих нужд? – zyexal

+0

Я сделал, но мне нужно взять конфигурацию связывания, которую я создал в ResourceConfig с помощью ApplicationBinder. – Wasim

+0

Просьба предоставить дополнительную информацию, а также код. Что именно вы пытались ввести ILogger в свой репозиторий? Как задействован репозиторий? – zyexal

ответ

2

Я не 100% уверен, что именно вы хотите сделать, но ...

Я думаю, вы поняли AbstractBinder.bind(...) или сам привязки. Кроме того, вы не можете вводить что-то в экземпляр, который не является управляемым компонентом (например, ваш BusinessLogic).

См. jersey.java.net - ioc для примера относительно вашего BusinessLogic. Вы можете посмотреть на ComponentProvider и/или InjectableProvider

Для вашего ILogger я хотел бы предложить, чтобы создать и связать завод, как это:

public class LoggerFactory implements Factory<ILogger> { 

    // inject stuff here if you need (just an useless example) 
    @Inject 
    public LoggerFactory(final UriInfo uriInfo) { 
     this.uriInfo = uriInfo; 
    } 

    @Override 
    public ILogger provide() { 
     // here you resolve you ilogger 
     return MyLocator.resolve(ILogger.class); 
    } 

    @Override 
    public void dispose(ILogger instance) { 
     // ignore 
    } 

} 

Bind Factory

public class ApplicationBinder extends AbstractBinder { 
    @Override 
    protected void configure() { 
     bindFactory(LoggerFactory.class).to(ILogger.class).in(PerLookup.class /* or other scopeAnnotation if needed */); 

     // what's you Logger.class ? 
     // bind(Logger.class).to(ILogger.class).in(Singleton.class);  
     // bind(MySqlRepository.class).to(IRepository.class).in(Singleton.class); 
    } 
} 

Надежда это было полезно как-то. Может быть, кто-то хочет написать что-нибудь о Провайдерах для вашего дела.

+0

Спасибо, выделите «что-то в экземпляр, который не является управляемым компонентом (например, BusinessLogic)». , Я думаю, что очень полезно позволить мне внедрить службу, управляемую МОК, в мою BusinessLogic, например, с помощью ILogger, поэтому здесь я не могу использовать аннотацию Inject, и мне нужен другой вариант, чтобы получить там ILogger. Надеюсь, я поняла. – Wasim

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