Java框架spring Boot学习笔记(十三):aop实例操作

使用aop需要在网上下载两个jar包:

  1. aopalliance.jar
  2. aspectjweaver.jar

为idea添加jar包,快捷键ctrl+shift+alt+s,打开添加jar包的对话框,将刚才下载好的jar添加进去

前置增强实例

编写TimeHandler.java

1 package com.example.spring;
2
3 public class TimeHandler {
4     public void beforTime()
5     {
6         System.out.println("前置增强:CurrentTime = " + System.currentTimeMillis());
7     }
8 }

编写HelloWorld.java

1 package com.example.spring;
2
3 public class HelloWorld {
4     public void printHello(){
5         System.out.println("Hello Aop.");
6     }
7 }

编写配置文件

 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:aop="http://www.springframework.org/schema/aop"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 7         http://www.springframework.org/schema/aop
 8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
 9
10     <!-- bean definition & AOP specific configuration -->
11     <!-- 1 配置对象-->
12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
14
15     <!-- 2 配置aop操作-->
16     <aop:config>
17         <!-- 2.1 配置切入点-->
18         <!-- 设置切入点id为pointcut1 -->
19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
20
21         <!-- 2.2 配置切面-->
22         <aop:aspect ref="timeHandler">
23             <!-- 配置前置增强类型 ,method:增强类()里面的方法(beforTime())作为前置-->
24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
25             <aop:before method="beforTime" pointcut-ref="pointcut1"/>
26         </aop:aspect>
27     </aop:config>
28 </beans>

编写Application.java

 1 package com.example.spring;
 2
 3 import org.springframework.context.support.AbstractApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 public class Application {
 7     public static void main(String[] args) {
 8         //bean配置文件所在位置 D:\\IdeaProjects\\spring\\src\\Beans.xml
 9         //使用AbstractApplicationContext容器
10         AbstractApplicationContext context = new ClassPathXmlApplicationContext("file:D:\\IdeaProjects\\spring\\src\\aop.xml");
11         //得到配置创建的对象
12         HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
13         helloWorld.printHello();
14     }
15 }

运行输出

前置增强:CurrentTime = 1510134673408
Hello Aop.

可以看到,打印Hello Aop.之前会先打印当前的时间CurrentTime = 1510132664923。

后置增强实例

修改TimeHandler.java

 1 package com.example.spring;
 2
 3 import org.aspectj.lang.ProceedingJoinPoint;
 4
 5 public class TimeHandler {
 6     public void beforTime()
 7     {
 8         System.out.println("前置增强:CurrentTime = " + System.currentTimeMillis());
 9     }
10
11     public void afterTime()
12     {
13         System.out.println("后置增强:CurrentTime = " + System.currentTimeMillis());
14     }
15 }

修改配置文件aop.xml

 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:aop="http://www.springframework.org/schema/aop"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 7         http://www.springframework.org/schema/aop
 8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
 9
10     <!-- bean definition & AOP specific configuration -->
11     <!-- 1 配置对象-->
12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
14
15     <!-- 2 配置aop操作-->
16     <aop:config>
17         <!-- 2.1 配置切入点-->
18         <!-- 设置切入点id为pointcut1 -->
19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
20
21         <!-- 2.2 配置切面-->
22         <aop:aspect ref="timeHandler">
23             <!-- 配置前置增强类型 method:增强类()里面的方法(beforTime())作为前置-->
24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
25             <!--<aop:before method="beforTime" pointcut-ref="pointcut1"/>-->
26
27             <!-- 配置后置增强类型 method:增强类()里面的方法(afterTime())作为后置-->
28             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
29             <aop:after method="afterTime" pointcut-ref="pointcut1"/>
30         </aop:aspect>
31     </aop:config>
32 </beans>

运行输出

Hello Aop.
后置增强:CurrentTime = 1510134850754

环绕增强实例

修改TimeHandler.java

 1 package com.example.spring;
 2
 3 import org.aspectj.lang.ProceedingJoinPoint;
 4
 5 public class TimeHandler {
 6     public void beforTime()
 7     {
 8         System.out.println("前置增强:CurrentTime = " + System.currentTimeMillis());
 9     }
10
11     public void afterTime()
12     {
13         System.out.println("后置增强:CurrentTime = " + System.currentTimeMillis());
14     }
15
16     public void aroundTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
17         //方法之前
18         System.out.println("环绕增强:CurrentTime = " + System.currentTimeMillis());
19
20         //执行被增强的方法
21         proceedingJoinPoint.proceed();
22
23         //方法之后
24         System.out.println("环绕增强:CurrentTime = " + System.currentTimeMillis());
25     }
26
27 }

修改aop.xml

 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:aop="http://www.springframework.org/schema/aop"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 7         http://www.springframework.org/schema/aop
 8         http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
 9
