我正在开发一个用EJB开发的旧项目。
我的serviceImpl为@Stateless(mappedName = "adminService")
。我在我的项目中已经看到
@EJB(mappedName = "java:app/adminServices/adminServiceImpl")
和其他类是同一个EAR的一部分,但是不同的模块。此serviceImpl类仅在此EAR中使用。
所以我的问题是,如果我们有一个声明为@Stateless
的类并且没有在其他EAR中使用。此类正在相同的EAR模块中使用。那么,我们不能直接使用@Inject
而不声明@Stateless吗?
我知道EJB的三种JNDI语法
java:global[/application name]/module name/enterprise bean name[/interface name]
java:module/enterprise bean name/[interface name]
java:app[/module name]/enterprise bean name[/interface name]
我不能@Inject
使用java:app
吗?
为什么我需要java:module
在同一个模块中,我可以直接创建一个对象或使用@Inject
。
如果是java:global
我可以理解你是否在其他JVM中,那么如果无状态bean实例在其他JVM中,你需要进行RMI调用以获取对象。所以我必须使用java:global
语法从其他JVM获取无状态bean实例,即使在同一个JVM中也是如此。因为我不认为我们可以使用@Inject
将实例从另一个EAR项目中获取到您的EAR中。
但是在相同的JVM和相同的EAR中,如果bean不是@EJB
,则需要java:app和java:模块JNDI语法来通过singleton
注释获取实例。
我可以直接使用@Inject
。