zoukankan      html  css  js  c++  java
  • 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常用的五种通知类型是什么

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

  • 相关阅读:
    poj 1860 Currency Exchange(最短路径的应用)
    poj 2965 The Pilots Brothers' refrigerator
    zoj 1827 the game of 31 (有限制的博弈论)
    poj 3295 Tautology (构造法)
    poj 1753 Flip Game(枚举)
    poj 2109 (贪心)
    poj 1328(贪心)
    Qt 对单个控件美化
    Qt 4基础
    Bash Shell
  • 原文地址:https://www.cnblogs.com/yanpingping/p/10901837.html
Copyright © 2011-2022 走看看