Spring中基于XML的AOP配置详解

1. 准备工作

1.1 创建工程 day03_eesy_03SpringAOP

1.2 在配置文件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.itheima</groupId>
 <artifactId>day03_eesy_03springAOP</artifactId>
 <version>1.0-SNAPSHOT</version>

 <packaging>jar</packaging>

 <dependencies>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>5.2.4.RELEASE</version>
  </dependency>

  <dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
   <version>1.9.5</version>
  </dependency>
 </dependencies>
</project>

说明: aspect依赖是用来声明切入点坐标的

1.3 编写业务层代码

1.创建包 service

2.创建业务层接口IAccountService.java

/**
 * 账户的业务层接口
 */
public interface IAccountService {

 /**
  * 模拟保存账户
  */
 void saveAccount();

 /**
  * 模拟更新账户
  */
 void updateAccount(Integer i);
 /**
  * 模拟删除账户
  */
 int deleteAccount();
}

3.创建业务层实现类AccountServiceImpl.java

/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl implements IAccountService {
 public void saveAccount() {
  System.out.println("执行了保存");
 }

 public void updateAccount(Integer i) {
  System.out.println("执行力更新");
 }

 public int deleteAccount() {
  System.out.println("执行了删除");
  return 0;
 }
}

4.创建日志类

​ 该类为用于记录日志的工具类,它里面提供了公共的代码(通知)

Logger.java

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {

 /**
  * 用于打印日志,计划让其在切入点方法执行之前执行(切入点方法就是业务层方法)
  */
 public void printLog(){
  System.out.println("Logger类中的printLog方法开始记录日志了");
 }
}

2. 进行配置

创建配置文件 bean.xml

先添加包含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"
  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/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd">

 <!--配置Spring的IOC,把service对象配置进来-->
 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

 <!--Spring中基于XML的AOP配置步骤
   1.把通知Bean也交给Spring来管理
   2.使用aop:config标签表明开始AOP的配置
   3.使用aop:aspect标签表明配置切面
     id属性: 是给切面提供唯一标识
     ref属性: 是指定通知类bean的id
   4.在aop:aspect标签的内部使用对应的标签来配置通知的类型
     我们现在的示例是让Logger类的printLog方法在切入点方法执行之前执行, 所以是前置通知
     aop:before : 表示配置前置通知
       method属性: 用于指定Logger类中哪个方法是前置通知
     pointcut属性: 用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强

    切入点表达式的写法:
     关键字: execution(表达式)
     表达式:
       访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)
     标准的切入点表达式:
       public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
 -->

 <!--配置Logger类-->
 <bean id="logger" class="com.itheima.utils.Logger"></bean>

 <!--配置AOP-->
 <aop:config>
  <!--配置切面-->
  <aop:aspect id="logAdvice" ref="logger">
   <!--配置通知的类型,并且建立通知方法和接入点方法的关联-->
   <aop:before method="printLog" pointcut="execution(public void com.itheima.service.impl.AccountServiceImpl.saveAccount())"></aop:before>
  </aop:aspect>
 </aop:config>

</beans>

说明: 切入点表达式最好按软件的提示写,自己直接手写在测试时容易报错

3. 创建测试类AOPTest.java

/**
 * 测试AOP的配置
 */
public class AOPTest {
 public static void main(String[] args) {
  //1.获取容器
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
  //2.获取对象
  IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
  accountService.saveAccount();
 }
}

4. 运行结果

5. 目录结构

6. 切入点表达式写法补充

6.1 介绍

<!-- 切入点表达式的写法:
     关键字: execution(表达式)
     表达式:
       访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)
     标准的切入点表达式:
       public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
     访问修饰符可以省略:
       void com.itheima.service.impl.AccountServiceImpl.saveAccount()
     返回值可以使用通配符,表示任意返回值
       * com.itheima.service.impl.AccountServiceImpl.saveAccount()
     包名可以使用通配符,表示任意包,但是又几级包,就需要写几个 *.
       * *.*.*.*.AccountServiceImpl.saveAccount()
     包名可以使用..表示当前包及其子包
       * *..AccountServiceImpl.saveAccount()
     类名和方法名都可以使用*来实现通配
       * *..*.*()
     参数列表:
       可以直接写数据类型:
        基本类型直接写名称    int
        引用类型写包名.类名的方式 java.lang.String
       可以使用通配符表示任意类型,但是必须有参数
       可以是使用..表示有无参数均可,有参数可以是任意类型
     全通配写法:
       * *..*.*(..)

     实际开发中切入点表达式的通常写法:
       切到业务层实现类下的所有的方法
        * com.itheima.service.impl.*.*(..)
