你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Spring进阶(一)自定义IOCAOP框架

2021/12/31 21:22:10

一. Spring概述

Spring概述_舞鹤白沙编码日志-CSDN博客

Spring集成web环境_舞鹤白沙编码日志-CSDN博客

Spring的事务_舞鹤白沙编码日志-CSDN博客

Spring JDBCTemplate & 声明式事务_舞鹤白沙编码日志-CSDN博客

二.Spring核心思想 IOC&AOP

AOP概述_舞鹤白沙编码日志-CSDN博客

初识IOC_舞鹤白沙编码日志-CSDN博客

三. 手写实现IOC-银行转账案例

(一)案例介绍

1. 银行转账案例界面

 

2. 银⾏转账案例表结构

 

(二)案例代码基础调用关系图

通过对上图的解析存在以下两个问题:
(1) service 层实现类在使⽤ dao 层对象时,直接在TransferServiceImpl 中通过 AccountDao accountDao = new JdbcAccountDaoImpl() 获得了 dao 层对 象,然⽽⼀个 new 关键字却将 TransferServiceImpl dao 层具体的⼀个实现类 JdbcAccountDaoImpl 耦合在了⼀起。(需要融入IOC编程思想将两个对象之间通过NEW的依赖交给第三方bean工厂)
(2) service 层代码没有进⾏事务控制,如果转账过程中出现异常,将可能导致
数据库数据错乱,后果可能会很严重,尤其在⾦融业务。(需要在service层的业务逻辑中建立事务控制,并且采用AOP切面编程思想将事务控制代码从业务逻辑代码中剥离)

(三)融入IOC及AOP核心编程思想后的调用关系

1. 融入IOC编程思想后的调用关系图

 从上图解析不难得出以下几点:

(1)把每个类的全限定类名配置在xml中。

(2)使用工厂来通过反射技术生产对象,工厂模式是解耦非常好的一种方式。

(3)创建ProxyFactory工厂用来生产TransferServiceImpl代理对象,并在生产代理对象过程中强化被代理对象的业务逻辑,从切面增加事务控制。而Servlet则通过ProxyFactory获取到增强的TransferServiceImpl被代理对象。

(4)ConnectionUtils同时被JdbcAccountDaoImpl及TransactionManager使用。

(5)需要其它类实例的类代码中只声明所需实例的接⼝类型,不出现 new 也不出现⼯⼚类的字眼,声明⼀个变量并提供 set ⽅法,在反射的时候将所需要的对象注⼊进去。

2. 在Service层实现事务控制

service 层没有添加事务控制,怎么办?没有事务就添加上事务控制,⼿动控制 JDBC
Connection 事务,但要注意将 Connection 和当前线程绑定(即保证⼀个线程只有⼀个
Connection ,这样操作才针对的是同⼀个 Connection ,进⽽控制的是同⼀个事务)

 创建ConnectionUtils工具类来解决上述问题。

3. 融入AOP核心思想后的调用关系图

(四)案例开发代码示例

1. 前端代码示例

index.html代码示例_舞鹤白沙编码日志-CSDN博客

web.xml代码示例_舞鹤白沙编码日志-CSDN博客

jquery-3.4.1.min.js代码示例_舞鹤白沙编码日志-CSDN博客

2. 工具类代码示例

JsonUtils类代码示例_舞鹤白沙编码日志-CSDN博客

DruidUtils类代码示例_舞鹤白沙编码日志-CSDN博客

ConnectionUtils类代码示例_舞鹤白沙编码日志-CSDN博客

TransactionManager类代码示例_舞鹤白沙编码日志-CSDN博客

 3. pojo实体类代码示例

pojo实体类代码示例_舞鹤白沙编码日志-CSDN博客

4. 工厂类代码示例

BeanFactory类代码示例_舞鹤白沙编码日志-CSDN博客

ProxyFactory类代码示例_舞鹤白沙编码日志-CSDN博客

5. servlet层代码示例

TransferServlet类代码示例_舞鹤白沙编码日志-CSDN博客

6. service层代码示例

service层代码示例_舞鹤白沙编码日志-CSDN博客

7. dao层代码示例

dao层代码示例_舞鹤白沙编码日志-CSDN博客

8. pom.xml

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.lagou.edu</groupId>
  <artifactId>lagou-transfer</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>lagou-transfer Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>


  <dependencies>
    <!-- 单元测试Junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!-- mysql数据库驱动包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.35</version>
    </dependency>
    <!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.21</version>
    </dependency>

    <!-- servlet -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- jackson依赖 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.6</version>
    </dependency>

    <!--dom4j依赖-->
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
    <!--xpath表达式依赖-->
    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.6</version>
    </dependency>
    <!--引入cglib依赖包-->
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.1_2</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- 配置Maven的JDK编译级别 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
          <source>11</source>
          <target>11</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <!-- tomcat7插件 -->
      <!-- 注意:目前来说,maven中央仓库还没有tomcat8的插件 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

9. 项目编码结构

四.所涉及扩展知识点-设计模式代码示例

(一)单例模式

单例模式代码示例_舞鹤白沙编码日志-CSDN博客

(二)工厂模式

简单工厂模式代码示例_舞鹤白沙编码日志-CSDN博客

工厂方法模式代码示例_舞鹤白沙编码日志-CSDN博客

(三)代理模式

静态代理代码示例_舞鹤白沙编码日志-CSDN博客

动态代理模式代码示例_舞鹤白沙编码日志-CSDN博客