EJB 3.1 @LocalBean vs no annotation

穿精又带淫゛_ 提交于 2019-12-17 03:23:11

问题


I understand the difference between local view, remote view and no-interface view. I just don't understand what is the difference between "no view" (no annotation) and no-interface view. And also why should I annotate my interface with @Local? What if I don't annotate the interface in at all, is there a difference?


回答1:


The rules are (from memory):

  1. Bean has a @LocalBean annotation -> bean has a no-interface view
  2. Bean has a @Local annotation -> bean has a local view
  3. Bean has a @Remote annotation -> bean has a remote view
  4. Bean has no view annotations, but directly implements an interface which has a @Local annotation -> bean has a local view
  5. Bean has no view annotations, but directly implements an interface which has a @Remote annotation -> bean has a remote view
  6. Bean has no view annotations, but directly implements an interface which has no view annotations -> bean has a local view
  7. Bean has no view annotations, and implements no interfaces -> bean has a no-interface view

So, using @LocalBean and using no annotation at all are both ways of getting a no-interface view. If you just want a no-interface view, then the simplest thing is not to annotate. Provided you're not also implementing any interfaces.

Part of the reason @LocalBean exists to add a no-interface view to a bean which also has an interface view. I imagine the scenario uppermost in the spec authors' minds was one where you have a bean like:

@Stateless
public class UserPreferences {
    public String getPreference(String preferenceName);
    public Map<String, String> getPreferences();
}

Where you would want to expose both methods locally, but only the coarser-grained getPreferences() remotely. You can do that by declaring a remote interface with just that method, then just slapping @LocalBean on the bean class. Without it, you'd have to write a pointless local interface just to expose both methods locally.

Or, to look at it another way, the @LocalBean exists because there is such a thing as a no-interface view, and the no-annotation option exists as a handy shortcut.




回答2:


  • Remote EJBs: can be accessed from remote clients (clients running on a different JVM such as Swing or JavaFX clients which run on the user machine)
  • Local EJBs: can only be access from other "components" running on the same JVM, e.g. Web Front-ends, other EJBs
  • No-interface view: same as Local but without specifing the business interface
  • No annotation: a simple POJO but not an EJB

Local/ No-interface views are more efficient than remote EJBs, since objects references can be passed around.




回答3:


I think that the confusion you/we are feeling is a result of history / backwards compitability (so to speak). I can't dicern any difference (except that the spec. requires implementations to create an interface if we use local-view)

The no-interface view has the same behavior as the EJB 3.0 local view, for example, it supports features such as pass-by-reference calling semantics and transaction and security propagation. However, a no-interface view does not require a separate interface, that is, all public methods of the bean class are automatically exposed to the caller. By default, any session bean that has an empty implements clause and does not define any other local or remote client views, exposes a no-interface client view.

Oracle Blog before release of EJB 3.1




回答4:


If you are interested in more technical details, let me say that what's really going on.... You don't have access to EJB object directly, it means you don't have the reference (address) of the actual EJB object. When you lookup or inject your EJB, the container provides an object as the client for that EJB (we can call proxy or Wrapper) and you invoke your business methods on that proxy object. (That's why you shouldn't use new keyword to create object of EJB class)

Now, for each type of annotation, container generates different type of proxies with different methods and functionalities.

@LocalBean (or no annotation) Your proxy object has:

  • setOptionalLocalIntfProxy()
  • getSerializableObjectFactory()

@Local You proxy object use local call and type of com.sun.proxy So it has:

  • getSerializableObjectFactory()
  • isProxyClass()
  • getProxyClass()
  • getInvocationHandler()
  • newProxyInstance()

@Remote You Wrapper object use remote call and it has:

  • readResolve()
  • writeReplace()
  • getStub()
  • getBusinessInterfaceName()


来源:https://stackoverflow.com/questions/10889563/ejb-3-1-localbean-vs-no-annotation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!