JavaEE框架技术

彭红伟、骆丽华、李康顺、聂鹏、袁大伟、孟雨、王诗雅、张新伟、聂军、谢备

目录

  • 1 初识MyBatis框架
    • 1.1 框架概述
    • 1.2 框架的优势
    • 1.3 当前主流框架
    • 1.4 传统JDBC的劣势
    • 1.5 MyBatis概述
    • 1.6 MyBatis环境搭建
    • 1.7 MyBatis入门程序
    • 1.8 MyBatis工作原理
    • 1.9 扩展阅读
    • 1.10 章节测试
  • 2 MyBatis的核心配置
    • 2.1 SqlSessionFactoryBuilder对象
    • 2.2 SqlSessionFactory对象
    • 2.3 SqlSession对象
    • 2.4 MyBatis配置文件的主要元素
    • 2.5 <properties>元素
    • 2.6 <settings>元素
    • 2.7 <typeAliases>元素
    • 2.8 <environments>元素
    • 2.9 <mappers>元素
    • 2.10 MyBatis映射文件中的常用元素
    • 2.11 <select>元素
    • 2.12 <insert>元素
    • 2.13 <update>元素
    • 2.14 <delete>元素
    • 2.15 <sql>元素
    • 2.16 <resultMap>元素
    • 2.17 案例:员工管理系统
    • 2.18 扩展阅读
    • 2.19 章节测试
  • 3 动态SQL
    • 3.1 动态SQL中的元素
    • 3.2 <if>元素
    • 3.3 <choose>、<when>、<otherwise>元素
    • 3.4 <where>元素
    • 3.5 <trim>元素
    • 3.6 更新操作
    • 3.7 <foreach>元素中的属性
    • 3.8 <foreach>元素迭代数组
    • 3.9 <foreach>元素迭代List
    • 3.10 <foreach>元素迭代Map
    • 3.11 案例:学生信息查询系统
    • 3.12 扩展阅读
    • 3.13 章节测试
  • 4 MyBatis的关联映射和缓存机制
    • 4.1 关联映射概述
    • 4.2 一对一查询
    • 4.3 一对多查询
    • 4.4 多对多查询
    • 4.5 一级缓存
    • 4.6 二级缓存
    • 4.7 案例:商品的类别
    • 4.8 扩展阅读
    • 4.9 章节测试
  • 5 MyBatis的注解开发
    • 5.1 @Select注解
    • 5.2 @Insert注解
    • 5.3 @Update注解
    • 5.4 @Delete注解
    • 5.5 @Param注解
    • 5.6 一对一查询
    • 5.7 一对多查询
    • 5.8 多对多查询
    • 5.9 案例:基于MyBatis注解的学生 管理程序
    • 5.10 扩展阅读
    • 5.11 章节测试
  • 6 初识Spring框架
    • 6.1 Spring概述
    • 6.2 Spring框架的优点
    • 6.3 Spring的体系结构
    • 6.4 Spring 5的新特性
    • 6.5 Spring的下载及目录结构
    • 6.6 Spring的入门程序
    • 6.7 控制反转的概念
    • 6.8 依赖注入的概念
    • 6.9 依赖注入的类型—构造方法注入
    • 6.10 依赖注入的类型—属性setter方法注入
    • 6.11 依赖注入的应用
    • 6.12 扩展阅读
    • 6.13 章节测试
  • 7 Spring中的Bean的管理
    • 7.1 BeanFactory接口
    • 7.2 ApplicationContext接口
    • 7.3 Bean的配置
    • 7.4 构造方法实例化
    • 7.5 静态工厂实例化
    • 7.6 实例工厂实例化
    • 7.7 singleton作用域
    • 7.8 prototype作用域
    • 7.9 基于XML的装配
    • 7.10 基于注解的装配
    • 7.11 自动装配
    • 7.12 Bean的生命周期
    • 7.13 扩展阅读
    • 7.14 章节测试
  • 8 Spring AOP
    • 8.1 Spring AOP概述
    • 8.2 Spring AOP术语
    • 8.3 JDK动态代理
    • 8.4 CGLib动态代理
    • 8.5 基于XML的AOP实现
    • 8.6 基于注解的AOP实现
    • 8.7 扩展阅读
    • 8.8 章节测试
  • 9 Spring的数据库编程
    • 9.1 JdbcTemplate概述
    • 9.2 Spring JDBC的配置
    • 9.3 excute()方法
    • 9.4 update()方法
    • 9.5 query()方法
    • 9.6 事务管理的核心接口
    • 9.7 事务管理的方式
    • 9.8 基于XML方式的声明式事务
    • 9.9 基于注解方式的声明式事务
    • 9.10 案例:实现用户登录
    • 9.11 扩展阅读
    • 9.12 章节测试
  • 10 初识Spring MVC框架
    • 10.1 Spring MVC概述
    • 10.2 Spring MVC特点
    • 10.3 Spring MVC入门程序
    • 10.4 Spring MVC工作原理
    • 10.5 扩展阅读
    • 10.6 章节测试
  • 11 Spring MVC的核心类和注解
    • 11.1 DispatcherServlet类
    • 11.2 @Controller注解
    • 11.3 @RequestMapping注解的使用
    • 11.4 @RequestMapping注解的属性
    • 11.5 请求映射方式
    • 11.6 扩展阅读
    • 11.7 章节测试
  • 12 Spring MVC数据绑定和相应
    • 12.1 数据绑定
    • 12.2 默认类型数据绑定
    • 12.3 简单数据类型绑定
    • 12.4 POJO绑定
    • 12.5 自定义类型转换器
    • 12.6 数组绑定
    • 12.7 集合绑定
    • 12.8 复杂POJO绑定—属性为对象类型的数据绑定
    • 12.9 复杂POJO绑定—属性为List类型的数据绑定
    • 12.10 复杂POJO绑定—属性为Map类型的数据绑定
    • 12.11 JSON数据绑定
    • 12.12 返回值为void类型的页面跳转
    • 12.13 返回值为String类型的页面跳转—不携带数据
    • 12.14 返回值为String类型的页面跳转—携带数据
    • 12.15 返回值为ModelAndView类型的页面跳转
    • 12.16 普通字符串的回写
    • 12.17 JSON数据的回写—对象数据转换成JSON数据后的回写
    • 12.18 JSON数据的回写—集合数据转换成JSON数据后的回写
    • 12.19 扩展阅读
    • 12.20 章节测试
  • 13 Spring MVC的高级功能
    • 13.1 简单异常处理器
    • 13.2 自定义异常处理器
    • 13.3 异常处理注解
    • 13.4 拦截器概述
    • 13.5 拦截器的配置
    • 13.6 拦截器的执行流程—单个拦截器
    • 13.7 拦截器的执行流程—多个拦截器
    • 13.8 案例:后台系统登录验证
    • 13.9 文件上传
    • 13.10 文件下载
    • 13.11 案例:文件上传和下载
    • 13.12 扩展阅读
    • 13.13 章节测试
  • 14 SSM框架整合
    • 14.1 常用方式整合思路
    • 14.2 项目基础结构搭建
    • 14.3 Spring和MyBatis整合
    • 14.4 Spring和Spring MVC整合
    • 14.5 纯注解方式整合思路
    • 14.6 纯注解SSM框架整合
    • 14.7 扩展阅读
    • 14.8 章节测试
  • 15 云借阅图书管理系统
    • 15.1 系统概述
    • 15.2 数据库设计
    • 15.3 系统环境搭建
    • 15.4 用户登录
    • 15.5 实现登录验证
    • 15.6 注销登录
    • 15.7 新书推荐
    • 15.8 图书借阅
    • 15.9 当前借阅
    • 15.10 借阅记录
    • 15.11 访问权限控制
    • 15.12 扩展阅读
    • 15.13 章节测试
