业务类
 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. ansible playbook学习

    摘自: http://www.ywnds.com/?p=6064 https://github.com/ansible/ansible-examples

  2. Ubuntu 17.4下如何安装和配置flash player

    Ubuntu Linux系统下没有自带的flash player,要自己手动安装.下面post出简单的安装过程. 首先打开终端,输入命令:sudo apt-get install flashplugi ...

  3. Mysql中文检索匹配与正则

    今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了: SELECT * FROM custom WHERE custom_realname LIKE '%d%' 查询了一下, ...

  4. C# 多线程、控制线程数提高循环输出效率

    C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...

  5. eclipse的maven工程Dynamic Web Module 2.3 修改为3.0 解决办法

    1. 创建Maven Web工程 2. 项目只有src/main/resources >Java Build Path导入Tomcat运行环境 3. 删除以图片红框中的文件 4. Propert ...

  6. 改变Ecplise项目窗口字体样式

    Eclipse\plugins\org.eclipse.ui.themes_1.1.1.v20151026-1355\css e4-dark_win.css CTabFolder Tree, CTab ...

  7. dead reckoning variation

    Targeting A target is a structure of information that describes the state, and change of state, of a ...

  8. linux 进程学习笔记-运行新进程

    我们知道,当用fork启动一个新进程以后,新进程会复制父进程的大部份内存空间并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一个程序集中的代码,这就相当于启动了一个新程序. ...

  9. Sed在匹配行前后加入一行

    a 追加内容 sed ‘/匹配词/a\要加入的内容’ example.file(将内容追加到匹配的目标行的下一行位置)i 插入内容 sed ‘/匹配词/i\要加入的内容’ example.file 将 ...

  10. sangfor-AF 地址转换以及各种模式理解(路由,透明,虚拟网线,混合模式)

    目的地址转换: 1.路由其实很简单的,其实你可以理解为路由器就好了2.透明和虚拟网线的区别:虚拟网线不对数据做任何的处理,你可以理解为不封装不拆包,直接丢给对端.而透明不一样,透明你可以把设备当做是交 ...