JavaEE5学习笔记05-EJB之会话Bean(sessionBean)总结-----7

1.      EJB的容器式依赖对象注入

就像Spring IOC所倡导的那样(其实是Spring设计时借鉴的EJB的思想),当一个Bean完成一项任务的时候需要其他的组件配合使用才能完成,这个时候就出现了依赖,此Bean依赖于另一个Bean的某些服务才能完成自己的服务。那么我们最原始的办法就是new一个Bean出来是吧?当然这是十分,不太成熟的做法。在《Effective Java》这本书中第一章节就提倡类和类之间调用不要用new,构造函数也尽量用工厂去创建等等……总之依赖注入就是为了解耦。在JBoss这种应用服务器中的EJB容器组件如果需要互相调用该怎么办呢,同样为了不硬编码、解耦合。就需要容器注入了。我们来看例子

接口1

 

@Local

public interface XMLUtilBean {

    public String readXml();

}

实现类1

 

 

 

@Stateless

 

public class XMLUtilBeanEAOImpl implements XMLUtilBean {

   

    @Override

    public String readXml() {

       return "xml服务…………";

    }

}

接口2

 

 

 

@Remote

 

public interface ServerBean {

    public boolean insert(String name);

}

实现类2

 

@Stateless

public class ServerBeanEAOImpl implements ServerBean {

 

    @EJB(beanName = "XMLUtilBeanEAOImpl")

    private XMLUtilBean xMLUtilBean;

 

    @Override

    public boolean insert(String name) {

       String xml = xMLUtilBean.readXml();

       System.out.println(xml + "::::" + name);

       return true;

    }

}

此处实现类用了@EJB(beanName = "XMLUtilBeanEAOImpl")注解将EJB组件名为XMLUtilBeanEAOImpl的组件给注入了进来。所以在insert方法中可以直接调用xMLUtilBean对象了。

测试代码如下:

 

    public void test01() throws Exception {

       Context context = init();

       ServerBean serverBean = (ServerBean) context

              .lookup("ServerBeanEAOImpl/remote");

       System.out.println(serverBean.insert("蜕变妖狼"));

    }

执行后JBoss控制台信息如下:

 

16:04:19,450 INFO  [STDOUT] xml服务…………::::蜕变妖狼

证明被注入的组件使用正常。

2.      EJB的容器式资源注入

以上是EJB组件之间的调用可以使用@EJB注解作为依赖注入,如果该EJB使用了容器的某些类,比如应用上下文对象、数据源等等,其实大可不必手工创建这些资源,在EJB中直接采用资源注入就可以了。如下代码

 

@Stateless

@TransactionManagement(TransactionManagementType.CONTAINER)

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public class ResourceDIServerBeanEAOImpl implements ResourceDIServerBean {

 

    @Resource(mappedName="java:/jbossdemo")

    private DataSource dataSource;

 

    @Resource

    private SessionContext sessionContext;

 

    @Override

    public void insert() {

       Connection connection = null;

       Statement statement = null;

       try {

           connection = dataSource.getConnection();

           statement = connection.createStatement();

           String insert1 = "insert into person values(9,'剑藏玄')";

           String insert2 = "insert into person values(10,'傲笑红尘')";

           statement.executeUpdate(insert1);

           statement.executeUpdate(insert2);

           statement.close();

           connection.close();

       } catch (Exception e) {

           System.out.println("事务回滚~~");

           sessionContext.setRollbackOnly();

           e.printStackTrace();

       }

    }

}

在这个会话Bean中就注入了数据源和容器会话上下文。这样开发者就省去了自己实例化的步骤,直接引用容器给你注入的资源就好了。

3.      计时器进行任务调度

类似于Spring集成了Quartz似的,EJB自己有一个任务调度管理器。也可以指定某个时间执行某些特殊的任务,比如在晚上0点的时候银行清点所有分行的账务、统计局在每个月的月底集中统计某些“和谐”后的统计数字等等……下面我们看简单实用例子

接口

 

@Remote

public interface ITimeEAO {

    void setTimeServer(Date date, long timeLong);

    void gc(Timer timer);

}

实现类如下

 

 

 

 @Stateless

public class TimeEAOImpl implements ITimeEAO {

 

    @Resource

    TimerService timerService;

 

    /**

     * 实际执行的方法

     *

     * @Timeout就是定义执行的方法

     */

    @Override

    @Timeout

    public void gc(Timer timer) {

       // TODO Auto-generated method stub

       System.out.println("timer.getInfo():" + timer.getInfo());

       System.out.println("建议服务器赶紧进行垃圾回收");

       System.gc();

    }

 

    /**

     * 对于定时器的一些设置

     */

    @Override

    public void setTimeServer(Date date, long timeLong) {

       /**

        * 每隔timeLong时间就执行一次gc方法

        */

       timerService.createTimer(date, timeLong,"执行任务");

    }

 

}

如果调用timerService.createTimer(date, timeLong)那么只执行一次。还有就是注意timeLong单位是秒。测试代码如下

 

    public void test01() throws NamingException {

       context = init();

       ITimeEAO imeEAO = (ITimeEAO) context.lookup("TimeEAOImpl/remote");

       imeEAO.setTimeServer(new Date(), 2);

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值