JDK动态代理

★学习目标:

1、熟悉Spring中两种动态代理方式的区别

2、掌握JDK动态代理

★思考任务:

  1、什么是JDK动态代理

★任务学习:

 ★知识要点:

JDK动态代理是通过java.lang.reflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP

接下来,通过一个案例来演示Spring 中JDK 动态代理的实现过程,具体步骤如下。

( 1 )创建一个名为chapter03 的Web 项目,导入Spring 框架所需JAR 包到项目的lib 目录中,并发布到类路径。

(2 )在src 目录下,创建一个com.itheima.jdk 包,在该包下创建接口UserDao ,并在该接口中编写添加和删除的方法。

package com.itheima.jdk;

public interface UserDao {

public void addUser();

public void deleteUser();

}

(3 )在com . itheima . jdk 包中,创建UserDao 接口的实现类UserDaolmpl ,分别实现接口中的方法,并在每个方法中添加一条输出语句。

// 目标类

@Repository("userDao")

public class UserDaoImpl implements UserDao {

public void addUser() {

//int i = 10/0;

System.out.println("添加用户");

}

public void deleteUser() {

System.out.println("删除用户");

}

}

(4 )在src 目录下,创建一个com. itheima.aspect 包,并在该包下创建切面类MyAspect ,在该类中定义一个模拟权限检查的方法和一个模拟记录日志的方法,这两个方法就表示切面中的通知。

