欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EJB中的依赖管理

程序员文章站 2024-02-22 21:57:24
...
[size=large][color=blue][b]EJB中的2中依赖管理的形式:[/b][/color][/size]

[size=large][color=blue][b]1、依赖查找[/b][/color][/size]

[size=medium][color=blue]第一种依赖查找的方式:[/color][/size]


package app.xjtu.impl;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.EJBs;
import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import app.xjtu.DependentJNDI;
import app.xjtu.HelloEJBWorld;

/**
* 该方式的依赖注入,有以下几点疑问:
*
* 1、@EJB有多个时,应使用@EJBs注解
*
* 2、该种方式,似乎对“HelloEJBWorld”(即依赖注入的目标),命名了一个JNDI名称
*
* 3、"java:comp/env" 是服务器端的JNDI命名环境
*
*
*/

@Stateless(mappedName="ejb/DependentJNDI")
@EJBs(
{
@EJB(name="targetOne",beanInterface=HelloEJBWorld.class),
@EJB(name="targetTwo",beanInterface=HelloEJBWorld.class)
}
)
public class DependentJNDIBean implements DependentJNDI {

private HelloEJBWorld hello;
private HelloEJBWorld hello2;

@PostConstruct
public void init(){
try{
Context ctx = new InitialContext();
hello = (HelloEJBWorld)ctx.lookup("java:comp/env/targetOne");
hello2 = (HelloEJBWorld)ctx.lookup("java:comp/env/targetOne");
ctx.close();
}catch(NamingException e){
throw new EJBException("初始化依赖对象时出错!",e);
}
}

@Override
public String getInfo() {

return "这是第一种Dependent Lookup方式: "+hello.sayHello()+"\n hello == hello2 "+(hello == hello2);
}

}




[size=medium][color=blue]第二种依赖查找的方式:[/color][/size]


package app.xjtu.impl;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import app.xjtu.DependentJNDI;
import app.xjtu.HelloEJBWorld;

/**
* 这是第2种dependent lookup,相比第1种:
*
* 1、没有异常的抛出
*
* 2、需要SessionContext对象
*
* 3、查找的JNDI名称简化了
*
*/

@Stateless(mappedName="ejb/DependentJNDITwo")
@EJB(name="targetTwo",beanInterface=HelloEJBWorld.class)
public class DependentJNDIBeanTwo implements DependentJNDI {

@Resource SessionContext context;
HelloEJBWorld hello;

@PostConstruct
public void init(){
hello = (HelloEJBWorld)context.lookup("targetTwo");
}

@Override
public String getInfo() {
return "这是第2中依赖注入:"+hello.sayHello();
}

}



[size=large][b][color=blue]依赖注入[/color][/b][/size]

这种方式,可以将Annotations放在Field或者Setter方法上。这两种的区别,暂不清楚。据说JPA的Entity Bean中2者是有区别的。(以后有时间慢慢研究)


package app.xjtu.impl;

import javax.ejb.Stateless;

import app.xjtu.HelloEJBWorld;

@Stateless(mappedName="HelloEJBWorld")
public class HelloEJBWorldBean implements HelloEJBWorld {

@Override
public String sayHello() {

return "GlassFish EJB Client Invoked -- 通过默认的JNDI名称调用";
}

}



package app.xjtu.impl;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import app.xjtu.HelloEJBWorld;
import app.xjtu.Injection;

@Stateless(mappedName = "ejb/Myinjection")
public class InjectionBean implements Injection {

@EJB
private HelloEJBWorld hello;

@Override
public String getInfo() {
return "这是EJB 注入后的输出:"+hello.sayHello();
}

}


这里的@EJB是按类型注入的还是按某种命名规则注入的?