-->

6.2 在bean.xml中表示

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd">

 <!--配置Spring的IOC,把service对象配置进来-->
 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

 <!--Spring中基于XML的AOP配置步骤
   1.把通知Bean也交给Spring来管理
   2.使用aop:config标签表明开始AOP的配置
   3.使用aop:aspect标签表明配置切面
     id属性: 是给切面提供唯一标识
     ref属性: 是指定通知类bean的id
   4.在aop:aspect标签的内部使用对应的标签来配置通知的类型
     我们现在的示例是让Logger类的printLog方法在切入点方法执行之前执行, 所以是前置通知
     aop:before : 表示配置前置通知
       method属性: 用于指定Logger类中哪个方法是前置通知
     pointcut属性: 用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强

    切入点表达式的写法:
     关键字: execution(表达式)
     表达式:
       访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)
     标准的切入点表达式:
       public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
     访问修饰符可以省略:
       void com.itheima.service.impl.AccountServiceImpl.saveAccount()
     返回值可以使用通配符,表示任意返回值
       * com.itheima.service.impl.AccountServiceImpl.saveAccount()
     包名可以使用通配符,表示任意包,但是又几级包,就需要写几个 *.
       * *.*.*.*.AccountServiceImpl.saveAccount()
     包名可以使用..表示当前包及其子包
       * *..AccountServiceImpl.saveAccount()
     类名和方法名都可以使用*来实现通配
       * *..*.*()
     参数列表:
       可以直接写数据类型:
        基本类型直接写名称    int
        引用类型写包名.类名的方式 java.lang.String
       可以使用通配符表示任意类型,但是必须有参数
       可以是使用..表示有无参数均可,有参数可以是任意类型
     全通配写法:
       * *..*.*(..)

     实际开发中切入点表达式的通常写法:
       切到业务层实现类下的所有的方法
        * com.itheima.service.impl.*.*(..)

 -->

 <!--配置Logger类-->
 <bean id="logger" class="com.itheima.utils.Logger"></bean>

 <!--配置AOP-->
  <aop:config>
  <!--配置切面-->
  <aop:aspect id="logAdvice" ref="logger">
   <!--配置通知的类型,并且建立通知方法和接入点方法的关联-->
   <aop:before method="printLog" pointcut="execution(* com.itheima.service.impl.*.*(..))"></aop:before>
  </aop:aspect>
 </aop:config>

</beans>

6.3 在测试类AOPTest.java中测试

/**
 * 测试AOP的配置
 */
public class AOPTest {
 public static void main(String[] args) {
  //1.获取容器
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
  //2.获取对象
  IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
  accountService.saveAccount();
  accountService.updateAccount(1);
  accountService.deleteAccount();
 }
}

6.4 运行结果

7. 四种通知类型补充

7.1 在Logger.java类中添加方法

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {

 /**
  * 前置通知
  */
 public void beforePrintLog(){
  System.out.println("前置通知:Logger类中的printLog方法开始记录日志了");
 }

 /**
  * 后置通知
  */
 public void afterReturningPrintLog(){
  System.out.println("后置通知:Logger类中的printLog方法开始记录日志了");
 }
 /**
  * 异常通知
  */
 public void afterThrowingPrintLog(){
  System.out.println("异常通知:Logger类中的printLog方法开始记录日志了");
 }
 /**
  * 最终通知
  */
 public void afterPrintLog(){
  System.out.println("最终通知:Logger类中的printLog方法开始记录日志了");
 }
}

