Spring的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

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();
	}
	
}

猜你喜欢

转载自blog.csdn.net/tangiwang/article/details/83409768