黑马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 ...
随机推荐
- java进程分析
1. 找出 java进程pid,比如 11327 2. 使用jstack 看下 锁持有情况 /usr/java/latest/bin/jstack -l 11327 3. 输出java堆栈信息,以及 ...
- openstack制作镜像官网地址
http://docs.ocselected.org/openstack-manuals/kilo/image-guide/content/ch_creating_images_automatical ...
- PYTHON 爬虫笔记十一:Scrapy框架的基本使用
Scrapy框架详解及其基本使用 scrapy框架原理 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...
- 农业公司flash动画模板
农业公司flash动画素材下载模板是一款绿色水果蔬菜种植企业的flash动画模板. 下载:http://www.huiyi8.com/sc/10576.html
- PHP相关安全配置【转】
PHP是广泛使用的开源服务端脚本语言.通过HTTP或HTTPS协议,Apache Web服务允许用户访问文件或内容.服务端脚本语言的错误配置会导致各种问题.因此,PHP应该小心使用.以下是为系统管理员 ...
- 微信video和audio无法自动播放解决方案
//音频,写法一<audio src="music/bg.mp3" autoplay loop controls>你的浏览器还不支持哦</audio> // ...
- Composer基础应用1
先唠叨唠叨一些琐碎的事.本人最早从事.Net开发,后来处于好奇慢慢转到了php,因为.net从一早就使用了命名空间(反正从我使用就存在这玩意了),所以在转php时很自然的就使用了命名空间,但是在使用过 ...
- laravel 在apache或nginx的配置
laravel 下载后,如何运行起来呢,根据自己的应用,记录了几个关键点: 1.apache 配置: 打开http.conf文件,将mod_rewrite前面的#去掉(启用重写模块): 2.nginx ...
- Mac替换sublime图标
下载.icns格式一个图标:http://www.easyicon.net/language.en/iconsearch/sublime/ 终端执行:open /Applications/Sublim ...
- css 3d box 实现的一些注意事项
Test1.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...