7.2 在bean.xml中进行配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd">

 <!--配置Spring的IOC,把service对象配置进来-->
 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

 <!--配置Logger类-->
 <bean id="logger" class="com.itheima.utils.Logger"></bean>

 <!--配置AOP-->
 <aop:config>
  <!--配置切面-->
  <aop:aspect id="logAdvice" ref="logger">
   <!--配置前置通知: 在切入点方法执行之前执行-->
   <aop:before method="beforePrintLog" pointcut="execution(public void com.itheima.service.impl.AccountServiceImpl.saveAccount())"></aop:before>

   <!--配置后通知: 在切入点方法正常执行之后执行; 他和异常通知只能执行一个-->
   <aop:after-returning method="afterReturningPrintLog" pointcut="execution(public void com.itheima.service.impl.AccountServiceImpl.saveAccount())"></aop:after-returning>

   <!--配置异常通知: 在切入点方法执行产生异常之后执行; 他和后置通知只能执行一个-->
   <aop:after-throwing method="afterThrowingPrintLog" pointcut="execution(public void com.itheima.service.impl.AccountServiceImpl.saveAccount())"></aop:after-throwing>

   <!--配置最终通知: 无论切入点方法是否正常执行他都会在其后面执行-->
   <aop:after method="afterPrintLog" pointcut="execution(public void com.itheima.service.impl.AccountServiceImpl.saveAccount())"></aop:after>
  </aop:aspect>
 </aop:config>

</beans>

7.3 在测试类AOPTest.java中运行

/**
 * 测试AOP的配置
 */
public class AOPTest {
 public static void main(String[] args) {
  //1.获取容器
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
  //2.获取对象
  IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
  accountService.saveAccount();

 }
}

7.4 运行结果

8. 通用化切入点表达式

用于解决在bean.xml文件中配置通知时多次写切入点表达式的问题

使用 aop:pointcut标签,在bean.xml中进行配置

8.1 在aop:aspect标签内部使用aop:pointcut

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd">

 <!--配置Spring的IOC,把service对象配置进来-->
 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

 <!--配置Logger类-->
 <bean id="logger" class="com.itheima.utils.Logger"></bean>

 <!--配置AOP-->
 <aop:config>
  <!--配置切面-->
  <aop:aspect id="logAdvice" ref="logger">
   <!--配置前置通知: 在切入点方法执行之前执行-->
   <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>

   <!--配置后通知: 在切入点方法正常执行之后执行; 他和异常通知只能执行一个-->
   <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>

   <!--配置异常通知: 在切入点方法执行产生异常之后执行; 他和后置通知只能执行一个-->
   <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>

   <!--配置最终通知: 无论切入点方法是否正常执行他都会在其后面执行-->
   <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>

   <!--配置切入点表达式 id属性用于指定表达式的唯一标识, expression属性用于指定表达式的内容
     此标签写在app:aspect标签内部,只能当前切面使用。
     它还可以写在aop:aspect外面, 此时就变成了所有切面可用
   -->
   <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.AccountServiceImpl.*(..))"></aop:pointcut>
  </aop:aspect>
 </aop:config>

</beans>

运行结果:

此时,aop:pointcut定义的切入点表达式只能在当前切面中使用

8.2 在aop:aspect标签外部使用aop:pointcut

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd">

 <!--配置Spring的IOC,把service对象配置进来-->
 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

 <!--配置Logger类-->
 <bean id="logger" class="com.itheima.utils.Logger"></bean>

 <!--配置AOP-->
 <aop:config>

  <!--配置切入点表达式 id属性用于指定表达式的唯一标识, expression属性用于指定表达式的内容
     此标签写在app:aspect标签内部,只能当前切面使用。
     它还可以写在aop:aspect外面, 此时就变成了所有切面可用
   -->
  <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.AccountServiceImpl.*(..))"></aop:pointcut>

  <!--配置切面-->
  <aop:aspect id="logAdvice" ref="logger">
   <!--配置前置通知: 在切入点方法执行之前执行-->
   <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>

   <!--配置后通知: 在切入点方法正常执行之后执行; 他和异常通知只能执行一个-->
   <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>

   <!--配置异常通知: 在切入点方法执行产生异常之后执行; 他和后置通知只能执行一个-->
   <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>

   <!--配置最终通知: 无论切入点方法是否正常执行他都会在其后面执行-->
   <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>
  </aop:aspect>
 </aop:config>

