Spring的AOP xml和注解

Spring AOP实践
本文详细介绍Spring AOP的两种实现方式,包括XML配置和注解形式,通过实例演示如何使用AOP进行切面编程,增强代码的功能性和维护性。

Spring的AOP中相关术语的介绍
在这里插入图片描述

Spring的AOP开发:hello_world

A:(xml方式)
1.导入AOP开发所需的包
AOP联盟的jar包:com.springsource.org.aopalliance-1.0.0.jar
Spring提供的AOP的jar包:spring-aop-4.2.4.RELEASE.jar
AspectJ的jar包:com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring整合AspectJ的jar包:spring-aspects-4.2.4.RELEASE.jar

maven配置:

<!-- https://mvnrepository.com/artifact/org.aspectj/com.springsource.org.aspectj.weaver -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>com.springsource.org.aspectj.weaver</artifactId>
		    <version>1.6.8.RELEASE</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-aspects</artifactId>
	    <version>4.2.4.RELEASE</version>
	</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.2.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.2.4.RELEASE</version>
			<scope>test</scope>
		</dependency>

2.ProductDao接口:

public interface ProductDao {

	/**
	 * 持久层:产品保存
	 */
	public void save();
	
}

ProductDaoImpl实现类:

public class ProductDaoImpl implements ProductDao {

@Override
public void save() {
	System.out.println("持久层:产品保存...");
}

public int delete(){
	System.out.println("持久层:产品删除...");
	return 100;
}

@Override
public void update() {
	System.out.println("持久层:产品更新");
}

@Override
public void find() {
	System.out.println("持久层:查询");
	int i = 10/0;
}

切面类:

public class MyAspectXml {

	public void checkPrivilege(JoinPoint point){
		System.out.println("权限校验..." + point);
	}
	
	public void afterReturn(Object result){
		System.out.println("后置通知:" + result);
	}
	
	public Object around(ProceedingJoinPoint joinpoint){
		System.out.println("环绕前执行");
		Object obj = null;
		try {
			 obj = joinpoint.proceed();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		System.out.println("环绕后执行");
		return obj;
	}
	
	public void afterThrowing(Exception ex){
		System.out.println("抛出异常通知:" + ex.getMessage());
	}
	
	public void after(){
		System.out.println("最终通知");
	}
}

配置:

<aop:config>
  		<!-- 配置切入点 -->
  		<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.save(..))" id="pointcut1"/>
  		<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.delete(..))" id="pointcut2"/>
  		<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.update(..))" id="pointcut3"/>
  		<aop:pointcut expression="execution(* cn.icbc.dao.impl.ProductDaoImpl.find(..))" id="pointcut4"/>
  		<!-- 配置切面 -->
  		<aop:aspect ref="myAspectXml">
  			<!-- 前置通知 -->
  			<aop:before method="checkPrivilege" pointcut-ref="pointcut1"/>
  			<!-- 后置通知 -->
  			<aop:after-returning method="afterReturn" pointcut-ref="pointcut2" returning="result"/>
  			<!-- 环绕通知 -->
  			<aop:around method="around" pointcut-ref="pointcut3"/>
  			<!-- 抛出异常通知 -->
  			<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="ex"/>
  		</aop:aspect>
</aop:config>

B:注解形式的AOP : hello_world
1.引入jar包

2.创建核心配置文件

<?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"
    xmlns:context="http://www.springframework.org/schema/context"
    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
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
       <context:component-scan base-package="cn.itcast"></context:component-scan>
        <!-- 开启自动代理注解 -->
       <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
        
</beans>

