Guice:如何基于(动态 Web 属性)更改运行时注入

2024-04-06

以下是我面临的问题的近似值。

认为我们有一个带有一些规则的密码验证器。

public interface RuleChecker{

    //Checks for a password strenght, returns 10
    //for strong or 0 for soft password.
    int check(String pass);
}

然后我们有几种实现,我们的服务只接受超过8分的密码。

public class NoCheck implements RuleChecker {
    public int check(String pass){return 10;}
}

public class LengthCheck implements RuleChecker{
    ...
}
public class AlphanumericCheck implements RuleChecker{
    ...
}
public class AlphaAndLenghtCheckAdapter implements RuleChecker{
    ...
}

但出于测试目的,我们希望在应用程序中实现一个 Web 服务,我们可以在其中“管理”这些规则,并选择要使用的规则。

public class PasswordCheckService{

     private RuleChecker checker;

     @Inject
     public PasswordCheckService(final RuleChecker checker){
         this.checker = checker;
     }

     public boolean checkPassword(String password){
         return checker.check(password) > 8;
     }
}

那么,Guice 有什么方法可以在运行时更改服务的注入吗?

Example:

我们启动了应用程序,默认情况下选择 LengthCheck 并将其注入到应用程序中,在网站上我们选择 NoCheck 复选框并保存选项,该选项存储到数据库中,我可以配置 Guice 以自动更改服务之前注入的 bean 吗?那么从现在开始就不再检查新密码了?

--

就目前而言,我已经找到了这些主题

Google Guice 和运行时的不同注入 https://stackoverflow.com/questions/7651980/google-guice-and-varying-injections-at-runtime但我不知道那种提供商是否适合我的问题。

Guice运行时依赖参数重新注入 https://stackoverflow.com/questions/7641565/guice-runtime-dependency-parameters-reinjection这个很好的问题是在谈论类似的事情,但不是我想要的形式。

guice:命令行运行时注入/绑定 https://stackoverflow.com/questions/7663618/guice-runtime-injection-binding-at-command-line这是最接近我的问题,但他只在启动“运行时”时执行,并且不会随着时间的推移而改变它。

有什么帮助吗?

谢谢你!

使用第一条评论的提示,我实现了这个 POC,但仍然不起作用,如果您更改选择另一个按钮,则服务 bean 不会更新。https://bitbucket.org/ramonboza/guicedynamicconfig https://bitbucket.org/ramonboza/guicedynamicconfig


为每个字段类型(登录名、密码、出生日期...)创建一个提供程序,并使用一个参数来更改要返回的实现。

public class MyModule extends AbstractModule {

    public void configure() {
       bind(RuleChecker.class).annotatedWith(named("password")).toProvider(PasswordRuleCheckerProvider.class);
       bind(RuleChecker.class).annotatedWith(named("login")).toProvider(LoginRuleCheckerProvider.class);
    }
}

public static class PasswordRuleCheckerProvider implements Provider<RuleChecker> {

    private static CheckType type = CheckType.ALPHANUMERIC;
    // static type setter.

    public RuleChecker get() {
        // it would even be better if you could use singletons here.
        switch(type) {
            case LENGTH:
                return new LengthCheck();
            case ALPHANUMERIC:
                return new AlphanumericCheck();
            case ALPHALENGTH:
                return new AlphaAndLenghtCheckAdapter();
            case NONE:
            default:
                return NoCheck();
        }
    }
}
// Almost same provider for your LoginRuleCheckerProvider. You could do something generic.

在您的管理部分中,您更改“类型”值,因此您的规则将会改变。由于注释,它可以影响一组有限的字段。例如 :PasswordRuleCheckerProvider.setType(CheckType.LENGTH);。只会影响具有@Named('password').

您必须像这样声明您的字段和服务:

public abstract class DynamicService {
    protected void updateService() {
        // Reinject with the new implementations the members.
        App.getInjector().injectMembers(this);
    }
}

public class PasswordCheckService extends DynamicService  {
    @Inject
    @Named("password")
    private RuleChecker passwordChecker;

    public void changePasswordCheckType(CheckType type) {
        PasswordRuleCheckerProvider.setType(type);
        // Reinject, so you have your new implementation.
        updateService();
    }

    // [...]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guice:如何基于(动态 Web 属性)更改运行时注入 的相关文章

  • Dropwizard 和 Guice:注入环境

    我目前正在构建一个基于 Dropwizard Guice Jersey 的应用程序 其中数据库访问暂时由 JDBI 处理 我想要实现的是拥有典型的企业架构 其中资源访问服务类访问 DAO 类 而 DAO 类又访问数据库 如果能以正确的 DI
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 取子集时保留 R 对象的类属性

    我有一个名为gene table的R对象 它有类foo 现在我将这个gene table子集为 gene data gene table 1 100 1 5 然而 当我打电话时class gene data 它不再属于类foo 但相反 它有
  • 为什么Python3.0中sort/sorted去掉了cmp参数?