//切面类:可以存在多个通知Advice(即增强的方法)

public class MyAspect {

public void check_Permissions(){

System.out.println("模拟检查权限...");

}

public void log(){

System.out.println("模拟记录日志...");

}

}

(5 )在com.itheima.jdk 包下,创建代理类JdkProxy ,该类需要实现InvocationHandler 接口,并编写代理方法。在代理方法中,需要通过Proxy 类实现动态代理,

/**

 * JDK代理类

 */

public class JdkProxy implements InvocationHandler{

// 声明目标类接口

private UserDao userDao;

// 创建代理方法

public  Object createProxy(UserDao userDao) {

this.userDao = userDao;

// 1.类加载器

ClassLoader classLoader = JdkProxy.class.getClassLoader();

// 2.被代理对象实现的所有接口

Class[] clazz = userDao.getClass().getInterfaces();

// 3.使用代理类,进行增强,返回的是代理后的对象

return  Proxy.newProxyInstance(classLoader,clazz,this);

}

/*

* 所有动态代理类的方法调用,都会交由invoke()方法去处理

* proxy 被代理后的对象 

* method 将要被执行的方法信息(反射) 

* args 执行方法时需要的参数

*/

@Override

public Object invoke(Object proxy, Method method, Object[] args) 

                                                                throws Throwable {

// 声明切面

MyAspect myAspect = new MyAspect();

// 前增强

myAspect.check_Permissions();

// 在目标类上调用方法,并传入参数

Object obj = method.invoke(userDao, args);

// 后增强

myAspect.log();

return obj;

}

}

 JdkProxy 类实现了InvocationHandler 接口,并实现了接口中的invoke()方法,所有动态代理类所调用的方法都会交由该方法处理。在创建的代理方法createProxy()中,使用了Proxy 类的newProxylnstance()方法来创建代理对象。newProxylnstance()方法中包含3个参数,其中第1 个参数是当前类的类加载器,第2 个参数表示的是被代理对象实现的所有接口,第3 个参数this 代表的就是代理类JdkProxy 本身。在invoke()方法中,目标类方法执行的前后,会分别执行切面类中的check_Permissions()方法和log()方法。

(6 )在com.itheima.jdk 包中,创建测试类JdkTest。在该类中的main()方法中创建代理对象和目标对象,然后从代理对象中获得对目标对象userDao 增强后的对象,最后调用该对象中的添加和删除方法。

public class JdkTest{

public static void main(String[] args) {

// 创建代理对象

JdkProxy jdkProxy = new JdkProxy();

         // 创建目标对象

UserDao userDao= new UserDaoImpl();

// 从代理对象中获取增强后的目标对象

UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);

// 执行方法

userDao1.addUser();

userDao1.deleteUser();

}

}

执行程序后,控制台的输出结果

userDao 实例中的添加用户和删除用户的方法已被成功调用,并且在调用前后分别增加了检查权限和记录日志的功能。这种实现了接口的代理方式,就是Spring 中的JDK 动态代理。