首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >“辅助”工厂的输出应该是@Singleton

“辅助”工厂的输出应该是@Singleton
EN

Stack Overflow用户
提问于 2012-08-07 02:56:28
回答 1查看 1.9K关注 0票数 2

我目前正在尝试在一个小应用程序中使用Google Guice-3.0。

运行此应用程序时,系统会提示用户输入其姓名和密码。因为这些信息直到运行时才知道,所以我使用AssistedInject来实现我的User实例化。

这就是我的UserFactory的用武之地。它为User提供了方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public User create(@Assisted("Username") String username, 
                   @Assisted("Password") String password);

User类在程序开始时(在用户输入之后)通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User user = getInjector().getInstance(UserFactory.class).create(username, password);

我想在应用程序的整个生命周期中使用这个实例。我已经将作用域设置为@Singleton

然而,问题是,我只得到错误。Guice抱怨我在调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User user = getInjector().getInstance( User.class );

如果我将一个bind( User.class );添加到configure方法中,就会出现一个错误,说明没有对注释@Assisted进行声明(因为您可以在参数前面放置注释来唯一地标识它们- Guice可能认为它是参数之一,并要求设置依赖项(例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bind( String.class ).annotatedWith( Assisted.class ).toInstance( username );

但是这不是一个可以工作的东西(也许它可以通过静态引用来工作,但是为什么要使用Guice呢?

这里有一个你可以编译的例子。注释的代码会导致错误。特别是最后两行让我很恼火。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class KSKB {

    @Singleton
    public static class User {

        public final String name;

        @Inject
        public User(@Assisted("Username") String username) {
            this.name = username;
        }

        public static interface Factory {
            public User create(@Assisted("Username") String username);
        }
    }

    public static void main(String... args) {
        Injector injector = Guice.createInjector(new AbstractModule() {

            @Override
            protected void configure() {
                install(new FactoryModuleBuilder().build(User.Factory.class));
                // bind( User.class );
            }

        });
        User user = injector.getInstance(User.Factory.class).create("Guice");
        System.out.println(user.name);

        // user = injector.getInstance( User.class ); // doesn't work - throws Exception!!
        // System.out.println( user.name );
    }
}
EN

回答 1

Stack Overflow用户

发布于 2012-08-20 14:15:26

辅助注入的输出不是注入--它是自动连接的工厂(可悲的是,这个工厂的名字很糟糕)。

AssistedInject生成的是一个工厂--工厂可以是单例的。但它是一个工厂,所以它的工作是创建对象,比如User对象。Factory的内部结构并没有设置为让它创建单值对象。一般来说,值对象不是单例对象--您在这里使用一个对象作为“上下文”而不是数据,因此您有一个特殊情况。

此外,您的情况更加特殊,因为您希望在guice运行之前预先验证数据库中的数据。这个用户完全是上下文,而不是数据,所以不要使用工厂来创建它。手动创建它,如果您需要在Guice绑定的系统中的其他地方使用它,那么在Guice外部创建它,并将其作为DatabaseCredentials对象或类似对象传递到模块中。

为了正确地帮助你,我们需要看到一个更大的设计概念,但我的感觉是,你没有清楚地考虑到协作者/服务、值类型、上下文/配置等之间的区别,而混乱主要是因为“用户”这个词在这里被重载了。是的,它是一个“用户”,但数据库用户与系统中的其他用户不是同一类型的用户-即使它在结构上相同,它意味着不同的东西,具有不同的生命周期,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11838634

复制
相关文章
Linux各目录及每个目录的详细介绍(转载)
Linux目录和Windows目录有着很大的不同,Linux目录类似一个树,最顶层是其根目录,如下图:
lin_zone
2018/08/15
1.2K0
Linux各目录及每个目录的详细介绍(转载)
PHP中的会话
2、当执行php xxx.php 时,默认系统会把当前的进程设置为会话首进程(使用strace查看),所以当前会话首进程不能使用posix_setsid 创建为会话首进程,只能使用子进程调用此函数
北溟有鱼QAQ
2021/06/08
1.2K0
安全研究 | 使用PortShellCrypter对你的shell会话进行加密
PortShellCrypter支持对shell会话进行E2E加密,可以帮助研究人员在完全不需要了解底层传输机制的情况下,对会话信息进行可靠的加密。除此之外,PortShellCrypter还可以发送/接收Base64编码的数据而无需对数据进行修改或过滤。除了接收E2E PTY之后,还可以转发TCP和UDP连接,这个功能有些类似于OpenSSH的-L参数。而且不需要在信息发起点本地分配IP地址,这将允许取证人员或渗透测试人员通过下列方式创建网络连接:
FB客服
2021/03/25
8190
Python 对目录的操作
一、递归遍历目录 <span class="hljs-comment"># 返回所有文件的绝对路径</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">traverseDir</span><span class="hljs-params">(dirPath)</span>:</span> absPathList = [] <span class="
星哥玩云
2022/09/08
2600
linux 计算当前目录下每个文件、目录占用的磁盘大小
直接贴代码 #!/bin/bash # function calculator_dir_size(){ for file in `ls $1` do local size=`du -h --max-depth=0 $file|awk '{print $1}'` echo $file is $size echo "" done } IFS=$'\n' #这个必须要,否则会在文件名中有空格时出错 INIT_PATH="."; calculator_dir_size
特特
2022/03/25
3.9K0
Linux下如何对目录中的文件进行统计
统计目录中文件的最简单方法是使用ls每行列出一个文件,并将输出通过管道符传递给wc计算数量:
用户1685462
2021/09/06
3K0
hostmonitor对异常用户会话的监控
1.trade@front,创建/home/trade/monitor目录 2.上传脚本至/home/trade/shell下,
小尘哥
2018/12/25
6310
PHP中的会话控制
了解HTTP(超文本传输协议)可以知道,它采用请求与响应的模式,最大的特点就是无连接无状态。 无连接:每次连接仅处理一个客户端的请求,得到服务器响应后,连接就结束了 无状态:每个请求都是独立的,服务器
小古哥
2018/03/08
1.7K0
PHP中的会话控制
mysql中localhost和127.0.0.1的区别
mysql的默认的root用户会有很多行,自习观察后你就会发现每行的用户名或密码可能相同,但是host一定不同,host是登陆用户的主机名,也就是说,'localhost','127.0.0.1','phpgao.local','%'都算不同的用户!
老高的技术博客
2022/12/27
1K0
每个线程对自己的Cell变量的value
可能你会觉得,线程 t2 不就是要将"A"改为"C"嘛,虽然中间变化了,但对 t2 也没影响呀比如:你的银行卡里有10w,中间你领了工资1w,然后,又被扣除还了房贷1w,此时,你的银行卡里还是10w。遴选公务员虽然结果没变,但余额已经不是原来的余额了。而且,你一定在意中间你的钱去哪里了,所以是不一样的。中间的记账明细,其实我们是关心的,因为这个时候你已经犯法了。http://lx.gongxuanwang.com/
用户7737280
2021/12/02
3380
Localhost如何使用HTTPS?
在这篇文章中,关于localhost的说法对127.0.0.1和[::1]也是有效的,因为它们都描述了本地计算机地址,也叫 "回环地址"。另外,为了使事情简单,不指定端口号。因此,当你看到http://localhost时,请将其理解为http://localhost:{PORT}或 http://127.0.0.1:{PORT}。
智影Yodonicc
2022/04/24
12.7K0
Localhost如何使用HTTPS?
Laravel 框架中对Layer的使用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/78928912
泥豆芽儿 MT
2018/09/11
2K0
Laravel 框架中对Layer的使用
linux中对shell变量的使用
我有一段shell命令如下:cd /www/wwwroot/learn.gaojiufeng.cngit fetch --all git reset --hard origin/masterchmod -R 755 /www/wwwroot/learn.gaojiufeng.cnchown -R www /www/wwwroot/learn.gaojiufeng.cn很显然有很多重复的路径,我们用变量替换试试dir="/www/wwwroot/learn.gaojiufeng.cn/" && cd $
高久峰
2023/05/20
1.4K0
对Unity的Resources目录进行改名
项目用的是Unity5.5版本,开发的时候将相关的图集、预制对象资源都放在 Resources 目录下,而真机使用的是 StreamingAssets 目录下的资源。
meteoric
2018/11/20
1K0
WCF中关于可靠会话的BUG!!
对WCF的可靠会话编程有一定了解的人应该知道,我们可以使用 DeliveryRequirementsAttribute 可以指示WCF确认绑定提供服务或客户端实现所需的功能。如果在从应用程序配置文件加载服务说明或在代码中以编程方式生成服务说明时检测到 DeliveryRequirementsAttribute 属性,则 WCF 会验证所配置的绑定,并支持该属性指定的所有功能。例如,您的服务可能要求绑定支持队列。使用 DeliveryRequirementsAttribute 可以让WCF 确认是否满足下列要
蒋金楠
2018/02/07
6910
WCF中关于可靠会话的BUG!!
PbootCMS网站提示:“会话目录写入权限不足”的解决办法
关于PbootCMS网站出现“会话目录写入权限不足“的错误提示,解决办法如下: 对必备写入权限的文件夹添加755或者777权限,根目录下有: config目录(存放授权码与数据库配置文件) data目录(存放sqlite数据库文件) runtime目录(存放日志文件) 注意:为了更好的安全考虑,可自行调整权限,推荐755权限设置。
小唐同学.
2022/02/23
3.3K0
简述部署ERP对企业的每个员工工作的益处
企业部署ERP对公司发展以及对于员工来说有什么好处呢? 企业的稳定发展才合格证员工的基本工作利益 业务操作更加简便 提供机遇培养自已成为复合型人才 统一规范的业务流程降低了工作风险 企业管理的高效透明
明象ERP
2019/03/01
5400
Oracle中唯一约束和唯一索引的区别
在使用TOAD来操作Oracle数据库时,会注意到创建约束时有Primary Key、Check、Unique和Foreign Key四种类型的约束,这与SQL Server中的约束没有什么区别,这里的Check约束除了用于一般的Check约束外,在Oracle中也用于非空约束的实现。也就是说如果一个字段不允许为空,则系统将会创建一个系统的Check约束,该约束定了某字段不能为空。
深蓝studyzy
2022/06/16
1.3K0
Oracle中唯一约束和唯一索引的区别
25. 会话技术-Cookie的使用
B/S架构中:从浏览器第一次给服务器发送请求时,建立会话;直到有一方断开,会话结束。
Devops海洋的渔夫
2021/11/12
1.4K0
25. 会话技术-Cookie的使用
点击加载更多

相似问题

如何使会话对每个用户都是唯一的?- Node.js

22

在Meteor中对每个会话进行唯一排序?

21

对db中的每个“会话”使用新的SQL表

10

扩展中每个Chrome Tab的唯一会话

13

使用PowerShell对列表中的每个目录运行命令

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文