EJB 3.1 @LocalBean vs aucune annotation
Je comprends la différence entre la vue locale, de vue à distance et sans-vue de l'interface. Je ne comprends pas quelle est la différence entre "pas de vue" (aucune annotation) et l'absence de vue de l'interface. Et aussi pourquoi devrais-je annoter mon interface avec @Local
? Que faire si je n'ai pas d'annoter l'interface à tous, est-il une différence?
- Ce type de bean EJB serait-il devenu si vous n'avez pas d'annoter tout cela? Ou pour le dire autrement, comment le conteneur de savoir si une classe a un POJO ou un SessionBean?
- Vous de les annoter avec Stateless, Stateful ou Singleton annotation et ensuite, soit vous l'annoter avec Local, à Distance ou LocalBean annotation ou vous n'avez pas l'annoter avec ce type d'annotation. De sorte que le conteneur de savoir si une classe est un SessionBean lorsque vous l'annoter avec soit Stateless, Stateful ou Singleton annotation.
- Correct. (Avant, je n'ai pas réussi à voir ce que vous pensé que la différence serait, maintenant, je ai grandi plus sage (cause j'ai eu une drôle d'idée).)
- Je pense que l'absence d'une annotation implique aucun-vue de l'interface. Donc il n'y a pas une différence entre "pas d'opinion" et une vue de l'interface!
Vous devez vous connecter pour publier un commentaire.
Les règles sont (de mémoire):
@LocalBean
annotation -> bean a un no-vue de l'interface@Local
annotation -> bean dispose d'une vue locale@Remote
annotation -> bean dispose d'une vue à distanceDonc, à l'aide de
@LocalBean
et utilisant l'annotation sont tous les deux façons d'obtenir un non-vue de l'interface. Si vous voulez juste un no-vue de l'interface, puis la chose la plus simple est de ne pas annoter. Si vous n'êtes pas aussi la mise en œuvre de toutes les interfaces.Partie de la raison
@LocalBean
existe pour ajouter un no-vue de l'interface à un haricot qui a aussi une vue de l'interface. J'imagine que le scénario le plus élevé dans la spécification des auteurs esprit était celui où vous avez un bean comme:L'endroit où vous voulez exposer les deux méthodes localement, mais seulement le plus de gros-grain
getPreferences()
à distance. Vous pouvez le faire par la déclaration d'une interface à distance avec juste cette méthode, puis il suffit de gifles@LocalBean
sur la classe d'haricot. Sans elle, vous devriez écrire un inutile interface locale uniquement pour exposer les deux méthodes localement.Ou, à regarder d'une autre façon, la
@LocalBean
existe parce qu'il ya une telle chose comme une vue de l'interface, et les sans-annotation option existe aussi un raccourci pratique.@LocalBean
.Local/N-interface de vues sont plus efficaces que les Ejb, depuis les objets de références peut être passé autour.
Je pense que la confusion, vous/nous sommes le sentiment est une conséquence de l'histoire /arrière compitability (façon de parler). Je ne peux pas dicern aucune différence (sauf que la spec. nécessite des implémentations de créer une interface, si nous utilisons des locaux-vue)
Oracle Blog avant la sortie de l'EJB 3.1
Si vous êtes intéressé par plus de détails techniques, permettez-moi de dire que ce qui se passe vraiment....
Vous n'avez pas accès à l'objet d'EJB directement, cela signifie que vous n'avez pas la référence (adresse) réelle de l'objet d'EJB.
Quand vous recherche ou de l'injecter, EJB, le conteneur fournit un objet en tant que client pour que les EJB (on peut l'appeler proxy ou Wrapper) et vous appelez votre entreprise de méthodes sur l'objet proxy. (C'est pourquoi vous ne devriez pas utiliser ce mot clé new pour créer un objet de la classe d'EJB)
Maintenant, pour chaque type d'annotation, conteneur génère différents type de proxy avec les méthodes et les différentes fonctionnalités.
@LocalBean
(ou pas d'annotation)Votre proxy de l'objet a:
setOptionalLocalIntfProxy()
getSerializableObjectFactory()
@Local
Vous proxy objet l'utilisation d'un appel local et le type de
com.sun.proxy
de Sorte qu'il a:getSerializableObjectFactory()
isProxyClass()
getProxyClass()
getInvocationHandler()
newProxyInstance()
@Remote
Vous Wrapper objet l'utilisation d'appels à distance et il dispose de:
readResolve()
writeReplace()
getStub()
getBusinessInterfaceName()