J2EE包含组件:servlet,JSP,EJB等
EJB包含三种bean:
1)session bean
2)entity bean
3)message-driven bean
容器:提供特定程序组件服务的标准化运行时环境,为组件提供与部署、执行、生命周期管理、安全和其他组件需求相关的服务。web组件和业务组件包含在容器中。
- Web容器(如Tomcat):包含JSP和servlet组件,Web容器中的组件可调用EJB容器中的组件完成复杂的业务逻辑。
- EJB容器(如JBoss):包含的组件为EJB,用于业务逻辑的实现。
- Applet容器
- Application Client容器
java持久化:使用对象-关系映射方法将面向对象模型和关系数据库联系起来。由三个部分组成:
- java持久化API
- 查询语言
对象-关系映射元数据
会话bean
会话bean是可以被客户端直接调用的EJB组件。
会话包括:http请求,Telnet,FTP等。
有状态:会话调用之间维护其状态。无状态:一次性调用。
会话bean分为两部分,接口(local,remote)和实现。
拦截器是基于AOP的EJB版本。AOP将横切事项隔离到各自的模块中。
计时器服务是轻量级应用程序调度器的EJB版本,将会话bean转化为循环或非循环的调度任务。
InitialContext ctx = new InitialContext;
HelloEJBRemote hr = (HelloEJBRemote)ctx.lookup("HelloEJBBean/remote");
xxxEar.ear
默认JNDI名称:xxxEar/xxxBean/local;xxxEar/xxxBean/remote;
xxxJar.jar
默认JNDI名称:xxxBean/local;xxxBean/remote;
自定义JNDI名称
@RemoteBind(jndiBinding="xxx")
会话bean的生命周期
1)创建会话bean:容器调用bean对象的newInstance方法。
2)实例化会话bean
3)销毁bean
@PostConstruct:bean实例化之后
@PreDestroy:销毁bean之前
@PrePassivate:有状态的会话bean空闲过长时,会进行钝化,状态保存在缓存之前
@PostActicate:钝化的bean被调用,新的bean被实例化,状态被恢复之后
@Init:有状态会话bean初始化,顺序位于PostConstruct之前
@remove:指定该方法执行完之后因把bean实例从对象池中移走。
拦截器
拦截器MyInterceptor
public class MyInterceptor{
@AroundInvoke
public Object xxx(InvocationContext ctx)throws Exception{
try{
if(ctx.getMethod().getName().equals("xxxMethod")){
....
}
return ctx.proceed();
}
catch(Exception ex){
throw ex;
}
}
}
被拦截的bean
@Stateless
@Local(Mybean.class)
public class Mybean{
@Interceptor(MyInterceptor.class)
public void xxxMethod(){
....
}
}
依赖注入
1)注解 @EJB(beanName=”xxx”)
2)ENC中获取资源的引用,通过 ejb-jar.xml定义。
xxxBean bean =(xxxBean)ctx.lookup("java:comp/env/xxxBean");