2021-05-03 09:52  阅读(90)
文章分类:Spring 入门教程 文章标签:SpringSpring 教程
©  原文作者:一点教程 原文地址:http://www.yiidian.com/spring/

本教程将开始制作一个SpringAOP的HelloWorld,我们先以XML方式配置AOP。

一、导入Spring-AOP支持包

202105030952023351.png

其中:

aopalliance.jar

aspectjrt.jar

aspectjweaver.jar

这三个包不属于Spring自身jar包,他们属于AspectJ技术。下面简单介绍Spring与AspectJ的关系:

Spring AOP 与ApectJ 的目的一致,都是为了统一处理横切业务,但与AspectJ不同的是,Spring AOP 并不尝试提供完整的AOP功能(即使它完全可以实现),Spring AOP 更注重的是与Spring IOC容器的结合,并结合该优势来解决横切业务的问题,因此在AOP的功能完善方面,相对来说AspectJ具有更大的优势,同时,Spring注意到AspectJ在AOP的实现方式上依赖于特殊编译器(ajc编译器),因此Spring很机智回避了这点,转向采用动态代理技术的实现原理来构建Spring AOP的内部机制(动态织入),这是与AspectJ(静态织入)最根本的区别。在AspectJ 1.5后,引入@Aspect形式的注解风格的开发,Spring也非常快地跟进了这种方式,因此Spring 2.0后便使用了与AspectJ一样的注解。请注意,Spring 只是使用了与 AspectJ 5 一样的注解,但仍然没有使用 AspectJ 的编译器,底层依是动态代理技术的实现,因此并不依赖于 AspectJ 的编译器。

二、编写业务类

CustomerService:

    
    package com.yiidian.service;
    /**
     * @author http://www.yiidian.com
     *
     */
    public interface CustomerService {
    
    	public void save();
    	
    	public void update();
    }

CustomerServiceImpl(目标类):

    
    package com.yiidian.service.impl;
    
    import com.yiidian.service.CustomerService;
    /**
     * 这个类在AOP属于目标对象(Target)
     * @author http://www.yiidian.com
     *
     */
    public class CustomerServiceImpl implements CustomerService {
    
    	@Override
    	public void save() {
    		System.out.println("执行save方法");
    	}
    
    	@Override
    	public void update() {
    		System.out.println("执行update方法");
    	}
    
    }
    

三、编写切面类(重点)

    
    package com.yiidian.aspect;
    
    /**
     * Spring的AOP的切面类
     * @author http://www.yiidian.com
     *
     */
    public class MyAspect {
    
    	/**
    	 * 通知方法
    	 */
    	public void writeLog(){
    		System.out.println("使用spring的AOP切入日志...");
    	}
    
    }
    

四、配置applicationContext.xml(重点)

    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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">
    
    	<!-- 基于AspectJ的spring的AOP编写之XML方式 -->
    	
    	<!-- 1.创建目标对象 -->
    	<bean id="customerService" class="com.yiidian.service.impl.CustomerServiceImpl"/>
    	
    	<!-- 2.创建切面类对象 -->
    	<bean id="myAspect" class="com.yiidian.aspect.MyAspect"/>
    	
    	<!-- 3.配置AOP切面 -->
    	<aop:config>
    		<!-- 切面 = 通知+切入点 -->
    		<aop:aspect ref="myAspect">
    			<!-- 
    				aop:before: 代表前置通知(后面会详细介绍各种不同类型的通知的用法)
    				writeLog: 该方法为MyAspect类中的writeLog方法
    				pointcut-ref: 代表引用一个切入点
    			 -->
    			<aop:before method="writeLog" pointcut-ref="pt"/>
    			<!-- 
    				aop:pointcut:代表切入点配置
    				expression:这里配置切入点表达式,用于声明哪些方法需要被拦截
    			 -->
    			<aop:pointcut expression="execution(public void com.yiidian.service.impl.CustomerServiceImpl.*())" id="pt"/>
    		</aop:aspect>
    	</aop:config>
    	
    </beans>

五、运行结果

202105030952025052.png

可以看到save和update方法成功被Spring-AOP拦截。

源码下载:http://pan.baidu.com/s/1i4Sbyw1

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> SpringAOP的HelloWorld
上一篇
AOP底层-Cglib子类代理
下一篇
切入点表达式语法