动态代理:JDK动态代理只能对实现了接口的类进入代理,采用JDK动态代理必须实现InvocationHandler接口,采用Proxy 类创建相应的代理类.
下面使用Model2(MVC)使用代理事务查询用户基本信息,使用DB2数据库:
建立表: create table T_USER ( USER_ID VARCHAR(10) not null, USER_NAME VARCHAR(30) not null, PASSWORD VARCHAR(20) not null, CONTACT_TEL VARCHAR(30), EMAIL VARCHAR(30), CREATE_DATE DATE, constraint P_KEY_1 primary key (USER_ID) ); 初始化数据: insert into t_user(user_id, user_name, password) values('root', '系统管理员', 'root');
ConnectionManager :数据库连接管理类,实现对数据库连接和事务的管理.
package gd.hz.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { private ConnectionManager() { } private static ThreadLocal<Connection> threadConn = new ThreadLocal<Connection>(); // 获取数据库连接 public static Connection getConnection() { Connection conn = threadConn.get(); if (conn == null) { try { Class.forName("com.ibm.db2.jcc.DB2Driver"); conn = DriverManager.getConnection( "jdbc:db2://127.0.0.1:50000/DRP", "db2admin", "619100"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } threadConn.set(conn); } return conn; } // 设置事务手动提交 public static void benigTransction(Connection conn) { try { if (conn != null) { if (conn.getAutoCommit()) { conn.setAutoCommit(false); } } } catch (SQLException e) { e.printStackTrace(); } } // 提交事务 public static void endTransction(Connection conn) { try { if (conn != null) { if (!conn.getAutoCommit()) { conn.commit(); } } } catch (SQLException e) { e.printStackTrace(); } } // 设置Connection的原始状态 public static void recoverTransction(Connection conn) { try { if (conn != null) { if (conn.getAutoCommit()) { conn.setAutoCommit(false); } else { conn.setAutoCommit(true); } } } catch (SQLException e) { e.printStackTrace(); } } // 发生异常回滚事务 public static void rollback(Connection conn) { try { if (conn != null) { conn.rollback(); } } catch (SQLException e) { e.printStackTrace(); } } // 关闭连接,并将其从当前线程删除 public static void close() { Connection conn = threadConn.get(); if (conn != null) { try { conn.close(); conn = null; threadConn.remove(); } catch (SQLException e) { e.printStackTrace(); } } } }
Model:
package gd.hz.model; import java.util.Date; //用户实体类 public class User { // 用户ID private String id; // 用户名称 private String name; // 登陆密码 private String password; // 联系电话 private String contact_tel; // 电子邮件 private String email; // 用户创建日期 private Date create_date; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getContact_tel() { return contact_tel == null ? "" : contact_tel; } public void setContact_tel(String contact_tel) { this.contact_tel = contact_tel; } public String getEmail() { return email == null ? "" : email; } public void setEmail(String email) { this.email = email; } public Date getCreate_date() { return create_date; } public void setCreate_date(Date create_date) { this.create_date = create_date; } }
DAO接口:
package gd.hz.dao; import gd.hz.model.User; import java.sql.SQLException; public interface UserDAO { public User selUser(String id) throws SQLException; }
DAO实现类:
package gd.hz.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import gd.hz.model.User; import gd.hz.util.ConnectionManager; public class UserDAOImpl implements UserDAO { // 根据ID查询用户 public User selUser(String id) throws SQLException { ResultSet resu = null; String sql = "SELECT * FROM DB2ADMIN.T_USER WHERE USER_ID = ?"; Connection conn = ConnectionManager.getConnection(); PreparedStatement pstat = conn.prepareStatement(sql); User user = null; try { pstat.setString(1, id); resu = pstat.executeQuery(); if (resu.next()) { user = getUser(resu); } } finally { if (resu != null) { resu.close(); } if (pstat != null) { pstat.close(); } } return user; } // 获取用户 private User getUser(ResultSet resu) throws SQLException { User user = new User(); user.setId(resu.getString("USER_ID")); user.setName(resu.getString("USER_NAME")); user.setPassword(resu.getString("PASSWORD")); user.setContact_tel(resu.getString("CONTACT_TEL")); user.setEmail(resu.getString("EMAIL")); user.setCreate_date(resu.getTimestamp("CREATE_DATE")); return user; } }
Manager接口:
package gd.hz.manager; import gd.hz.model.User; public interface UserManager { public User findUser(String id) throws Exception; }
Manager实现类:
package gd.hz.manager; import java.sql.SQLException; import gd.hz.dao.UserDAO; import gd.hz.dao.UserDAOImpl; import gd.hz.model.User; public class UserManagerImpl implements UserManager { private UserDAO userDAO = null; public UserManagerImpl() { userDAO = new UserDAOImpl(); } public User findUser(String id) throws SQLException { return userDAO.selUser(id); } }
创建代理类:
package gd.hz.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; //Manager代理类 public class TransctionProxy implements InvocationHandler { private Object obj = null; // obj:需要代理的类 public Object newProxyInstance(Object obj) { this.obj = obj; return Proxy.newProxyInstance(this.obj.getClass().getClassLoader(), this.obj.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 用于接收参数 Object param = null; // 如果是以下方法开头,则代理事务 if (method.getName().startsWith("add") || method.getName().startsWith("modify") || method.getName().startsWith("find") || method.getName().startsWith("del")) { Connection conn = ConnectionManager.getConnection(); try { // 手动提交事务 ConnectionManager.benigTransction(conn); param = method.invoke(obj, args); // 提交事务 ConnectionManager.endTransction(conn); } catch (Exception e) { // 回滚事务 ConnectionManager.rollback(conn); if (e instanceof InvocationTargetException) { InvocationTargetException inv = (InvocationTargetException) e; throw inv.getTargetException(); } else { throw new Exception("操作失败!"); } } finally { // 还原状态 ConnectionManager.recoverTransction(conn); ConnectionManager.close(); } } return param; } }
测试:
package gd.hz.util; import gd.hz.manager.UserManager; import gd.hz.manager.UserManagerImpl; import gd.hz.model.User; public class Test { public static void main(String[] args) throws Exception { TransctionProxy transctionProxy = new TransctionProxy(); // //产生代理对象 UserManager userManager = (UserManager) transctionProxy .newProxyInstance(new UserManagerImpl()); User user = userManager.findUser("root"); System.out.println("用户名:" + user.getName()); } }
相关推荐
在Java中,代理模式常用于动态代理,允许在运行时为对象绑定额外的行为,如AOP(面向切面编程)中的事务管理。 然后,我们转向ThreadLocal。ThreadLocal是Java中的一个线程局部变量,它为每个线程都提供了一个独立...
在Spring框架中,面试常涉及的关键知识点包括Spring的IoC(控制反转)、依赖注入、Bean的生命周期、AOP(面向切面编程)、事务管理、设计模式以及特定的类和注解如`@Service`、`@Repository`和`ThreadLocal`的使用。...
在Java面试中,涵盖的知识点广泛且深入,包括但不限于JDBC最佳实践、方法重载的注意事项、线程安全、面向对象编程(OOP)的基本概念、设计模式的应用以及依赖注入等核心主题。以下是对这些关键知识点的详细阐述: 1...
以下是根据提供的文件信息,从Java JDBC最佳实践、方法重载、线程安全、面向对象设计原则、设计模式等多个方面进行的详细解释: 1. **JDBC最佳实践**: - **批量操作**:使用批处理API来提高数据插入和更新的效率...
- 适配器模式、装饰器模式、代理模式、建造者模式等常见设计模式的应用。 6. **JVM优化**: - 类加载机制:双亲委派模型、类加载器。 - 内存模型:堆内存、栈内存、方法区、本地方法栈、程序计数器。 - 垃圾...
代理模式是指一个对象不能直接访问另一个对象时,提供一个代理对象来间接访问的设计模式。代理模式分为静态代理和动态代理。动态代理需要jdk代理和cglib代理,jdk代理需要类加载器、接口、handler,cglib需要继承被...
- 动态代理:了解JDK动态代理和CGLIB动态代理的实现方式。 5. **设计模式** - 常见的设计模式,如单例、工厂、观察者、装饰器、适配器等的实现和应用。 6. **JVM** - 虚拟机内存结构:堆内存、栈内存、方法区的...
- **线程变量管理器的实现**:实现了一个线程局部变量管理器,用于管理线程内的变量。 - **事务**: - **为什么需要事务**:为了保证数据操作的原子性、一致性、隔离性和持久性。 - **什么是事务**:一组操作要么...
- MyBatis:ORM框架,动态SQL,事务管理。 - Redis:内存数据库的使用,缓存策略,数据结构。 10. **数据库** - SQL:查询、插入、更新、删除,索引,事务,存储过程。 - 数据库设计:范式理论,关系数据库设计...
根据给定文件的信息,我们可以将知识...以上知识点涵盖了Java高级面试题的多个方面,包括基本概念、设计模式、框架应用以及分布式系统的设计与实现。对于准备面试的开发者来说,深入理解并掌握这些知识点是非常重要的。
- 动态代理:理解JDK动态代理和CGLIB动态代理的实现原理。 6. **设计模式**: - 常见设计模式:单例、工厂、观察者、装饰器、适配器等23种设计模式的理解和应用。 7. **Spring框架**: - IoC(控制反转)和DI...
《Java面试葵花宝典》是一本专门为Java开发者准备的面试和笔试指南,它涵盖了大量Java编程、设计模式、数据结构、算法、框架以及系统架构等核心知识点。这本书旨在帮助Java程序员在求职过程中更好地理解和应对各种...
- 常见设计模式:单例、工厂、建造者、适配器、装饰器、观察者、代理等模式的原理和应用场景。 - 设计模式组合:如何根据需求灵活组合设计模式,优化代码结构。 7. **JVM优化**: - 类加载机制:双亲委托模型,...
- **声明式事务管理**:通过XML配置或注解实现事务管理。 - **Spring常用设计模式**: - 单例模式:确保Bean的实例唯一性。 - 工厂模式:通过BeanFactory或ApplicationContext创建对象。 - 代理模式:AOP(面向...
- 常见的设计模式:单例、工厂、装饰器、代理、观察者、适配器等,并能结合实际问题进行应用。 9. **JVM**: - 类加载机制:加载、验证、准备、解析和初始化五个阶段。 - 类加载器:Bootstrap ClassLoader、...
- 面试官询问了熟悉的设计模式,提到了单例、工厂、装饰者、代理、建造者、模板方法和策略模式。这些模式是软件设计中的重要工具,有助于提高代码可读性和可维护性。 11. **HTTP方法**: - GET和POST是HTTP协议中...
- 介绍单例设计模式并给出线程安全的实现方式。 - 解释工厂方法模式和抽象工厂模式的应用场景。 3. **多线程与并发** - 什么是线程安全?举例说明。 - 解释synchronized关键字的作用和用法。 - 说明volatile...
这些知识点涵盖了多线程、Spring框架、Spring Cloud、JVM优化、Redis缓存、消息队列(MQ)、Kafka、Dubbo、算法、设计模式以及分布式系统等多个领域。下面,我们将详细讨论这些领域的核心概念和重要知识点。 1. **...
- **依赖注入(IOC)**: 一种设计模式,用于解耦对象之间的依赖关系,使得对象可以在运行时被注入其依赖项。 - **Spring中的IOC实现**: Spring通过定义bean的依赖关系,并在运行时自动创建和装配这些bean,实现了...