目录

  • 1 2023广东省精品课程评审申报章节
    • 1.1 申报书
    • 1.2 总结报告
    • 1.3 课程数据信息表
    • 1.4 自评报告
    • 1.5 专家组评语
    • 1.6 相关佐证
  • 2 2020校精品课程评审申报章节
    • 2.1 验收材料总文档
    • 2.2 精品开放课程申报书
    • 2.3 精品开放课程结题验收报告书
    • 2.4 精品开放课程结题验收总结报告
    • 2.5 精品开放课程结题验收项目汇总表
    • 2.6 佐证1.课程基础与建设目标
      • 2.6.1 校本教材
      • 2.6.2 论文
    • 2.7 佐证2.课程设计
      • 2.7.1 课程定位
      • 2.7.2 建设方式
    • 2.8 佐证3.更新与共享
      • 2.8.1 吸引力
      • 2.8.2 内容更新
      • 2.8.3 媒体应用
    • 2.9 佐证4.教学团队
      • 2.9.1 负责人
      • 2.9.2 教学队伍
    • 2.10 佐证5.教学资源
      • 2.10.1 基本资源
        • 2.10.1.1 单元设计
        • 2.10.1.2 课件PPT
        • 2.10.1.3 授课视频
      • 2.10.2 拓展资源
      • 2.10.3 资源创新
    • 2.11 佐证6.课程特色
      • 2.11.1 内容
      • 2.11.2 教学组织
      • 2.11.3 教学模式
    • 2.12 佐证7.目标实现
      • 2.12.1 考评
      • 2.12.2 能学
      • 2.12.3 辅教
  • 3 第一章 Spring 简介
    • 3.1 思政教育
    • 3.2 Sring 概述
    • 3.3 Spring 优点
    • 3.4 Spring 框架结构
    • 3.5 Spring 框架特征
    • 3.6 Spring 入门程序
    • 3.7 Spring 依赖注入
    • 3.8 本章小结
    • 3.9 习题1
  • 4 第二章 Spring中bean的配置和实例化
    • 4.1 思政教育
    • 4.2 Spring中bean的配置
    • 4.3 Bean的实例化
    • 4.4 bean的作用域
    • 4.5 Bean的生命周期
    • 4.6 Bean的装配方式
    • 4.7 应用案例:Annotation注解
    • 4.8 本章小结
    • 4.9 习题2
  • 5 第三章  Spring面向切面编程AOP
    • 5.1 Spring  AOP的基本概念
    • 5.2 通知类型介绍
    • 5.3 JDK动态代理
    • 5.4 Spring AOP
    • 5.5 应用案例:AspectJ开发
    • 5.6 本章小结
    • 5.7 习题3
  • 6 第四章  Mybatis原理
    • 6.1 基本内容
    • 6.2 JDBC的问题
    • 6.3 Hibernate的问题
    • 6.4 MyBatis优势
    • 6.5 MyBatis的工作原理
    • 6.6 MyBatis的数据库准备_MySQL
    • 6.7 应用案例:MyBatis入门程序
    • 6.8 Mybatis数据库基本操作示例
    • 6.9 习题4
  • 7 第五章  Mybatis反向工程
    • 7.1 动态SQL
    • 7.2 应用案例: Mybatis反向(逆向)工程
    • 7.3 Mybatis反向(逆向)工程代码解读
    • 7.4 习题5
  • 8 第六章  Spring、 Mybatis Mapper接口编程
    • 8.1 Mybatis反向工程生成的接口
    • 8.2 应用案例:SpringMVC、 Mybatis  Mapper接口编程
    • 8.3 习题6
  • 9 SpringMVC
    • 9.1 SpringMVC框架
    • 9.2 应用案例:SpringMVC
    • 9.3 应用案例:SpringMVC注解开发
    • 9.4 习题7
  • 10 SpringMVC数据绑定
    • 10.1 SpringMvc的数据绑定流程
    • 10.2 应用案例:SpringMVC参数绑定
    • 10.3 SpringMVC参数绑定数组和集合
    • 10.4 案例SpringMVC参数绑定数组
    • 10.5 习题8
  • 11 第九章、SpringMVC拦截器
    • 11.1 拦截器的实现
    • 11.2 拦截器的配置
    • 11.3 应用案例
    • 11.4 习题9
  • 12 第十章 文件上传
    • 12.1 文件上传原理
    • 12.2 创建工程
    • 12.3 应用案例
    • 12.4 习题10
  • 13 第十一章、课程资源管理系统
    • 13.1 系统需求
    • 13.2 开发环境
    • 13.3 数据库设计
    • 13.4 项目程序设计
  • 14 第十二章 职场沟通技能
    • 14.1 职场沟通原则与理念
  • 15 第十三章 如何与上司、同事沟通
    • 15.1 如何与上司、同事沟通
  • 16 第十四章 软件开发团队建设
    • 16.1 企业级应用开发团队组织技巧培训
