加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

EJB中的依赖管理

发布时间:2020-12-13 20:28:57 所属栏目:百科 来源:网络整理
导读: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.nami
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是按类型注入的还是按某种命名规则注入的?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读