万字Spring5框架初学笔记记录——AOP

1.AOP(面向切面编程)

1.1什么是AOP

面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通俗来说,AOP指不通过修改源代码方式,在主干功能里面添加新功能

1.2AOP底层原理介绍

AOP底层使用动态代理,分两种情况:
1:有接口的情况下,使用JDK动态代理,创建接口类实现对象,增强类的方法
2:没有接口情况下,使用CGLIB动态代理,创建子类的代理对象,增强类的方法
因为这个课程关于动态的一部分讲的实在一般,这里就不贴代码了。

1.3AOP相关术语介绍

1:连接点
类中可以被增强的方法被称为连接点
2:切入点
类中被增强的方法被称为切入点
3:通知(增强)
(1):实现增强功能的逻辑部分被称为通知(增强)
(2):通知的类型:
①:前置通知:在原方法之前的通知
②:后置通知:在原方法之后的通知
③:环绕通知:原方法前后都有的通知
④:异常通知:发生异常报错的通知
⑤:最终通知:类似于try——catch语句中的finally语句,一定会执行的通知
4:切面
把通知应用到切入点的过程被称为切面

1.4AOP准备工作

1.4.1:AspectJ

AspectJ是一个独立的AOP框架,并不是Spring的组成部分,不过开发人员经常把两者结合起来一起使用。
使用AspectJ需要导入与其相关的依赖包
在这里插入图片描述

1.4.1:切入点表达式

1:作用:知道对哪个类中的哪个方法进行增强
2:语法结构
execution([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]))
举例1:对dao包下的BookDao类里面的add进行增强
execution(* dao.BookDao.add(…))
①:*:任意的返回值类型
②:权限修饰符被省略了
③参数括号里的两点表示参数

举例2:对dao包下的BookDao类里面的所有的方法进行增强
execution(* dao.BookDao.*(…))

举例3:对dao包下的所有类里面的所有的方法进行增强
execution(* dao.*.*(…))

1.5AOP操作

1.5.1基于注解方式

1.5.1.1步骤

1:创建User类,并定义方法

public class User {
    public void add(){
        System.out.println("add...");
    }
}

2:创建增强类(编写增强逻辑)

   //增强的类
    @Component
    @Aspect//生成代理对象
    public class UserProxy {
        //前置通知
        //@Before表示前置注解
        @Before(value = "execution(* user.User.add(..))")
        public void before(){
            System.out.println("before...");
        }
        //环绕通知
        @Around(value = "execution(* user.User.add(..))")
        public void Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            System.out.println("环绕之前");
            //被增强的方法执行
            proceedingJoinPoint.proceed();
            System.out.println("环绕之后");
        }
        //后置通知
        @AfterReturning(value = "execution(* user.User.add(..))")
        public void AfterReturning(){
            System.out.println("AfterReturning...");
        }
       // 最终通知
        @After(value = "execution(* user.User.add(..))")
        public void after(){
            System.out.println("After...");
        }
       // 异常通知
        @AfterThrowing(value = "execution(* user.User.add(..))")
        public void AfterThrowing(){
            System.out.println("AfterThrowing...");
        }

    }

3:进行通知的配置
(1):在spring配置文件中,引入相关名称空间并开启注解扫描

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">


<!--    开启注解扫描-->
    <context:component-scan base-package="user"></context:component-scan>

(2):使用注解创建User和UserProxy类对象
在这里插入图片描述
在这里插入图片描述

(3):在增强类上添加@Aspect注解
在这里插入图片描述
(4):在spring配置文件中开启生成代理对象

<!--    开启Aspect生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4:配置不同类型的通知
(1):在增强类里面,在作为通知方法的上面添加通知类型注解,使用切入点表达式配置

//增强的类
@Component
@Aspect//生成代理对象
public class UserProxy {
    //前置通知
    //@Before表示前置注解
    @Before(value = "execution(* user.User.add(..))")
    public void before(){
        System.out.println("before...");
    }
}

1.5.1.2相同切入点的抽取


        //相同切入点的提取
        @Pointcut(value = "execution(* user.User.add(..))")
        public void point(){

        }

        //@Before表示前置
        @Before(value = "point()")
        public void before(){
            System.out.println("before...");
        }

1.5.1.3多个增强类对同一个方法进行增强,设置增强类优先级

在增强类绗棉添加注解@Order(数值),数值越小优先级越高

1.5.1.4AOP的配置类编写

在这里插入图片描述

2.JDBCTemplate

2.1什么是JDBCTemplate

Spring框架对JDBC进行封装,使用JDBCTemplate实现对数据库进行操作

2.2配置JDBCTemplate步骤

1:引入相关jar包(依赖)
2:在Spring配置文件中配置数据库连接池

  <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close">
        <property name="url" value="jdbc:mysql:///user_db" />
        <property name="username" value="root" />
        <property name="password" value="aaaaaa" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    </bean>

3:配置JDBCTemplate对象。注入DataSource

<!--jdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--        注入datasource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

4:创建service类,创建dao类,在dao注入jdbcTemplate对象

2.2通过JDBCTemplate对数据库进行管理


版权声明:本文为weixin_53716018原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。