当前位置: 首页 > 知识库问答 >
问题:

使用定制工厂HK2 DI和运动衫

国俊艾
2023-03-14

我在我的泽西应用程序中使用HK2容器。我需要使用我的自定义工厂方法从HK2容器中获取注入的实例。例如,

// 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的记录器为空。我也必须绑定商业逻辑并使用IOC才能获得ILogge。

我需要这样的东西:

public class DependencyResolver {    

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

我需要使用依赖关系解析器才能获取我在“我的应用程序”中注册的实例。

有什么建议吗?预先感谢...

共有1个答案

万俟心思
2023-03-14

我不是100%确定你到底想做什么,但是...

我认为您误解了AbstractBinder.bind(…)或bindings本身。此外,如果您不能向一个非托管组件的实例(如您的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
    }

}

绑定工厂

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);
    }
}

希望这有所帮助。也许有人愿意为您的案例写一些关于提供者的内容。

 类似资料:
  • 我使用'mvn安装'命令,它是推工件到JFROG下libs-释放-本地与group pId,artifactID和版本号。 我的问题是:工件版本是1.2.1,它将替换一个新工件并删除旧工件。我可以将工件推到build_Number下吗? 像Jfrog目标回购中的Ex:libs发布本地/groupIdname/artifactIdname/buildNumber/version(工件)? 输出应该是

  • 我有一个TestNG@Factory类,一个创建驱动程序的基类和两个包含多个@test方法的测试类来运行测试。考虑到我下面的@Factory类。 和是两个测试类。它们扩展基类并调用基类构造函数来创建驱动程序。特定设备ID在特定时间只能使用驱动程序的一个实例。 我面临的问题是IndTest和IndTest2同时运行,测试试图同时在特定设备上运行不同的测试。我要求先调用IndTest类,在设备1和设备

  • 1.1. 工厂烧写工具使用 1.1. 工厂烧写工具使用 工厂烧写工具是一个带UI界面的windows烧写工具,对于一台新电脑需要安装usb驱动(驱动安装文件和说明在leo-k18-universal-glibc/bootx_win/driver_install目录下),同时把需要烧写的镜像复制到bootx_win目录下,如下图所示: 该工具最多支持同时烧写8台Kamino18的设备端,运行烧写工具

  • 考虑一个场景,我想用一些数据获取,并将其解析为特定类型的对象,例如。免责声明:虽然很长,但这是一个sscce;我的实际项目与猫的声音关系不大:) 要求: 第一个字符表示“动物的类型”。所以 可能指抽象, 可能指。 第二个字符可选地表示“动物的亚型”...除了这些子类型被分组到类别中(就类而言)。所以CS可能是ThaiCat扩展Cat与参数“”,可能是扩展Cat与参数,可能是扩展与参数 中包含其他信

  • 我需要将REST API中的数据上传到Cosmos DB,并维护特定时间间隔的项目级别TTL。 我使用ADF复制活动复制数据,但对于TTL,在源端使用了额外的自定义列,硬编码值为30。 注意到时间间隔(秒)更新为字符串而不是整数。因此失败,并出现以下错误。 详细信息 故障发生在“下沉”方面。错误代码=用户错误文档DB写错误,'类型=微软.数据传输.常见.共享.混合交付异常,消息=文档导入失败,由于

  • 为了进行测试,我在模式中添加了以下内容, 之后XJC开始给出以下错误, 不支持的绑定命名空间“http://annox.dev.java.net”。也许您指的是“http://java.sun.com/xml/ns/jaxb/xjc”? xjc-p com.test-classpath=“jaxb2-basics-annotate-1.0.2.jar;tools-0.4.1.5.jar;comm