    from 蟒蛇维基 https wiki python org moin HowTo Sorting The Old Way Using the cmp Parameter In Py3 0 the cmp parameter was re
  • 正式支持 MonoTouch 的 NoSQL 数据库

    我无法通过设备上的本地数据库找到正式支持 MonoTouch 的 NoSQL 数据库 如果是的话 有人可以在这里提供他们的名单吗 根据http nosql database org http nosql database org 有siaq
  • 尝试在jpa中删除时出现并发问题

    我有 2 个 EAR 1 EAR 和 2 EAR 这些有 websearvices 和其他代码 现在我有 1 个项目 DB prj 用于与数据库交互 现在所有项目 1 EAR 2 EAR DB prj 在各自的 meta inf 文件夹中都
  • 我的域正在 AWS Certificate Manager 中等待验证

    使用 AWS Certificate Manager 配置 mydomain com 并在等待验证中显示超过一天 即使 CNAME 记录已发布到该域名下的 AWS Route53 也是如此 一切似乎都合适 但尚不清楚 为什么域名没有得到验证
  • 404 找不到页面 codeigniter url

    我是一个使用 codeigniter 的初学者 我正在使用以下网址 http localhost ci index php shopcart http localhost ci index php shopcart 访问控制器 我收到错误
  • 验证网站所有权的简化方法(使用 JavaScript?)

    我有一个 Rails 应用程序 它要求用户在提交来自该网站的链接之前验证他们是否拥有该网站 我已经实现了一个网站验证系统 由于给出的答案 该系统可以正常工作我几个月前提出的一个问题 https stackoverflow com quest
  • Json 到 C# 对象处理动态属性

    我正在尝试在 c 对象中实现 json 结构 并且我正在尝试了解如何根据类型使用正确的对象 例如 public class RootObject public string name get set public Content conte
  • 有什么方法可以绘制印度地图吗?

    我正在尝试使用plotly 绘制印度地图 但无法找到方法来做到这一点 下面是我在美国尝试过的代码 import pandas as pd df sample pd read csv https raw githubusercontent c
  • 软件中显示过多“皮肤”检测

    我正在构建一个 ASP NET 网站 用户可以在其中上传自己的照片 每天可能会上传数千张照片 我的老板问过几次的一件事是 是否有任何方法可以检测到是否有任何照片显示太多 皮肤 并在编辑做出最终决定之前自动将这些照片标记为 仅限成人 最好的选
  • 如何确保 div 和同位素没有空白

    我正在尝试创建一个网格布局http www gablabelle com http www gablabelle com 我有多个漂浮着同位素的 div 我想知道为什么有一些空白空间以及为什么漂浮的 div 没有填充间隙 与这里同样的问题
  • CSS 最小宽度 div 不强制其容器达到预期的正确尺寸

    我有一个需要最小宽度的 DIV 我无法使用 CSSmin width因为它不是跨浏览器的 我创建了一个具有设定宽度的内部 div 当浏览器小于这个内部 div 时 我会按预期得到一个滚动条 问题是外部 div 不断缩小 小于内部 div S
  • 如何从 github 手动或离线安装 R 包

    我尝试从 github 下载 tsdyn 包 它尚未在 cran 上更新 但我的代理阻止我连接到 github library devtools install github MatthieuStigler tsDyn ref Dev94
  • 在 React 中将函数向下传递给子组件

    我试图将一个函数传递给 React 中的子组件 如果我将该函数放在 ES6 类中 我就可以访问this props dispatch 但无权访问mapStateToProps 相反 当我在 ES6 类之外定义函数时 我似乎可以访问该函数 但
  • 如何使用office.js获取office应用程序版本值

    Office 应用程序版本可以在清单文件中提及 如下所示
  • C++11 中一个表达式中同一变量的双重赋值

    C 11 标准 http www open std org jtc1 sc22 wg21 docs papers 2012 n3337 pdf 5 17 expr ass 指出 在所有情况下 分配都是在值计算之后排序的 右操作数和左操作数的
  • 冰滑拼图寻路

    我对这个有点模糊的标题表示歉意 我不确定你会如何称呼这个谜题 我正在制作一种路径查找方法来查找移动次数最少的路线 而不是行驶的距离 游戏规则很简单 你必须从橙色方块移动到绿色方块 但你只能沿直线移动 并且不能停止沿该方向移动 直到碰到边界
  • 调整大小的 NSImageView 不重绘

    我有一个 NSImageView 它从应用程序包加载图像 它的设置如下 coverImage image NSImage imageNamed themeSignEnd png coverImage imageScaling NSImage
  • 内置 open 函数中模式 a、a+、w、w+ 和 r+ 之间的区别?

    在python内置的open http docs python org library functions html open功能 模式之间的确切区别是什么w a w a and r 特别是 文档暗示所有这些都将允许写入文件 并表示它打开文
  • Guice:如何基于(动态 Web 属性)更改运行时注入

    以下是我面临的问题的近似值 认为我们有一个带有一些规则的密码验证器 public interface RuleChecker Checks for a password strenght returns 10 for strong or 0