我有一个非默认构造函数的泛型DAO,看起来像这样(实际上与车辆无关我只是想提供一个简单的例子)
public class GenericVehicleDao<T extends Vehicle> {
private Class<T> clazz;
@Inject
private DaoHelper daoHelper;
public GenericDao(Class<T> clazz)
{
this.clazz = clazz;
}
}
我有另一个类,其中包含一些使用此构造函数的@Produces方法,例如
public class AppProducer {
@Produces
public GenericDao<Car> createCar() {
return new GenericDao(Car.class);
}
@Produces
public GenericDao<Truck> createTruck() {
return new GenericDao(Truck.class);
}
}
然后,我可以将DAO注入服务层,例如。
@Stateless
public class VehicleService {
@Inject
private GenericVehicleDao<Car> carDao;
}
那个Car DAO很好地注入了服务层,但是我发现在DAO构建之后DAO的注入DaoHelper
是空的。如果我将DaoHelper注入服务层然后注入罚款,我宁愿在DAO本身进行注入。我尝试过从现场注射切换到二次注射,但我有同样的问题。
再次回答我自己的问题,这可能对其他人有用。经过一些谷歌搜索后,我在Weld documentation发现了以下内容
上面的代码存在一个潜在的问题。 CreditCardPaymentStrategy的实现使用Java new运算符进行实例化。由应用程序直接实例化的对象无法利用依赖注入,也没有拦截器。
如果这不是我们想要的,我们可以在producer方法中使用依赖注入来获取bean实例:
这意味着我可以改变我的Producer方法采用以下格式,然后它工作正常
@Produces
public GenericDao<Car> createCar(DaoHelper helper) {
GenericDao<Car> carDao = new GenericDao<>(Car.class);
carDao.setHelper(helper);
return carDao;
}