3.创建接口

			    package com.icbc.spring.study3_2;
			    
			    public interface ProductDao {
			    	/**
			    	 * 持久层:产品保存
			    	 */
			    	public void save();
			    	
			    	public int delete();
			    	
			    	public void update();
			    	
			    	public void find();
			    }
  1. 实现类

    package com.icbc.spring.study3_2;

     		import org.springframework.stereotype.Repository;
     		
     		@Repository("ProductDao")
     		public class ProductDaoImpl implements ProductDao {
     		
     			@Override
     			public void save() {
     				System.out.println("持久层:产品保存...");
     			}
     			
     			public int delete(){
     				System.out.println("持久层:产品删除...");
     				return 100;
     			}
     		
     			@Override
     			public void update() {
     				System.out.println("持久层:产品更新");
     			}
     		
     			@Override
     			public void find() {
     				System.out.println("持久层:查询");
     			}}
    

5 .编写切面类

package com.icbc.spring.study3_2;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component("MyAspect")
@Aspect
public class MyAspect {

	@Before("execution(* com.icbc.spring.study3_2.ProductDaoImpl.save(..))")
	public void checkPrivilege(JoinPoint joinPoint){
		System.out.println("权限校验..." + joinPoint.toString());
	}
	@AfterReturning(value="execution(* com.icbc.spring.study3_2.ProductDaoImpl.delete(..))",returning="result")
	public void afterReturning(Object result){
		System.out.println("后置通知:" + result);
	}
	
	@Around("execution(* com.icbc.spring.study3_2.ProductDaoImpl.update(..))")
	public Object after(ProceedingJoinPoint joinpoint) throws Throwable{
			System.out.println("环绕通知前增强");
			Object obj = joinpoint.proceed();
			System.out.println("环绕通知后增强");
			return obj;
	}}

6.测试:

package com.icbc.spring.study3_2;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestAOP {

	@Autowired
	private ProductDao productDao;
	
	@Test
	public void test1(){
//		productDao.save();
//		productDao.afterReturning();
//		productDao.delete();
		productDao.update();
	}
	
}

c.3.注解形式的AOP入门

1.注意applicaton.xml的配置是否引入正确。(ps 修改很久才解决错误)

<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"
       xmlns:context="http://www.springframework.org/schema/context"
       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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      <!-- 开启注解扫描 -->
      <context:component-scan base-package="com.icbc.study"></context:component-scan>
     <!-- 启动@aspectj的自动代理支持-->
    <aop:aspectj-autoproxy />
      
</beans>

2.接口

public interface ProductDao {
public void save();
	
	public int delete();
	
	public void update();
	
	public void find();
}

3.实现类

@Repository("productDao")
public class ProductDaoImpl implements ProductDao {

	@Override
	public void save() {
		System.out.println("持久层:产品保存...");
	}
	
	public int delete(){
		System.out.println("持久层:产品删除...");
		return 100;
	}

	@Override
	public void update() {
		System.out.println("持久层:产品更新");
	}

	@Override
	public void find() {
		int i=1/0;
		System.out.println("持久层:查询");
	}

}

3.切面类

@Component("myAspectXml")
@Aspect
public class MyAspectXml {

	@Before("execution(* com.icbc.study.dao.impl.ProductDaoImpl.save(..))")	
	public void checkPrivilege(){
		System.out.println("权限校验...");
	}
	
	@AfterReturning(value="execution(* com.icbc.study.dao.impl.ProductDaoImpl.delete(..))",returning="result")
	public void afterReturning(Object result){
		System.out.println("后置通知:" + result);
	}
	
	
	
	@Around("execution(* com.icbc.study.dao.impl.ProductDaoImpl.update(..))")
	public Object after(ProceedingJoinPoint joinpoint) throws Throwable{
			System.out.println("环绕通知前增强");
			Object obj = joinpoint.proceed();
			System.out.println("环绕通知后增强");
			return obj;
	}
	
	@AfterThrowing(value="execution(* com.icbc.study.dao.impl.ProductDaoImpl.find(..))",throwing="ex")
	public void afterThrowing(Exception ex){
			System.out.println("抛出异常通知");
	}
	
	@After("execution(* com.icbc.study.dao.impl.ProductDaoImpl.find(..))")
	public void after(){
			System.out.println("最终通知");
	}

4.测试即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值