xml版
Spring中通知的类型
- 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
- 正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
- 异常返回通知[After throwing advice]:在连接点抛出异常后执行。
- 返回通知[After (finally)advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
- 环绕通知[Around
advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join
point(调用ProceedingJoinPoint的proceed方法)还是中断执行。
针对以上举个例子(xml版):
接口:
package com.it.spring.aop4.dao;
public interface IProductDAO {
void addProduct();
void delProduct();
void queryProduct();
void updateProduct() ;
String queryPro();
void delProduct2();
void findProduct();
}
实现类:
package com.it.spring.aop4.dao;
import org.springframework.stereotype.Repository;
@Repository("productDAO")
public class ProductDAOImpl implements IProductDAO {
@Override
public void addProduct() {
System.out.println("--------ProductDAOImpl add---------");
}
@Override
public void delProduct() {
System.out.println("-----delProduct()--------");
}
@Override
public void queryProduct() {
System.out.println("-----queryProduct()--------");
}
@Override
public void updateProduct() {
System.out.println("----updateProduct()--------");
}
@Override
public String queryPro() {
System.out.println("----queryPro()--------");
return "springAOP";
}
@Override
public void delProduct2() {
System.out.println("---delProduct2()-----");
}
@Override
public void findProduct() {
System.out.println(12/2);
System.out.println("------findProduct()--------");
}
}
增强类:
package com.it.spring.aop4.dao;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 把增强写入到类中 让spring管理
* 日志管理,性能监控,权限管理,事物管理
*/
public class MyAspectXML {
/**
* 前置通知获取通知信息
*/
public void checkPri(JoinPoint joinPoint)
{
System.out.println("========权限校验-----------"+joinPoint);
}
/**
* update
* 后置通知
*/
public void writelog(JoinPoint joinPoint){
System.out.println("---------写入日志------------"+joinPoint);
}
/**
* 后置通知获取返回值
* @param rs
*/
public void writelog2(Object rs){
System.out.println("---------写入日志2------------"+rs);
}
/**
* 环绕通知
* @param joinPoint
*/
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("---======前==========");
Object obj = joinPoint.proceed();
System.out.println("---======后==========");
return obj;
}
public void checkUser(Throwable throwable){
System.out.println("---------校验用户 异常-----------"+throwable.getMessage());
}
/**
* 最终通知
*/
public void after(){
System.out.println("--------最终通知总会被执行---------");
}
}
测试类:
package com.it.spring.aop4.dao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
/**
* @author :zyx
* @date :Created in 2020/9/23 14:41
* @description:spring集成JUnit
* @modified By:
* @version: $
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class SpringAOPTest {
@Resource
IProductDAO productDAO;
@Test
public void test1(){
productDAO.addProduct();
productDAO.queryPro();
productDAO.updateProduct();
productDAO.delProduct2();
productDAO.findProduct();
}
}
xml:
package com.it.spring.aop4.dao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
/**
* @author :zyx
* @date :Created in 2020/9/23 14:41
* @description:spring集成JUnit
* @modified By:
* @version: $
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext3.xml")
public class SpringAOPTest {
@Resource
IProductDAO productDAO;
@Test
public void test1(){
productDAO.addProduct();
productDAO.queryPro();
productDAO.updateProduct();
productDAO.delProduct2();
productDAO.findProduct();
}
}
测试结果: