JavaEE(9)

1. SessionBean的生命周期

无状态Session Bean: 不存在状态-->待命状态-->被销毁状态

不存在状态-->待命状态:

1)通过构造器创建EJB实例

2)执行依赖注入

3)执行@PostConstruct回调方法

待命状态-->被销毁状态

1)执行@PreDestroy回调方法

有状态Session Bean: 不存在状态-->待命状态(<-->去活状态-->被销毁状态)-->被销毁状态

不存在状态-->待命状态

1)通过构造器创建EJB实例

2)执行依赖注入

3)执行@PostConstruct回调方法

待命状态-->去活状态

1)执行@PrePassive回调方法

去活状态-->待命状态

1)执行@PostActivate回调方法

待命状态-->被销毁状态

1)客户端调用@Remove方法

2)执行@PreDestroy回调方法

#1. 开发EJB(Net Beans创建EJB Module, 项目名称:Lifecycle)

ShopService.java

package org.crazyit.service;

import javax.ejb.*;
import java.util.*;

@Remote
public interface ShopService {
    void addItem(String item);
    Map<String, Integer> showDetail();
    void remove();
}

ShopServiceBean.java

package org.crazyit.service;

import java.util.*;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.*;

@Stateful(mappedName = "ShopService")
public class ShopServiceBean implements ShopService {

    private Map<String, Integer> buyInfo = new HashMap<String, Integer>();

    public void addItem(String item) {
        //该物品已经购买过
        if (buyInfo.containsKey(item)) {
            buyInfo.put(item, buyInfo.get(item) + 1);
        } else {
            buyInfo.put(item, 1);
        }
    }

    public Map<String, Integer> showDetail() {
        return buyInfo;
    }

    @Remove
    public void remove() {
        System.out.println("执行@Remove修饰的方法!");
    }

    //下面定义了5个简单的生命周期方法
    @Init
    public void init() {
        System.out.println("执行@Init修饰的方法!");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("执行@PostConstruct修饰的方法!");
    }

    @PrePassivate
    public void prePassivate() {
        System.out.println("执行@PrePassivate修饰的方法!");
    }

    @PostActivate
    public void postActivate() {
        System.out.println("执行@PostActivate修饰的方法!");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执行@PreDestroy修饰的方法!");
    }
}

#2. 客户端调用EJB (参见8.5)

2. 容器管理事务

#1. EJB开发(Net Beans创建EJB Module, 项目名称:CMT)

Cmt.java

package org.crazyit.service;

import javax.ejb.Remote;

@Remote
public interface Cmt {
    void insert();
}

CmtBean.java

package org.crazyit.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.Resource;
import javax.ejb.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

@Stateless(mappedName = "cmt")
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class CmtBean implements Cmt {

    private DataSource ds = null;

    @Resource
    private SessionContext sessCtx;

    public CmtBean() throws NamingException {
        Context ctx = new InitialContext();
        ds = (DataSource) ctx.lookup("javaee");
    }

    public void insert() {
        try {
            Connection conn = ds.getConnection();
            Statement stmt = conn.createStatement();
            int result = stmt.executeUpdate("insert into user_table values(null, '新用户' , 'bbb')");
            System.out.println(result);
            //下面这条语句将引起失败
            stmt.executeUpdate("insert into user_table values(1, 'aaa' , 'bbb')");
            stmt.close();
            conn.close();
        } 
        catch (SQLException ex) {
            ex.printStackTrace();
            sessCtx.setRollbackOnly();
        }
    }
}

#2. 客户端调用EJB (Net Beans创建Java Project: CmtTest)

Cmt.java

package org.crazyit.service;

public interface Cmt {
    void insert();
}

EjbClient.java

package lee;

import javax.rmi.*;
import javax.naming.*;
import java.util.Properties;

import org.crazyit.service.*;

public class EjbClient {

    public void test() throws NamingException {
        //获取WebLogic中JNDI服务的Context
        Context ctx = getInitialContext();
        Cmt cmt = (Cmt) ctx.lookup("Cmt#org.crazyit.service.Cmt");
        cmt.insert();
    }

    //工具方法,用来获取WebLogic中JNDI服务的Context
    private Context getInitialContext() {
        // 参见(4)
    }

    public static void main(String[] args) throws Exception {
        EjbClient client = new EjbClient();
        client.test();
    }
}

3. Bean管理事务

#1. EJB开发(Net Beans创建EJB Module, 项目名称:BMT)

Bmt.java

package org.crazyit.service;

import javax.ejb.Remote;

@Remote
public interface Bmt {
    void insert() throws Exception;
}

BmtBean.java

package org.crazyit.service;

