目录

  • 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 企业级应用开发团队组织技巧培训
Spring AOP

3.4 Spring AOP

SpringAOP代理由SpringIOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:

1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了

2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB

AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:

1、定义普通业务组件

2、定义切入点,一个切入点可能横切多个业务组件

3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作

所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。

Spring AOP 实例

下面的代码中我们省去了UserDao.java接口和UserDaoImpl.java类,读者可以自行添加。

package aspect;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class MyAspect implements MethodInterceptor{

public void checkManager(){

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

}

public void log(){

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

}

@Override

public Object invoke(MethodInvocation arg0) throws Throwable {

checkManager();

Object obj=arg0.proceed();

log();

return obj;

}

}

MyAspect类实现了MethodInterceptor接口,这使它能够具有处理旧类和新类,使得旧类中的方法具有更强的功能,其代码中实现了invoke方法,该方法的参数就是提供要处理的旧类中的方法的对象。我们可以在该方法执行的前后进行代码增强。

在下面的配置文件中我们使用到了一个重要的类:org.springframework.aop.framework.ProxyFactoryBean,以下是该类的几个常用配置属性。

1target:代理的目标对象

2proxyInterface: 代理所需要的实现的接口,可以是多个接口,该属性还有一个别名属性interfaces.

3interceptorNames: 需要植入的目标对象的Bean列表,采用Bean的名称指定,这些Bean必须是实现了org.aopalliance.intercepr.MethodInterceptor 或者org.sorngframework.aop.Advisorbean,配置中的顺序对应调用的顺序

4singleton:返回的代理对象是否单例,默认是单例

5optimize: 当设置为true时 ,强制使用cglib代理,对于singleton的代理,我们推荐使用cglib代理,对于其他类型的代理,最好使用JDK代理,原因是cglib创建代理时速度慢,而创建出的代理对象运行效率较高,而使用JDK代理的表现正好相反。

6proxyTargertClass: 是否对类进行代理(而不是对接口进行代理)。设置为true时,使用cglib代理。

使用 ProxyFactoryBean 来创建 AOP 代理的最重要的优点之一是 IoC 可以管理通知和切入点。 这是一个非常的强大的功能,能够实现其他 AOP 框架很难实现的特定的方法。是创建AOP的最基本的方式 。

下面就是本案例的配置文件。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

<!-- 将指定类配置给Spring,让Spring创建其对象的实例 -->

<bean id="userDao" class="impl.UserDaoImpl"></bean>

<bean id="myAspect" class="aspect.MyAspect"></bean>

<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces" value="dao.UserDao"></property>

<property name="target" ref="userDao"></property>

<property name="interceptorNames" value="myAspect"></property>

<property name="proxyTargetClass" value="true"></property>

</bean>

</beans>

在上述配置文件中我们配置了ProxyFactoryBean类的四个属性,其中<property name="proxyInterfaces" value="dao.UserDao">代码说明要代理的是满足dao.UserDao接口要求的类,<property name="target" ref="userDao">代码说明要代理的旧类对象,<property name="interceptorNames" value="myAspect">代码说明要使用的含有新功能的新类对象。

测试类代码如下:

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import dao.UserDao;

import impl.UserDaoImpl;

public class Test {

public static void main(String[] args) {

ApplicationContext appc=new ClassPathXmlApplicationContext("applicationContext.xml");

UserDao ud=(UserDao)appc.getBean("userDaoProxy");

ud.delUser();

ud.addUser();

}

}

在测试类中我们并不是直接使用UserDao的子类对象,而是使用代理类。从下面的程序运行结果可以看出,旧类中的方法功能被正确的增强了。

验证管理员身份!

删除用户!

添加操作记录到数据库!

验证管理员身份!

添加用户!

添加操作记录到数据库!