【Spring学习笔记】11 spring aop 编程(注解方式)

14 篇文章 0 订阅
2018.5.25
注解方式比较繁琐不直观,了解即可
1.创建web项目

2.引入jar包
在原来jar包基础上引入aop相关的jar包


3.日志文件
log4j.properties
4.准备目标对象
先创建接口
再创建实现类
package com.lu.spring.aop.service;

public class UserServiceImpl implements UserService {

@Override
public void save (String name) {
int a = 9 / 0 ;
System.out.println( "保存用户" );
}

@Override
public void deltete () {
System.out.println( "删除用户" );
}

@Override
public void update () {
System.out.println( "更新用户" );
}

@Override
public void select () {
System.out.println( "查询用户" );
}
}
5.编写通知

  • 前置通知:在目标方法之前调用
  • 后置通知(如果出现异常不调用):在目标方法之后调用的
  • 后置通知(无论异常都会调用):在目标方法之后调用的
  • 环绕通知:在目标方法之前后调用
  • 异常通知:出现异常在调用,不出现异常则不调用、
package com.lu.spring.aop.advice;

import org.aspectj.lang.ProceedingJoinPoint;

/**
* 通知
* @author bitware13
*
*/
public class TransactionAdvice {
/* 前置通知:在目标方法之前调用
后置通知(如果出现异常不调用):在目标方法之后调用的
后置通知(无论异常都会调用):在目标方法之后调用的
环绕通知:在目标方法之前后调用
异常通知:出现异常在调用,不出现异常则不调用*/
public void before () {
System. out .println( "前置通知被执行" );
}
public void after () {
System. out .println( "后置通知被执行,无论异常都会调用" );
}
public void afterReturning () {
System. out .println( "后置通知被执行,如果出现异常不调用" );
}
public void afterException () {
System. out .println( "异常通知被执行" );
}
public Object around (ProceedingJoinPoint point) throws Throwable {
System. out .println( "环绕通知前" );
Object proceed = point.proceed(); //调用目标方法
System. out .println( "环绕通知后" );
return proceed;
}
}
6.配置织入,将通知织入到目标对象
expression="execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))"
所有的返回值类型,service包下所有的子包中所有impl包下的所有有参无参的方法
加入AOP名称空间
<? 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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd" >
<!-- 目标对象 -->
<bean name = "userService" class = "com.lu.spring.aop.service.UserServiceImpl" ></bean>
<!-- 通知对象 -->
<bean name = "transactionAdvice" class = "com.lu.spring.aop.advice.TransactionAdvice" ></bean>
<!-- 开启织入注解 -->
<aop:aspectj-autoproxy> </aop:aspectj-autoproxy>
</beans>
7.在通知上添加注解

package com.lu.spring.aop.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang. annotation .After;
import org.aspectj.lang. annotation .AfterReturning;
import org.aspectj.lang. annotation .AfterThrowing;
import org.aspectj.lang. annotation .Around;
import org.aspectj.lang. annotation .Aspect;
import org.aspectj.lang. annotation .Before;
import org.aspectj.lang. annotation .Pointcut;

/**
* 通知
* @author bitware13
*
*/
@Aspect
public class TransactionAdvice {
/* 前置通知:在目标方法之前调用
后置通知(如果出现异常不调用):在目标方法之后调用的
后置通知(无论异常都会调用):在目标方法之后调用的
环绕通知:在目标方法之前后调用
异常通知:出现异常在调用,不出现异常则不调用*/
@Pointcut("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")
public void pointcut() {}
@Before("TransactionAdvice.pointcut()")
public void before() {
System. out .println( "前置通知被执行" );
}
@After("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")
public void after() {
System. out .println( "后置通知被执行,无论异常都会调用" );
}
@AfterReturning("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")
public void afterReturning() {
System. out .println( "后置通知被执行,如果出现异常不调用" );
}
@AfterThrowing("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")
public void afterException() {
System. out .println( "异常通知被执行" );
}
@Around("execution(* com.lu.spring.aop.service..*ServiceImpl.*(..))")
public Object around(ProceedingJoinPoint point) throws Throwable {
System. out .println( "环绕通知前" );
Object proceed = point.proceed(); //调用目标方法
System. out .println( "环绕通知后" );
return proceed;
}
}
7.测试
package com .lu.spring.aop.service;


import javax .annotation.Resource;

import org .junit.Test;
import org .junit.runner.RunWith;
import org .springframework.test.context.ContextConfiguration;
import org .springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ RunWith ( SpringJUnit4ClassRunner . class )//创建容器
@ContextConfiguration( "classpath:applicationContext.xml" )//从xxx.xml中找
public class AopTest {
@ Resource ( name =" userService ")
private UserService userService;
@ Test
public void testUpdate() {
userService .update();
}
@ Test
public void testSave() {
userService .save(" helen ");
}
}
结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值