import java.util.*;
import javax.ejb.*;
import javax.annotation.*;
import javax.naming.*;

import java.sql.*;
import javax.sql.*;
import javax.transaction.*;

@Stateless(mappedName = "bmt")
@TransactionManagement(TransactionManagementType.BEAN)
public class BmtBean implements Bmt {

    private DataSource ds = null;

    @Resource
    private UserTransaction trans;

    public BmtBean() throws NamingException {
        Context ctx = new InitialContext();
        ds = (DataSource) ctx.lookup("javaee");
    }

    public void insert() throws Exception {
        try {
            //开始事务
            trans.begin();
            Connection conn = ds.getConnection();
            Statement stmt = conn.createStatement();
            int result = stmt.executeUpdate("insert into user_table values(null, 'BMT插入的记录' , 'bbb')");
            System.out.println(result);
            //下面这条语句将引起失败
            stmt.executeUpdate("insert into user_table values(1, 'aaa' , 'bbb')");
            //提交事务
            trans.commit();
            stmt.close();
            conn.close();
        } 
        catch (SQLException ex) {
            ex.printStackTrace();
            //回滚事务
            trans.rollback();
        }
    }
}

#2. 客户端调用EJB (Net Beans创建Java Project: BmtTest)

Bmt.java

package org.crazyit.service;

public interface Bmt {
    void insert() throws Exception;
}

EjbClient.java

package lee;

import javax.rmi.*;
import javax.naming.*;
import java.util.Properties;

import org.crazyit.service.*;

public class EjbClient {

    public void test() throws Exception {
        //获取WebLogic中JNDI服务的Context
        Context ctx = getInitialContext();
        Bmt bmt = (Bmt) ctx.lookup("Bmt#org.crazyit.service.Bmt");
        bmt.insert();
    }

    //工具方法,用来获取WebLogic中JNDI服务的Context
    private Context getInitialContext() {
        // 参见(4)
    }

    public static void main(String[] args) throws Exception {
        EjbClient client = new EjbClient();
        client.test();
    }
}

4. 拦截器

#1. EJB开发(Net Beans创建EJB Module, 项目名称:Interceptor

MyInterceptor.java

package org.crazyit.interceptor;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class MyInterceptor {

    @AroundInvoke
    public Object log(InvocationContext ctx) throws Exception {
        System.out.println("------拦截器开始运行------");
        //让目标方法执行
        Object rvt = ctx.proceed();
        if (rvt != null) {
            rvt = "拦截器改变了返回值:" + rvt;
        }
        System.out.println("------拦截器执行结束------");
        return rvt;
    }
}

HelloCrazyit.java

package org.crazyit.service;

import javax.ejb.*;

@Remote
public interface HelloCrazyit{
    String hello(String name);
    void crazyit();
    void exclude();
}

HelloCrazyitBean.java

package org.crazyit.service;

import java.util.*;
import javax.ejb.*;
import javax.annotation.*;
import javax.interceptor.*;
import org.crazyit.interceptor.*;

@Stateless(mappedName = "HelloCrazyit")
@Interceptors(MyInterceptor.class)
public class HelloCrazyitBean implements HelloCrazyit {

    public String hello(String name) {
        System.out.println(name + ", 您好!现在时间是:" + new java.util.Date());
        return "crazyit.org";
    }

    public void crazyit() {
        System.out.println("疯狂Java联盟!");
        System.out.println("最受欢迎的Java论坛!");
    }

    @ExcludeClassInterceptors
    public void exclude() {
        System.out.println("被排除在拦截器机制之外的方法!");
    }
}

#2. 客户端调用EJB (Net Beans创建Java Project: InterceptorTest)

HelloCrazyit.java

package org.crazyit.service;

public interface HelloCrazyit {
    String hello(String name);
    void crazyit();
    void exclude();
}

EjbClient.java

package lee;

import javax.rmi.*;
import javax.naming.*;
import java.util.Properties;

import org.crazyit.service.*;

public class EjbClient {

    public void test()
            throws Exception {
        //获取WebLogic中JNDI服务的Context
        Context ctx = getInitialContext();
        HelloCrazyit bmt = (HelloCrazyit) ctx.lookup("HelloCrazyit#org.crazyit.service.HelloCrazyit");
        System.out.println(bmt.hello("yeeku"));
        bmt.crazyit();
        bmt.exclude();
    }

    //工具方法,用来获取WebLogic中JNDI服务的Context

    private Context getInitialContext() {
        // 参见(4)
    }

    public static void main(String[] args) throws Exception {
        EjbClient client = new EjbClient();
        client.test();
    }
}
原文地址:https://www.cnblogs.com/thlzhf/p/4249375.html