欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

还不理解springAOP?来吧,带你学习spring的面向切面编程(第一篇)

程序员文章站 2022-04-15 17:45:05
首先AOP是指面向切面编程,是OOP(面向对象编程)的补充。那么什么是切面(Aspect)呢,就是切点(pointcut)和通知(advice)的结合使用,什么是通知?通知定义了切面要做什么,在什么时候做,而切点则定义了在什么地方做,将两者结合在一起就可以解释切面是在何时何地做什么功能。举一个例子,如果你要保存一个账户信息,但在执行保存操作之前还想打印一条日志,那控制日志打印和保存账户的信息就构成了一个切面。打印日志,在什么时候打印就是通知,而在什么地方执行保存操作就是切点,这两者构成了切面。spr...

首先AOP是指面向切面编程,是OOP(面向对象编程)的补充。那么什么是切面(Aspect)呢,就是切点(pointcut)和通知(advice)的结合使用,什么是通知?通知定义了切面要做什么,在什么时候做,而切点则定义了在什么地方做,将两者结合在一起就可以解释切面是在何时何地做什么功能。

举一个例子,如果你要保存一个账户信息,但在执行保存操作之前还想打印一条日志,那控制日志打印和保存账户的信息就构成了一个切面。打印日志,在什么时候打印就是通知,而在什么地方执行保存操作就是切点,这两者构成了切面。

spring的AOP是基于动态代理实现的,为什么这么说呢,因为保存账户和打印日志两个单独的操作,需要AOP控制它们执行的时机。

案例如下:

接口:

package cn.com.lzxh.service;
/**
 * 业务层接口
 * spring的AOP是基于动态代理实现的。
 * */
public interface AccountService {

	void saveAccount();
}

实现类:

package cn.com.lzxh.service.impl;

import cn.com.lzxh.service.AccountService;

public class AccountServiceImpl implements AccountService {

	@Override
	public void saveAccount() {
		System.out.println("保存数据。。。");
	}

}

日志类:

package cn.com.lzxh.utils;

public class Logger {

	public void printLog() {
		System.out.println("在切入点方法执行之前,开始打印日志。。。");
	}
}

spring配置文件:

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">
        
        <bean id="accountService" class="cn.com.lzxh.service.impl.AccountServiceImpl"></bean>
        
        <!-- 注册日志bean -->
        <bean id="logger" class="cn.com.lzxh.utils.Logger"></bean>
        
        <!-- 配置AOP -->
        <aop:config>
        	<!-- 配置切面 -->
        	<aop:aspect id="aspect" ref="logger">
        		<!-- 
        			before:代表前置通知,
        			method:代表通知所执行的方法
        			pointcut:代表切入点执行的方法
        		 -->
        		<aop:before method="printLog" pointcut="execution(public void cn.com.lzxh.service.impl.AccountServiceImpl.saveAccount())"/>
        	</aop:aspect>
        </aop:config>
        <!-- 加入以下配置,防止spring AOP代理混用导致异常 -->
        <aop:aspectj-autoproxy proxy-target-class="true"/>
        
</beans>

在这里需要注意,前置通知就是在切点方法执行的通知。

测试类:

package cn.com.lzxh.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.com.lzxh.service.AccountService;
import cn.com.lzxh.service.impl.AccountServiceImpl;

public class TestAOP {

	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
		AccountService as = ac.getBean("accountService", AccountServiceImpl.class);
		as.saveAccount();
	}

}

运行结果:

还不理解springAOP?来吧,带你学习spring的面向切面编程(第一篇)

 

以上就是一个完整的springAOP的例子。

本文地址:https://blog.csdn.net/qq_25816185/article/details/110881472