EJB实例教程笔记(三)
EJB实例教程笔记(三)
电子书EJB3实例教程byLiHuoming.pdf笔记
2.11 依赖注入(dependency injection)
在 传统的开发中,我们要使用某个类对象,可以通过new object来得到。但是在EJB中,需要通过JNDI查找或注入注释。
接口类Injection.java:
package com.sillycat.ejb;
public interface Injection {
public String sayHello();
}
EJB类InjectionBean.java如下:
package com.sillycat.ejb.impl;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.sillycat.ejb.HelloWorld;
import com.sillycat.ejb.Injection;
@Stateless
@Remote(Injection.class)
public class InjectionBean implements Injection{
@EJB (beanName="HelloWorldBean") HelloWorld helloWorld;
public String sayHello() {
return helloWorld.SayHello("注入类");
}
}
其中的@EJB beanName引入类另外一个EJB,helloBean。
我的测试类InjectionTest.java如下:
package com.sillycat.ejb;
import javax.naming.InitialContext;
import org.junit.BeforeClass;
import org.junit.Test;
public class InjectionTest {
protected static Injection injection;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
InitialContext ctx = new InitialContext();
injection = (Injection) ctx.lookup("InjectionBean/remote");
}
@Test
public void testSayHello() {
injection.sayHello();
}
}
@EJB注释除了可以标注字段,还可以标示到属性的setter方法上,比如替换成如下写法:
private HelloWorld helloWorld;
@EJB(beanName = "HelloWorldBean")
public void setHelloWorld(HelloWorld helloWorld) {
this.helloWorld = helloWorld;
}
如果注入的EJB在不同的jar,那么装载次序就有要求,不然要报找不到类。需要修改配置文件:
JBOSS_HOME/server/default/conf/jboss-service.xml找到里面的
<!--
<attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
-->
<attribute name="URLComparator">org.jboss.deployment.scanner.PrefixDeploymentSorter</attribute>
然后给jar文件编号,格式为:01_XXXX.jar, 02_XXXX.jar,JBOSS将根据编号从小到大的顺序发布。
2.11.1 资源类型的注入
注入DataSource
@Resource(mappedName="java:/DefaultMySqlDS") DataSource myDb;
注入DataSource带验证
@Resource(mappedName="java:/DefaultMySqlDS",authenticationType=AuthenticationType.APPLICATION) DataSource myDB
使用的时候要这样:
Connection conn = null;
conn = myDb.getConnection("root","*****");
注入事物类
@Resource private javax.transaction.UserTransaction utx;
注入时间服务
@Resource private javax.ejb.TimerService tms;
注入SessionContext
@Resource private javax.ejb.SessionContext ctx;
注入消息工厂
@Resource(mappedName="QueueConnectionFactory")
private javax.jms.QueueConnectionFactory factory;
注入消息连接地址
@Resource(mappedName="queue/mail")
private javax.jms.Queue queue;
2.11.2 注入与继承关系
InjectionBean注入了HelloWorld
那么public class SubInjectionBean extends InjectionBean 会默认也注入HelloWorld
2.11.3 自定义注入注释
2.12 定时服务(Timer Service)