现在的位置: 首页 > 综合 > 正文

EJB总结一

2013年08月21日 ⁄ 综合 ⁄ 共 2272字 ⁄ 字号 评论关闭

概念理解

EJB是sun的服务器端组件模型,设计目标与核心应用是部署分布式应用程序。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限特定的平台。定义了一个用于开发基于组件的企业多重应用程序的标准。

企业Bean

在J2EE中,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。

企业Bean

1.Session Bean:有状态和无状态

       有状态的会话Bean:即Ejb能够为同一个客户端在多次请求方法调用之间保持状态信息。

       无状态的会话Bean:EJB容器不会对EJB的状态做管理,容器会使用实例池的方式或者单例的方式来实现无状态的SessionBean

由:Struts2中的Action,是有状态(prototype);Spring管理的业务逻辑类,是无状态的(Singleton)

这篇博客挺好:有状态sessionbean无状态sessionbean

2.Entity Bean:是持久数据组件,代表存储在外部介质中的持久(Persistence)对象或者已有的企业应用系统资源。简单地讲,一个Entity Bean可以代表数据库中的一行记录,多个客户端应用能够以共享方式访问表示该数据库记录的Entity Bean。

3.MessageDriven Bean是基于JMS消息,一种异步的无状态SessionBean。

JMS下一篇将详细介绍。      

SSH架构在整个Java EE架构中的位置

EJB的依赖注入:

第一:通过JNDI来获取HelloWord

public interface Jndi {
    public String sayHello();
}

@Stateless
@Remote( { Jndi.class })
@RemoteBinding(jndiBinding = "com/wkc/jndi")
public class JndiBean implements Jndi {

    @Override
    public String sayHello() {
        HelloWorld helloworld = getHelloWorld();
        return helloworld.sayHello("jndi");
    }

    public HelloWorld getHelloWorld() {
        try {
            InitialContext ctx = new InitialContext();
            HelloWorld helloworld = (HelloWorld) ctx
                    .lookup("com/wkc/helloworld");//通过jndi来获取HelloWorld
            return helloworld;
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

第二:通过@Ejb()注释来存取HelloWord

public interface Injection {
    String sayHello();
}

第一种方式:

@Stateless
@Remote( { Injection.class })
@RemoteBinding(jndiBinding = "com/wkc/injection")
public class InjectionBean implements Injection {

    @EJB(beanName="HelloWorldBean")//beanName指定EJB的名称(如果@Stateless或@Stateful没有设置过name属性,默认为不带包名的类名)
    private HelloWorld helloworld;

    @Override
    public String sayHello() {
        return helloworld.sayHello("注入者");
    }
}

第二种方式:

@Stateless
@Remote( { Injection.class })
@RemoteBinding(jndiBinding = "com/wkc/injection")
public class InjectionBean implements Injection {

    private HelloWorld helloworld;

    @EJB(beanName = "HelloWorldBean")//容器会在属性第一次使用之前,自动的用正确的参数调用bean的Setter方法
    public void setHelloWorld(HelloWorld helloworld) {
        this.helloworld = helloworld;
    }

    @Override
    public String sayHello() {
        return helloworld.sayHello("注入者");
    }
}

第三种方式:

@Stateless
@Remote( { Injection.class })
@RemoteBinding(jndiBinding = "com/wkc/injection")
public class InjectionBean implements Injection {

    @EJB(mappedName="com/wkc/helloworld")//mappedName指定EJB的全局JNDI名
    private HelloWorld helloworld;

    @Override
    public String sayHello() {
        return helloworld.sayHello("注入者");
    }
}

抱歉!评论已关闭.