1 改变会话bean的JNDI名
@Stateless(name="A_Bean") //此处定义的是beanName,注入此bean到其它的bean时会用到
@Remote(A.class)
@RemoteBinding(jndiBinding="AA") //@Stateless(mappedname=" ")可以统一规定全局jndi名,而不是远程,本地分别各自定义
class ABean implements A{
略
}
这样原来的jndi为 ABean/remote ,现在为 AA
(local本地接口 以此类推)
2 会话bean的生命周期
无状态会话bean :创建 ,销毁
有状态会话bean:创建,钝化/激活循环,销毁
我们可以将会话bean的一个普通方法,定义为 bean不同生命周期的 回调函数
@PostConstruct (bean实例化后立即执行)
public void run(){}
这样run方法在所在bean实例话后就会立刻执行,此外还有
@PreDestroy (bean销毁前)
@Remove (此注解的方法被调用的话,会执行销毁bean的动作)
此外有状态会话bean还有额外的生命周期管理
@PrePassivate (钝化前,有状态会话bean长时间空闲,容器会钝化它,存入缓存,钝化后一段时间仍然未被使用将会清除)
@PostActivate (激活后,立即执行)
@Init (有状态会话bean可以有多个@Init但是只有一个会被调用,它在@PostConstruct之前执行)
3 EJB拦截器
先创建 拦截器类
public class MyInterceptor {
@AroundInvoke
public Object XXX (InvocationContext ctx) throws Exception{ //只有红色部分是可选的,其它东西必须固定格式
String name=ctx.getMethod().getName();
System.out.println("before "+name);
Object o=ctx.proceed(); -----此处是被拦截的方法在执行,可以在它的前后加上自己的业务
System.out.println("after "+name);
return o;
}
}
在需要的业务方法上 插入 拦截器
@Interceptors(XXX.class)
4 依赖注入(包括EJB注入,资源注入)
EJB注入,就是会话bean的注入,比如在一个会话bean内使用别的会话bean
a。可以通过JNDI查找的方式注入,必须之前JNDI ENC中添加注册项,这是ejb-jar.xml 必须放在META-INF文件夹下
它是以 java:comp/env 为上下文的 如 ava:comp/env/xxxx
b。使用 @EJB(beanName="xxx") XxxBean myBean;
beanName是@Stateless.name()和Stateful.name()
此外还可以是mappedName他是全局JNDI名不过他和容器厂商有关不利于移植
资源类型注入(注入的对象是任何由JCA资源适配器定义的类型)
以注入mysql数据源为例(有了数据源,就可以方便的进行jdbc开发了)
a。将mysql-jdbc的驱动放入%JBOSS_HOME%/server/default/lib
b。%JBOSS_HOME%/docs/examples/jca中找到mssql-ds.xml这是mysql数据源的配置文件
c。对其稍作修改如改改连接地址,密码什么的。发布到%JBOSS_HOME%/server/default/deploy目录
d。在 会话bean内
@Resource(mappedName="java:MySqlDS",type=DataSource.class)
DataSource ds;
( 全局jndi为java:MySqlDS是因为 他不是全局jndi不能被外部访问,以java:开头)
注入完成。