</beans>

运行结果:

此时所有的切面都能使用该aop:pointcut定义的切入点表达式

主要: 当在aop:aspect标签外部使用aop:pointcut标签定义切入点表达式的时候,由于使用的约束的规定, aop:pointcut标签只能在 aop:aspect标签上方

9. Spring的环绕通知

9.1 在Logger.java中添加实现环绕通知的方法 aroundPringLog

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {
 /**
  * 环绕通知
  *
  */
 public void aroundPringLog(){
   System.out.println("Logger类中的aroundPringLog方法开始记录日志了");
 }

}

9.2 在bean.xml中完成配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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/aop
  http://www.springframework.org/schema/aop/spring-aop.xsd">

 <!--配置Spring的IOC,把service对象配置进来-->
 <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>

 <!--配置Logger类-->
 <bean id="logger" class="com.itheima.utils.Logger"></bean>

 <!--配置AOP-->
 <aop:config>

  <aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.AccountServiceImpl.*(..))"></aop:pointcut>

  <!--配置切面-->
  <aop:aspect id="logAdvice" ref="logger">
   <!--配置环绕通知 详细的注释在Logger类中-->
   <aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around>
  </aop:aspect>
 </aop:config>

</beans>

9.3 此时运行结果

9.4 问题分析

此时只执行了通知方法,而切入点方法没有执行

原因:

​ 通过对比动态的代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而本案例中的代码没有

9.5 完善aroundPringLog方法

Logger.java

/**
 * 用于记录日志的工具类,它里面提供了公共的代码
 */
public class Logger {
 /**
  * 环绕通知
  * 问题:
  *  当我们配置了环绕通知之后,切入点方法没有执行,而通知方法执行了
  * 分析:
  *  通过对比动态的代理中的环绕通知代码,发现动态代理的环绕通知有明确的切入点方法调用,而我们的代码中没有
  * 解决:
  *  Spring框架为我们提供了一个接口,ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点方法
  *  该接口可以作为环绕通知的方法参数, 在程序执行的时候,Spring框架会为我们提供该接口供我们使用
  *
  * Spring的环绕通知:
  *  他是Spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式
  */
 public Object aroundPringLog(ProceedingJoinPoint proceedingJoinPoint){

  Object returnValue = null;
  try {

   Object[] args = proceedingJoinPoint.getArgs(); //得到方法执行所需要的参数

   System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----前置");

   returnValue = proceedingJoinPoint.proceed(args); //明确调用业务层方法,切入点方法

   System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----后置");

   return returnValue;
  }catch (Throwable throwable){
   System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----异常");
   throw new RuntimeException(throwable);
  }finally {
   System.out.println("Logger类中的aroundPringLog方法开始记录日志了-----最终");
  }
 }

}

9.6 运行结果

9.7 目录结构