JDK动态代理

3.3 JDK动态代理

相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等功能。

使用动态代理的五大步骤

1.通过实现InvocationHandler接口来自定义自己的InvocationHandler;

2.通过Proxy.getProxyClass获得动态代理类

3.通过反射机制获得代理类的构造方法,

方法为getConstructor(InvocationHandler.class) 

4.通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入

5.通过代理对象调用目标方法

JDK动态代理案例:

下载Spring 框架需要的jar

本章程序需要的jar包有如下9个:

commons-logging-1.2.jar

aopalliance-1.0.jar

aspectjweaver-1.8.10.jar

spring-aspects-4.3.6.RELEASE.jar

spring-aop-4.3.6.RELEASE.jar

spring-beans-4.3.6.RELEASE.jar

spring-context-4.3.6.RELEASE.jar

spring-core-4.3.6.RELEASE.jar

spring-expression-4.3.6.RELEASE.jar

读者可到http://commons.apache.orghttp://repo.springsource.org/libs-release-local/org/springframework/spring 网站下载,当然,本书的对应案例资源SSM4中也有对应的jar包。

相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

 

案例:JDK动态代理

步骤:

1、创建被代理的接口和类;

2创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑

3、通过Proxy的静态方法newProxyInstance( ClassLoaderloader, Class[] interfaces, InvocationHandler h)创建一个代理对象

4、使用代理对象。

其中UserDao.java代码如下:

package dao;

public interface UserDao {

public void addUser();

public void delUser();

}

UserDaoImpl.java类实现了UserDao接口,其代码如下:

package impl;

import dao.UserDao;

public class UserDaoImpl implements UserDao {

@Override

public void addUser() {

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

}

@Override

public void delUser() {

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

}

}

MyAspect.java类是要增强的新功能,这些功能希望添加到原来的旧类里面,从而使用旧类里面的方法拥有更加强大的功能,其代码如下:

package aspect;

public class MyAspect {

public void checkManager(){

System.out.println("验证管理员身份!");

}

public void log(){

System.out.println("添加操作记录到数据库!");

}

}

JdkProxy.java类是一个代理类, InvocationHandler接口的实现类,在invoke方法中实现代理逻辑,用来把新类(MyAspect.java)的功能添加到旧类(UserDaoImpl.java)的原有功能之上的类,其代码如下:

package aspect;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import dao.UserDao;

public class JdkProxy implements InvocationHandler {

UserDao userDao;

public Object createProxy(UserDao userDao){

this.userDao=userDao;

//获取当前类的类加载器实现动态加载

ClassLoader cld=JdkProxy.class.getClassLoader();

        //获取被加强的类所实现的所有接口,目的是获取这些接口中定义的各种方法

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

return Proxy.newProxyInstance(cld, classs, this);

}

@Override

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

MyAspect am=new MyAspect();

        //进行前增强

am.checkManager();

        //调用被代理对象的接口中定义的方法

method.invoke(userDao, args);

        //进行后增强

am.log();

return null;

}

}

       代码Proxy.newProxyInstance(cld, classs, this) 的第一个参数是指定代理类的类加载器(我们传入当前测试类的类加载器),第二个参数是代理类需要实现的接口(我们传入被代理类实现的接口,这样生成的代理类和被代理类就实现了相同的接口),第三个参数是invocation handler,用来处理方法的调用。这里传入我们自己实现的handler

以下是测试类,代码如下:

import aspect.JdkProxy;

import dao.UserDao;

import impl.UserDaoImpl;

public class Test {

public static void main(String[] args) {

JdkProxy jp=new JdkProxy();

UserDao ud=new UserDaoImpl();

UserDao udi=(UserDao)jp.createProxy(ud);

udi.addUser();

udi.delUser();

}

}

以下是程序运行结果,可以看出,旧类中的两个方法都实现了增强。

验证管理员身份!

删除用户!

添加操作记录到数据库!

验证管理员身份!

添加用户!

添加操作记录到数据库!