10     <!-- bean definition & AOP specific configuration -->
11     <!-- 1 配置对象-->
12     <bean id="helloWorld" class="com.example.spring.HelloWorld"/>
13     <bean id="timeHandler" class="com.example.spring.TimeHandler"/>
14
15     <!-- 2 配置aop操作-->
16     <aop:config>
17         <!-- 2.1 配置切入点-->
18         <!-- 设置切入点id为pointcut1 -->
19         <aop:pointcut id="pointcut1" expression="execution(* com.example.spring.HelloWorld.*(..))"/>
20
21         <!-- 2.2 配置切面-->
22         <aop:aspect ref="timeHandler">
23             <!-- 配置前置增强类型 method:增强类()里面的方法(beforTime())作为前置通知-->
24             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
25             <!--<aop:before method="beforTime" pointcut-ref="pointcut1"/>-->
26
27             <!-- 配置后置增强类型 method:增强类()里面的方法(afterTime())作为后置通知-->
28             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
29             <!--<aop:after method="afterTime" pointcut-ref="pointcut1"/>-->
30
31             <!-- 配置环绕增强类型 method:增强类()里面的方法(aroundTime())作为环绕通知-->
32             <!-- pointcut-ref设置为切入点的id:pointcut1 -->
33             <aop:around method="aroundTime" pointcut-ref="pointcut1"/>
34         </aop:aspect>
35     </aop:config>
36 </beans>

运行输出

环绕增强:CurrentTime = 1510135559066
Hello Aop.
环绕增强:CurrentTime = 1510135559074

之后就不用修改源程序,只需通过调整配置文件,就可以调整程序的逻辑。

时间: 2024-10-29 11:05:52

Java框架spring Boot学习笔记(十三):aop实例操作的相关文章

Java框架spring Boot学习笔记(八):Spring相关概念

Spring是开源.轻量级.一站式框架. Spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码实现 ioc:控制反转,比如一个类,在类里面有方法(不是静态的方法),想要调用类里面的方法,一般的方法是创建对象(new一个),通过new出来的这个对象调用方法.而使用Spring框架时,对象的创建不是通过new出来,而是交给Spring配置创建类对象.

Java框架spring Boot学习笔记(三):Bean的作用域

Spring 框架Bean支持以下五个作用域: 下面介绍两种作用域,singleton和protoype singleton作用域 singleton作用域为默认作用域,在同一个ioc容器内getBean是同一个bean,如果创建一个singleton作用域Bean定义的对象实例,该实例将存储在该Bean的缓存中,那么以后所有针对该 bean的请求和引用都返回缓存对象. 编写HelloWorld.java 1 package com.example.spring; 2 3 public clas

Java框架spring Boot学习笔记(十一):bean管理(注解和配置文件混合使用)

配置文件和注解混合使用 创建对象操作使用配置文件方式实现 注入属性的操作使用注解方式实现 编写BookDao.java和OrderDao.java文件 BookDao.java 1 package com.example.spring; 2 3 public class BookDao { 4 public void book(){ 5 System.out.println("Book Dao."); 6 } 7 } OrderDao.java 1 package com.exampl

Java框架spring Boot学习笔记(七):基于构造函数的依赖注入

编写User.java 1 package com.example.spring; 2 3 public class User { 4 private String name; 5 private Integer age; 6 private String country; 7 8 public User(String name, Integer age, String country) { 9 this.name = name; 10 this.age = age; 11 this.count

Java框架spring Boot学习笔记(九):注入对象类型属性

使用set方法注入对象属性 编写UserDao.java文件 1 package com.example.spring; 2 3 public class UserDao { 4 public void print(){ 5 System.out.println("Dao print."); 6 } 7 } 编写UserService.java文件 1 package com.example.spring; 2 3 public class UserService { 4 //1.定义

Java框架spring Boot学习笔记(十六):操作MySQL数据库

新建一个工程,添加对数据库的支持 下载mysql驱动包 mysql-connector-java-5.1.7-bin.jar,快捷键ctrl+alt+shift+s,添加jar包到工程 编写测试文JdbcTemplateDemo.java 1 package com.jdbc; 2 3 import org.junit.Test; 4 import org.springframework.jdbc.core.JdbcTemplate; 5 import org.springframework.j

Java框架spring Boot学习笔记(十四):log4j介绍

功能 日志功能,通过log4j可以看到程序运行过程的详细信息. 使用 导入log4j的jar包 复制log4j的配置文件,复制到src下面   3.设置日志级别 info:看到基本信息 debug:看到更详细的信息

Spring boot 学习笔记 (二)- 整合MyBatis

Spring boot 学习笔记 (二)- 整合MyBatis Spring Boot中整合MyBatis,并通过注解方式实现映射. 整合MyBatis 以Spring boot 学习笔记 (一)- Hello world 为基础项目,在pom.xml中添加如下依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter&l

Spring boot 学习笔记 - Hello world

Spring boot 学习笔记 - Hello world spring boot介绍: spring-boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. Hello world 通过官网https://start.spring.io/