![](/img/trans.png)
[英]Unable to inject dependency in fragment using dagger2 in Java Android
[英]How to inject dependency in a Quartz job using Dagger 2
我使用Dagger 2作為我的DI框架,並為其提供了一個singleton類實例。
我還使用Quartz Scheduler來調度作業。 有什么方法可以將單例類注入Quartz作業嗎?
Dagger 2模塊:
@Module
public class MyModule {
@Provides
@Singleton
Messager provideMessager() {
return new CustomMessager();
}
}
匕首2組件:
@Component(modules = MyModule.class)
@Singleton
public interface MyComponent {
Messager messager();
}
石英作業:
public class MyJob implements Job {
// @Inject
Messager messager;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
messager.sendMessage("Hello.");
}
}
編輯
我創建了一個MyJobScheduler
類,該類調用Quartz Job:
public class MyJobScheduler {
public void scheduleJob() {
JobDetail myJob = JobBuilder.newJob(MyJob.class)
.withIdentity("myJobId", "Group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTriggerId", "Group1")
.startNow()
.build();
Scheduler scheduler = new org.quartz.impl.StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(myJob, trigger);
}
}
編輯2
因此,我設法對其進行了配置,但我不知道這是否是正確的方法。
首先,我創建了一個DependencyResolver
類,將其用作單例:
public class DependencyResolver {
private static DependencyResolver _instance = null;
private static MyComponent _myComponent;
public static MyComponent getMyComponent() {
return _myComponent;
}
protected DependencyResolver() {
// Exists only to defeat instantiation.
}
public static void initialize() {
_myComponent = DaggerMyComponent.builder().build();
}
}
然后我在main
方法中調用了initialize方法:
DependencyResolver.initialize();
MyComponent myComponent = DependencyResolver.getMyComponent();
我在MyJob類中使用了DependencyResolver
來獲取Messager
單例實例。
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
MyComponent myComponent = DependencyResolver.getMyComponent();
Messager messager = myComponent.messager();
messager.sendMessage("Hello.");
}
}
這是解決此問題的正確方法嗎? 任何輸入將不勝感激。
您的EDIT 2 DependencyResolver
方法克服了使用Dagger注入依賴項的全部原因,因為您的工作從單例提供程序獲取了依賴項。 :-)它完全繞過了Dagger的好處,因此您可能還對源依賴項本身只有一個單例,例如: Messager messager = CustomMessager.getInstance()
或類似的東西。
使用依賴注入的原因之一是協助進行單元測試,在這種情況下,您將失去在單元測試中模擬Messager實現的功能。
JobFactory的API文檔中提到了將依賴注入與Quartz作業一起使用的正確方法: “該接口可能對那些希望其應用程序通過某些特殊機制生成Job實例的人有用,例如為依賴注入提供操作性“。
訣竅是創建自己的擴展SimpleJobFactory
的作業工廠,然后您有機會初始化/注入作業的依賴項,如下所示:
public class MyJobFactory extends SimpleJobFactory {
private final MyComponent component;
@Inject
public MyJobFactory(MyComponent component) {
this.component = component;
}
@Override
public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException {
final Job job = super.newJob(bundle, scheduler);
if (job instanceof MyJob) {
component.inject((MyJob) job);
}
return job;
}
}
然后,您告訴調度程序使用作業工廠:
scheduler.setJobFactory(myJobFactory);
在GitHub上查看完整代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.