• spring总结————AOP面向切面总结


    spring总结————AOP面向切面

    一、spring aop概念

    spring aop面向切面编程,java是面向对象的语言。

    真正的service层代码

    业务逻辑层再处理业务之前和之后都要进行一些参数的校验,异常处理,日志记录等代码。有非常多非常核心的业务逻辑在里面,这些业务逻辑不要是不行的。怎么解决这种问题?生活中有很多这样的例子,实际上就是使用了代理模式来解决这个问题。spring aop 就是基于代理模式的。代理分静态代理和动态代理,spring aop的核心就是通过动态代理来实现的。

    二、使用bean的方式配置spring的aop

    先创建项目,把项目运行起来

    第一步,创建spring项目  引入jar包

    第二步,创建主配置文件

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <beans xmlns="http://www.springframework.org/schema/beans"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 xmlns:context="http://www.springframework.org/schema/context"
    5 xsi:schemaLocation="http://www.springframework.org/schema/beans
    6 http://www.springframework.org/schema/beans/spring-beans.xsd
    7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd">
    8 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
    9 </beans>

    第三步,创建包实体类

    注:service层只保留核心的业务逻辑代码:

     1 package com.aaa.spring.service.impl;
     2 import com.aaa.spring.entity.Userimport com.aaa.spring.service.UserService/**
     3 * 用户管理service实现类
     4 */
     5 public class UserServiceImpl implements UserService {
     6 @Override
     7 public void saveUser(User user) {
     8 System.out.println("保存用户");
     9 }
    10 @Override
    11 public void deleteUser(User user) {
    12 System.out.println("删除用户");
    13 }
    14 @Overridepublic void updateUser(User user) {
    15 System.out.println("修改用户");
    16 }
    17 @Override
    18 public User findById(Long id) {
    19 System.out.println("根据id查找用户");
    20 return null;
    21 }
    22 }

    第四步,在spring的主配置文件中配置bean

    1 <?xml version="1.0" encoding="UTF-8"?>
    2 <beans xmlns="http://www.springframework.org/schema/beans"
    3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4 xmlns:context="http://www.springframework.org/schema/context"
    5 xsi:schemaLocation="http://www.springframework.org/schema/beans
    6 http://www.springframework.org/schema/beans/spring-beans.xsd
    7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd">
    8 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
    9 </beans>

     第五步,测试

     1 package com.aaa.spring;
     2 import com.aaa.spring.entity.User;
     3 import com.aaa.spring.service.UserService;
     4 import javafx.application.Application;
     5 import org.springframework.context.ApplicationContext;
     6 import org.springframework.context.support.ClassPathXmlApplicationContext;
     7 /**
     8 * 获取对象
     9 */
    10 public class Test01 {
    11 public static void main(String[] args) {
    12 //创建spring的工厂类对象
    13 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    14 //从工厂中获取对象
    15 UserService userService = context.getBean(UserService.class);
    16 userService.saveUser(new User());
    17 userService.deleteUser(new User());
    18 userService.updateUser(new User());
    19 userService.findById(10L);
    20 }
    21 }

     三、实现aop

    一、导入jar包

    二、声明日志处理类的代码 ,在spring aop中,管这种代码叫通知 

     1 package com.aaa.spring.advice;
     2 import org.aspectj.lang.JoinPoint;
     3 import java.util.Date;
     4 /**
     5 * 日志记录的代码
     6 */
     7 public class LogAdvice {
     8 /**
     9 * 日志记录的代码,通过JoinPoint对象可以获取方法调用的一些参数
    10 * @param jp
    11 */
    12 public void log(JoinPoint jp){
    13 //获取调用方法的名称
    14 String methodName = jp.getSignature().getName();
    15 System.out.println(new Date()+"调用了"+methodName);
    16 }
    17 }

    三、配置AOP

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4 xmlns:context="http://www.springframework.org/schema/context"
     5 xmlns:aop="http://www.springframework.org/schema/aop"
     6 xsi:schemaLocation="http://www.springframework.org/schema/beans
     7 http://www.springframework.org/schema/beans/spring-beans.xsd
     8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/springcontext.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/springaop.xsd">
     9 <bean id="userService" class="com.aaa.spring.service.impl.UserServiceImpl"></bean>
    10 <!--声明通知类的对象,盖了一个传达室-->
    11 <bean id="logAdvice" class="com.aaa.spring.advice.LogAdvice"></bean>
    12 <!--
    13 实现aop 相当于实现在有同学进入学校的时候检查是否穿了拖鞋
    14 -->
    15 <aop:config>
    16 <!---声明切入点表达式 expression是什么要拦截哪些类的哪些方法
    17 切入点表达式语法
    18 举例1:如果要拦截所有com.aaa.spring.service.impl包下的UserServiceImpl类的所有以User结尾的方法
    19 execution(* com.aaa.spring.service.imp.UserServiceImpl.*User(..))
    20 举例2:如果要拦截所有类的以User结尾的方法
    21 execution(* *User(..))
    22 举例2:要拦截所有com.aaa.spring包或者子包下所有的以User结尾的方法
    23 execution(* com.aaa.spring..*.*User(..))
    24 -->
    25 <aop:pointcut id="p1" expression="execution(void *User(..)) "></aop:pointcut>
    26 <!---声明切面,完成日志记录的功能-->
    27 <aop:aspect ref="logAdvice">
    28 <!--声明后置通知,在所有拦截的方法执行完之后执行-->
    29 <!---拦截到目标方法之后要调用通知类的哪个方法-->
    30 <aop:after-returning method="log" pointcut-ref="p1"></aop:after-returning>
    31 </aop:aspect>
    32 </aop:config>
    33 </beans>

    bean配置aop

    四、测试

    四、aop常用的五种通知类型

    通知类型  

    说明  

    注解配置(aop:aspectj-autoproxy)

    aop:before前置通知  

    在目标方法调用之前执行

    @Before("exception(void *(..))")

    aop:after-returning后置通知

    在目标方法调用之后执行,一旦目标方法产生异常,不会执行

    @AfterReturning("execution(*(..))")

    aop:after最终通知

    在目标方法调用之后执行,无论目标是否产生异常,都会被执行

     

    aop:after-throwing异常通知

    在目标方法产生异常的时候执行

    @AfterThrowing(pointcut="excution(void *(..))",throwing="e")

    aop:arround 环绕通知

    在目标方法执行之前和 之后都写一写非核心的业务逻辑,一般可以用来替代前置通知和后置通知

    aop:around,method,pointcut-ref

    总结:aop面向切面编程,aop接口业务逻辑中横向代码重复的问题

    aop用bean的方式配置aop通知五种类型

    使用注解配置aop

    面试题:

    aop底层使用了什么设计模式

    使用了动态代理模式 springaop支持jdk动态代理和cglib动态代理

    spring aop常用的五种通知类型是什么

    前置通知,后置通知,环绕通知,异常通知,最终通知

  • 相关阅读:
    sql server 中拥有相同字段值的记录某个字段合并问题解答
    一个SQL语句实例
    Sql server 2005中output用法解析
    SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)转载
    .NET/C#中对对象集合进行查询的方法 以及相关的 Predicate<T> 及 Action<T> 的用法
    SQLServer Case具有两种格式:简单Case函数和Case搜索函数
    sql server compute by 子句用法实例
    vs2008 一件悲剧的事情
    SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)
    SQL Server2005中四种排名函数的使用
  • 原文地址:https://www.cnblogs.com/yanpingping/p/10901837.html
Copyright © 2020-2023  润新知