EJB3 学习笔记四

开发有状态bean,示例代码如下:

// 指定有状态bean

@Stateful

无状态bean使用实例池管理bean

有状态bean使用激活(activation)管理bean(为每一个用户创建一个bean,应用求场景:如购物车)

在ejb中调用其他ejb有以两种方式:

1 通过jndi查找的方式

????????????未实现,需查找jndi查找方法

2 通过注解方式注入并使用其他ejb或者服务,示例代码如下:

/**

 * Copyright (C) 2016

 *

 * FileName:Second.java

 *

 * Author:<a href="mailto:zhenhuayue@sina.com">Retacn</a>

 *

 * CreateTime: 2016-7-21

 */

// Package Information

package cn.yue.ejb.bean;

/**

 * 测试其他 ejb的调用,被调用接口

 *

 * @version

 * @Description:

 * @author <ahref="mailto:zhenhuayue@sina.com">Retacn</a>

 * @since 2016-7-21

 */

public interface Second {

   public String saySecond();

}

/**

 * Copyright (C) 2016

 *

 * FileName:SecondBean.java

 *

 * Author:<ahref="mailto:zhenhuayue@sina.com">Retacn</a>

 *

 * CreateTime: 2016-7-21

 */

// Package Information

package cn.yue.ejb.bean;

import javax.ejb.Local;

import javax.ejb.Stateless;

/**

 * 测试调用其他ejb,被调用bean

 *

 * @version

 * @Description:

 * @author <ahref="mailto:zhenhuayue@sina.com">Retacn</a>

 * @since 2016-7-21

 */

// 指定为无状态 bean

@Stateless

// 指定为本地接口

@Local(Second.class)

public class SecondBean implementsSecond {

   @Override

   public String saySecond() {

       return "second";

   }

}

/**

 * Copyright (C) 2015

 *

 * FileName:HelloWorldBean.java

 *

 * Author:<a href="mailto:zhenhuayue@sina.com">Retacn</a>

 *

 * CreateTime: 2015-1-14

 */

// Package Information

 

package cn.yue.ejb.bean;

 

import java.util.Hashtable;

 

import javax.ejb.EJB;

import javax.ejb.Local;

import javax.ejb.Remote;

import javax.ejb.Stateless;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

 

//import javax.ejb.Stateless;

 

/**

 * 实现业务接口 并添加两个注释 测试调用其他ejb

 *

 * @version

 * @Description:

 * @author<a href="mailto:zhenhuayue@sina.com">Retacn</a>

 * @since 2015-1-14

 */

// 指定为无状态会话bean

@Stateless

// 指定有状态bean

// @Stateful

// 指定远程接口

@Remote(RemoteHelloWorld.class)

// 指定为本地接口

@Local(LocalHelloWorld.class)

publicclass HelloWorldBean implements LocalHelloWorld, RemoteHelloWorld {

@EJB(beanName = "SecondBean")

   Second second;

 

@Override

public String SayHello(String name) {

// try {

// Properties props = newProperties();

//props.setProperty("java.naming.factory.initial",

//"org.jnp.interfaces.NamingContextFactory");

//props.setProperty("java.naming,provider.url", "localhost:1099");

//props.setProperty("java.naming.factory.url.pkgs",

// "org.jboss.naming");

//

// InitialContext ctx;

// ctx = newInitialContext(props);

// HelloWorld helloworld =(HelloWorld)

//ctx.lookup("HelloWorldBean/romote");

// // out.println(helloworld.SayHello("retacn"));

// } catch (NamingException e) {

// e.printStackTrace();

// }

 

// 调用其他ejb有两种方式:

// 1 通过jndi查找

 

// try {

//System.out.println("start-----");

// System.out.println("调用其他ejb: " + callByJndi().saySecond());

// } catch (NamingException e) {

//System.out.println("exception-----");

// e.printStackTrace();

// }

//System.out.println("end----");

// 2 通过依赖注入

 

return name + " say:hello world! this ismy first EJB test! " + second.saySecond();

   }

 

@Override

public String localSay(String name) {

return"local---" + name + " say:hello world! this ismy first EJB test!";

   }

 

@SuppressWarnings("unchecked")

public Second callByJndi() throws NamingException {

@SuppressWarnings("rawtypes")

final Hashtable jndiProperties = new Hashtable();

        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");

final Context context = new InitialContext(jndiProperties);

 

// 如果服务器布署的是.ear包,则appname为.ear之后的包名,如果的war或是jar包,appName可以为空

final String appName = "";

final String moduleName = "HelloWorldEJB";

final String distinctName = "";

final String beanName = "SecondBean";

final String viewClassName = Second.class.getName();

 

final String namespace = "ejb: " + appName + "/" + moduleName + "/" + distinctName

                + "/"

                + beanName + "!" + viewClassName;

        System.out.println("调用其他ejb,namespace:" + namespace);

        Second second = (Second)context.lookup(namespace);

return second;

   }

 

}

 

原文地址:https://www.cnblogs.com/retacn-yue/p/6194214.html