黑马Spring学习 AOP XML和注解配置 5种通知 切点切面通知织入
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种通知 切点切面通知织入的更多相关文章
- 使用Spring实现AOP(XML+注解)
一.Spring对AOP的支持 AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,每一个框架对AOP的支持各有特点,有些AOP能够对方法的参数进行拦截,有些AOP对方法进行 ...
- Spring AOP--基于XML文件的配置
Spring AOP的配置可以基于注解,也可以基于XML文件.前面几篇都是使用注解的方式.下面介绍下使用XML文件如何配置 使用的测试类和切面类都类似.只需要属于AOP的注解去掉即可.下面是AOP的X ...
- Spring的AOP配置文件和注解实例解析
1.1 Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...
- MongoDB和Java(5):Spring Data整合MongoDB(注解配置)
最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- J2EE进阶(五)Spring在web.xml中的配置
J2EE进阶(五)Spring在web.xml中的配置 前言 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制自动加载到容器中.在web ...
- 使用Spring时web.xml中的配置
使用Spring时web.xml中的配置: <?xml version="1.0" encoding="UTF-8"?> <web-app x ...
- 深入学习Spring框架(二)- 注解配置
1.为什么要学习Spring的注解配置? 基于注解配置的方式也已经逐渐代替xml.所以我们必须要掌握使用注解的方式配置Spring. 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 ...
- 【Spring五】AOP之使用注解配置
AOP使用注解配置流程: 1.当spring容器启动时候. < context:component- scan base-package= "cn.itheima03.sprin ...
随机推荐
- win10安装tomcat7
下载Tomcat 安装tomcat tomcat7是绿色软件,解压后即可使用,请大家先将tomcat解压到合适的位置(建议整个路径都是英文路径),下载 apache-tomcat-7.0.79-win ...
- [转]aliyun阿里云Maven仓库地址——加速你的maven构建
原文链接:http://www.cnblogs.com/geektown/p/5705405.html maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度 ...
- Use trained sklearn model with pyspark
Use trained sklearn model with pyspark from pyspark import SparkContext import numpy as np from sk ...
- Java_Time_01_获取当前时间
1. Date SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// ...
- swoole的http服务
PHP实现基于Swoole简单的HTTP服务器 引用Swoole官方定义: PHP语言的异步.并行.高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户 ...
- hdu 6006
HDU - 6006 Engineer Assignment 我参考了这份题解. 贴上我比较拙的代码,留念一下. /** * 想到状态压缩的dp问题就解决了一半. */ #include <st ...
- 【LeetCode】070. Climbing Stairs
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- Java网络与多线程系列之1:实现一个简单的对象池
前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...
- BZOJ3065:带插入区间K小值
浅谈树状数组与主席树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- PC lint -sem 用法示例
-sem(std::auto_ptr::auto_ptr,custodial(1)) // the auto_ptr class type // handles custody automagical ...