到此这篇关于Spring中基于XML的AOP配置的文章就介绍到这了,更多相关Sprin AOP配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作

    在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验.我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力. 废话不多说,多数据源配置和主从数据配置原理一样 1.首先配置  jdbc.prope

  • 详解Spring Aop实例之AspectJ注解配置

    上篇<Spring Aop实例之xml配置>中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop. 依旧采用的jdk代理,接口和实现类代码请参考上篇博文.主要是将Aspect类分享一下: package com.tgb.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Aft

  • springboot配置aop切面日志打印过程解析

    这篇文章主要介绍了springboot配置aop切面日志打印过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.SpringBoot Aop说明 1. Aop AOP(Aspect-Oriented Programming,面向切面编程),它利用一种"横切"的技术,将那些多个类的共同行为封装到一个可重用的模块.便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性. 2. AOP相关概念: Aspect

  • Java的Spring框架中AOP项目的一般配置和部署教程

    0.关于AOP 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP是OOP的延续. 主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等. 主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过

  • 详解Spring Aop实例之xml配置

    AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; public interface UserManager { public String findUserById(int userId); } package com.tgb.aop; public class UserManagerImpl implements UserManager { publ

  • spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Before, @AfterReturning,@After,@AfterThrowing,@Around). 2. 开发需要被拦截的类. 3. 将切面配置到xml中,当然,我们也可以使用自动扫描Bean的方式.这样的话,那就交由Spring AoP容器管理. 另外需要引用 aspectJ 的 jar 包:

  • spring中aop的xml配置方法实例详解

    前言 AOP:即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等. aop,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征的时候诗人可以去欢送,当骑士英勇牺牲的时候,诗人可以写诗歌颂骑士的一生.那么骑士只需要关注怎么打仗就好了.而诗人也只需要关注写诗歌颂和欢送就好了,那么这样就把功能分离了.所以可以把诗

  • Spring中基于XML的AOP配置详解

    1. 准备工作 1.1 创建工程 day03_eesy_03SpringAOP 1.2 在配置文件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"

  • Spring中基于xml的AOP的详细步骤

    1.Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术.Aop是oop的延续,是软件开发中的 一个热点,也是Spring框架中一个重要的内容.是函数式编程的一个衍生范例,利用Aop可以对业务逻辑各个部分进行分割,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用行,提高了开发效率.简单的说就是把我们程序中的重复代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上已有的方法进

  • 在Spring中基于Java类进行配置的完整步骤

    前言 JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 . 本文将详细介绍关于Spring中基于Java类进行配置的相关内容,下面话不多说了,来一起看看详细的介绍吧 1 定义 Bean 普通的 POJO 只要标注了 @Configuration 注解,就可以为 Spring 容器提供 Bean 的定义信息. @Configuration pub

  • Spring中Bean的命名方式代码详解

    本文主要描述的是关于spring中bean的命名方式,通过简单实例向大家介绍了六种方式,具体如下. 一般情况下,在配置一个Bean时需要为其指定一个id属性作为bean的名称.id在IoC容器中必须是唯一的,此外id的命名需要满足xml对id的命名规范. 在实际情况中,id命名约束并不会给我们带来影响.但是如果用户确实希望用到一些特殊字符来对bean进行命名,那么可以使用bean的name属性来进行命名,name属性没有字符上的限制,几乎可以使用任何字符. 每个Bean可以有一个或多个id,我们

  • 基于Android FileProvider 属性配置详解及FileProvider多节点问题

    众所周知在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.0+的机型需要这样写: 1:代码适配 if (Build.VERSION.SDK_INT > 23) {// intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(context, SysInfo.packageN

  • Spring中的AutowireCandidateResolver的具体使用详解

    接口定义 用于推断一个特定的beanDefinition是否能作为指定依赖的候选者的策略接口 public interface AutowireCandidateResolver { // 默认情况下直接根据bd中的定义返回,如果没有进行特殊配置的话为true default boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) { return bdHolder.g

  • Spring中@Async注解实现异步调详解

    异步调用 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继续执行下面的流程.例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法:如他们都是同步调用,则需要将他们都顺序执行完毕之后,过程才执行完毕: 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了. 概述说明 Sp

  • Spring实现文件上传的配置详解

    添加依赖 主要用来解析request请求流,获取文件字段名.上传文件名.content-type.headers等内容组装成FileItem <!--添加fileupload依赖--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</versio

  • SpringBoot整合Web之AOP配置详解

    目录 配置AOP AOP简介 Spring Boot 支持 其它 自定义欢迎页 自定义 favicon 除去某个自动配置 配置AOP AOP简介 要介绍面向切面变成(Aspect-Oriented Programming,AOP),需要先考虑一个这样的场景:公司有一个人力资源管理系统目前已经上线,但是系统运行不稳定,有时运行的很慢,为了检测到底是哪个环节出现问题了,开发人员想要监控每一个方法执行的时间,再根据这些执行时间判断出问题所在.当问题解决后,再把这些监控移除掉.系统目前已经运行,如果手动

  • SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

    1.导入jar包: <!--jmsTemplate--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</g

随机推荐