`
xiaolongfeixiang
  • 浏览: 234814 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

EJB中的依赖管理

    博客分类:
  • EJB3
阅读更多
EJB中的2中依赖管理的形式:

1、依赖查找

第一种依赖查找的方式:

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);
	}

}




第二种依赖查找的方式:

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();
	}

}



依赖注入

这种方式,可以将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是按类型注入的还是按某种命名规则注入的?



2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics