如果我有一个有状态类,它需要像无状态类这样的实用程序来对其执行操作。这些有状态类保存在容器(有状态)类的列表中。这就是我对纯Java所做的:
class Container {
List<Stateful> sfList;
}
class Stateful {
List<String> list;
void someMethod() {
list.add("SF");
Stateless.foo(this);
}
class Stateless {
public static void foo(Stateful sf) {
sf.getList().add("SL");
}
}
在main
里面是这样的过程:
Stateful sf = new Stateful();
sfList.add(sf);
sf.someMethod();
现在有了JavaEE CDI,我会做:
class StatefulBean {
List<String> list;
@Inject
StatelessBean slsb;
void someMethod() {
list.add("SF");
slsb.add(this);
}
@Stateless
class StatelessBean {
public void add(StatefulBean sfsb) {
sfsb.add("SL");
}
}
在这种情况下,所有StatefulBean都可以访问无状态Bean的共享池,而不会出现并发问题,并且可以根据请求进行适当的扩展。
然而,由于Stateful
不是托管bean,我无法将其注入,因此我使用了实用程序类。此外,我正在使用构造函数创建有状态的,所以我不能向其中注入无状态bean(我将使用它获得一个NPE)。
我的问题是:
无状态注入方法(如果它能工作)和实用程序类方法之间是否存在并发和可伸缩性差异?
是的,有,主要是围绕管理的丢失。在每次调用方法时实例化Stat
的方式,不涉及池。这将导致您创建比您可能需要的更多的实例。
另一个损失是在可扩展性方面。当容器将在分布式环境中管理有状态bean的钝化和激活时,手动方法将确保您管理自己的激活和钝化。
因为静态不是托管bean...
不准确的根据CDI规范,任何满足所列条件的java类(在您的例子中,默认的无参数构造函数)都是托管bean。这意味着您可以将无状态bean
注入到无状态中,容器会满足您的要求。要允许这种级别的管理,需要在bean中设置bean发现模式=all
。xml。
即使使用(显然不必要的)循环引用,正常Java并发规则也适用:只要您正在操作的状态不是静态的或在静态类中,您就是线程安全的。每个对该静态方法的线程调用仍然在单独的堆栈上运行,因此没有问题。
如何使EE注入方法起作用?如果需要按需实例化无状态
(或任何其他bean),请使用CDI实例
以编程方式获取所需任何类的托管实例。现在,您可以将类似的内容添加到容器中
:
@Inject @Dependent Instance<Stateful> stateful;
@PostConstruct
public void createStateless(){
//instantiate sfList;
sfList.add(stateful.get()); //execute as many times as you need
}
我用的是Spring Boot和JPA。就在这里 我有一个类似的域。而且注释似乎不建议使用,所以我使用代替。 我的类如下所示 类看起来像这样 使用这个类的看起来像这样 但当我开始应用程序我得到这个错误: 到底是什么问题?
我部署了一个Neo4j非托管扩展。可以使用REST客户端调用非托管扩展并成功返回结果。问题是,当我尝试从另一个java类调用/调用非托管扩展时,它会继续抛出未经授权的401。 我使用Spring RestTemboard来调用非托管扩展。 我的代码: 完全错误:
当我运行我的应用程序时,我收到一个错误。 应用程序结构 结构 pom.xml RestartApplication.java MvcConfig WebSecurityConfig 身份验证控制器(显示欢迎页面) 博客控制器 主控制器 注册控制器 邮政 角色 用户 后存储库 用户报告 我试图使用@EnableJpaRepositories和@EntityScan修复它,但这无济于事。在我的MySQ
问题内容: 我正在JavaFX中为大型Java项目构建GUI。这个项目有许多不同的工作线程在后台执行一些繁重的计算,我试图在GUI中可视化这些工作线程的进度。所谓进步,是指不仅是裸露的百分比,而且是Task类中未包含的其他变量,例如: 当前文件 当前错误计数 到目前为止读取的字节数 … 由于这些进度变量的变化非常快,并且由于必须从JavaFX线程(Platform.runLater())执行GUI
本文向大家介绍详解C# 托管资源和非托管资源,包括了详解C# 托管资源和非托管资源的使用技巧和注意事项,需要的朋友参考一下 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网
这个 sqlalchemy.sql.visitors 模块由类和函数组成,它们通常用于 穿越 核心SQL表达式结构。不像 Python ast 其中的模块提供了一个系统,通过该系统,程序可以对SQL表达式的每个组件进行操作。它的共同目的是定位各种元素,例如 Table 或 BindParameter 对象,以及改变结构的状态,例如用其他子句替换某些FROM子句。 注解 这个 sqlalchemy.