焊接@Produces依赖项具有空注入点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了焊接@Produces依赖项具有空注入点相关的知识,希望对你有一定的参考价值。

我有一个非默认构造函数的泛型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;
}

以上是关于焊接@Produces依赖项具有空注入点的主要内容,如果未能解决你的问题,请参考以下文章

哪个是 CDI @Produces 注释的 Spring 等效项?

Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系

SpringBoot的拦截器中依赖注入报空指针问题

Android片段和依赖注入

具有多个接口作为构造函数中的参数的依赖注入

.NET Core 3.1 中的依赖注入具有多种实现 [重复]