业务类
 package cn.itcast.aop;

 import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import java.util.Arrays; @Component
@Order
@Aspect
public class Logger {
//切点抽取
@Pointcut("execution(* cn.itcast..*.*(..))")
public void p(){} @Before("Logger.p()")
public void before(JoinPoint jp) {
String methodName = jp.getSignature().getName();
Object[] args = jp.getArgs();
System.out.println("methodName:" + methodName + " args:" + Arrays.toString(args));
System.out.println();
System.out.println("before");
// int i = 1 / 0;
}
@After("Logger.p()")
public void after(){
System.out.println("after");
} /* @Around("p()")
public Object around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("around前");
Object result = jp.proceed();
System.out.println("around后");
return result;
}*/ //可以强转为连接点返回的类型,没有问题。
/* @Around("p()")
public int around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("around前");
Object result = jp.proceed();
System.out.println("around后");
return (int) result + 5;
}*/ /*
注意:如果连接点方法有返回值,则环绕必须给返回值,不然的话返回null。
1.如果afterReturnning在around后,而around中获取参数可能出问题
2.业务中调用连接点方法获取返回值时可能会出问题
*/
@Around("p()")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("around前");
jp.proceed();
System.out.println("around后");
} /*@AfterReturning(value = "p()", returning = "result")
public void afterReturning(JoinPoint jp, int result){ String methodName = jp.getSignature().getName();
Object[] args = jp.getArgs();
System.out.println("methodName:" + methodName + " args"
+ Arrays.toString(args) + " result:" + result);
System.out.println("afterReturning");
}*/ /*@AfterReturning(value="p()", returning = "result")
public void afterReturning(int result){
System.out.println("result:" + result);
System.out.println("afterReturning");
}*/
@AfterReturning("p()")
public void afterReturning(){
System.out.println("afterReturning");
} @AfterThrowing("p()")
public void afterThrowing(){
System.out.println("afterThrowing");
// int i = 1 / 0;
}
}

切面类

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <!--业务类-->
<bean id="userService" class="cn.itcast.aop.UserService"></bean>
<!--切面类-->
<!--<bean id="logger" class="cn.itcast.aop.Logger"></bean>--> <!--组件扫描-->
<context:component-scan base-package="cn.itcast"></context:component-scan> <!--开启aop代理-->
<!--<aop:aspectj-autoproxy></aop:aspectj-autoproxy>--> <!--织入-->
<aop:config>
<aop:aspect ref="logger">
<aop:after-returning method="afterReturning" pointcut="execution(public void cn.itcast.aop.UserService.deleteById(int))"></aop:after-returning>
<aop:around method="around" pointcut="execution(public void cn.itcast.aop.UserService.deleteById(int))"></aop:around>
<aop:before method="before" pointcut="execution(public void cn.itcast.aop.UserService.deleteById(int))"></aop:before>
<aop:after-throwing method="afterThrowing" pointcut="execution(public void cn.itcast.aop.UserService.deleteById(int))"></aop:after-throwing>
<aop:after method="after" pointcut="execution(public void cn.itcast.aop.UserService.deleteById(int))"></aop:after>
<!--<aop:around method="start" pointcut="execution(public void cn.itcast.aop.UserService.deleteById(int))"></aop:around>-->
</aop:aspect>
</aop:config> </beans>

Spring核心配置

 package cn.itcast;

 import cn.itcast.aop.UserService;
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 AOPTest { @Autowired
private UserService userService; @Test
public void test(){
// int i = userService.deleteById(5);
// System.out.println(i);
userService.deleteById(5);
}
}

测试类

黑马Spring学习 AOP XML和注解配置 5种通知 切点切面通知织入的更多相关文章

  1. 使用Spring实现AOP(XML+注解)

    一.Spring对AOP的支持 AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,每一个框架对AOP的支持各有特点,有些AOP能够对方法的参数进行拦截,有些AOP对方法进行 ...

  2. Spring AOP--基于XML文件的配置

    Spring AOP的配置可以基于注解,也可以基于XML文件.前面几篇都是使用注解的方式.下面介绍下使用XML文件如何配置 使用的测试类和切面类都类似.只需要属于AOP的注解去掉即可.下面是AOP的X ...

  3. Spring的AOP配置文件和注解实例解析

    1.1           Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...

  4. MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  5. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  6. J2EE进阶(五)Spring在web.xml中的配置

     J2EE进阶(五)Spring在web.xml中的配置 前言 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制自动加载到容器中.在web ...

  7. 使用Spring时web.xml中的配置

    使用Spring时web.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <web-app x ...

  8. 深入学习Spring框架(二)- 注解配置

    1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...

  9. 【Spring五】AOP之使用注解配置

    AOP使用注解配置流程: 1.当spring容器启动时候.    < context:component- scan base-package= "cn.itheima03.sprin ...

随机推荐

  1. LightOJ - 1274 Beating the Dataset —— 期望

    题目链接:https://vjudge.net/problem/LightOJ-1274 1274 - Beating the Dataset    PDF (English) Statistics ...

  2. NET LOCALGROUP命令详解(将用户添加到管理员组等)

    NET LOCALGROUP [groupname [/COMMENT:"text"]] [/DOMAIN] groupname {/ADD [/COMMENT:"tex ...

  3. BZOJ 1370 [Baltic2003]Gang团伙:并查集【虚点】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1370 题意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: (1)我 ...

  4. druid相关的时间序列数据库——也用到了倒排相关的优化技术

    Cattell [6] maintains a great summary about existing Scalable SQL and NoSQL data stores. Hu [18] con ...

  5. 2018.3.3 How too much fructose may cause liver damage

    Fructose is the sweetest of the natural sugars. As its name suggests, it is found mainly in fruits. ...

  6. 网络编程学习笔记-MAC地址和IP地址的关系

    简单地说:ip地址是服务商给你的,mac地址是你的网卡物理地址. 一.IP地址 对于IP地址,相信大家都很熟悉,即指使用TCP/IP协议指定给主机的32位地址.IP地址由用点分隔开的4个8八位组构成, ...

  7. 枚举类型的使用方法enum

    一.枚举类型的使用方法 一般的定义方式如下: enum enum_type_name { ENUM_CONST_1, ENUM_CONST_2, ... ENUM_CONST_n } enum_var ...

  8. bzoj 1369: Gem 树形dp

    题目大意 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小.N<=10000 题解 我们可以 ...

  9. 【LeetCode】064. Minimum Path Sum

    题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right w ...

  10. 如何加快建 index 索引 的时间

    朋友在500w的表上建索引,半个小时都没有结束.所以就讨论如何提速. 一.先来看一下创建索引要做哪些操作:1. 把index key的data 读到内存==>如果data 没在db_cache ...