EJB中的依赖管理

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是按类型注入的还是按某种命名规则注入的?

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...