• guice AssistedInject 简单说明


    guice AssistedInject 主要的场景是解决一个对象的创建同时依赖一个实例访问以及ioc 容器,通用的解决方法
    是通过工厂方法,因为比较常见,所以guice 提供了一个扩展,可以解决类似问题,对于需要使用的时候我们
    需要基于工厂方法注入

    参考实例

    • AppDemoInject
      需要依赖ioc 容器的bean 以及实例的
     
    package com.dalong;
     
    import com.google.inject.Inject;
    import com.google.inject.assistedinject.Assisted;
     
    public class AppDemoInject {
     
        private UserContext userContext;
        private  String name;
        private String password;
        @Inject
        public  AppDemoInject(@Assisted("name") String name,@Assisted("password") String password, UserContext userContext) {
            this.name=name;
            this.password=password;
            this.userContext=userContext;
        }
       // 工厂方法
    public interface  Factory { 
        // 此处因为类型相同,我们需要明确名称,基于Assisted 指明
        AppDemoInject create(@Assisted("name") String name,@Assisted("password") String password);
    }
     
        public String info(){
            return  String.format("%s----------%s--------%s",name,password,userContext.context().get("name"));
        }
    }

    UserContext bean

    @ImplementedBy(DefaultUserContext.class)
    public interface UserContext {
     
      default   Map<String,Object>  context()  {
          Map<String,Object>  result = new HashMap<>();
          result.put("name","demoapp");
          return result;
      }
    }
    • UserLogin 使用AppDemoInject
      基于工厂方法注入
     
    public class UserLogin {
     
        private UserContext userContext;
        private TokenContext tokenContext;
     
        @Inject
        private  AppDemoInject.Factory factory;
     
        @Inject
        public  UserLogin (UserContext userContext, TokenContext tokenContext){
            this.tokenContext=tokenContext;
            this.userContext=userContext;
        }
        public  void doLogin(String name,String password){
             AppDemoInject app = factory.create(name,password);
             String result = app.info();
            System.out.println(result);
        }
    }
    • 入口测试
    Injector injector = Guice.createInjector(new AbstractModule() {
            @Override
            protected void configure() {
               // 使用AssistedInject 解决
                install(new FactoryModuleBuilder().build(AppDemoInject.Factory.class));
            }
        });
    UserLogin userLogin = injector.getInstance(UserLogin.class);
    userLogin.doLogin("dalong","demoapp");

    说明

    以上模式使用场景还是比较多的,比如graylog 开发中,使用了不少此模式,而且从实践上,比较喜欢直接将工厂方法放到bean 中,类似上边的玩法

    参考资料

    https://github.com/google/guice/wiki/AssistedInject

  • 相关阅读:
    Aop 打印参数日志时,出现参数序列化异常。It is illegal to call this method if the current request is not in asynchron
    Nginx 配置反向代理ip
    springboot 的启动流程
    sqlserver 查看表死锁
    idea 中 下载源码:Sources not download for:
    sqlserver exists 与 in 的区别
    sqlserver case when 的使用方法
    Java项目启动时执行指定方法的几种方式
    使用多线程并获取执行结果
    nodejs实现一个文件存储服务
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/16748323.html
Copyright © 2020-2023  润新知