Spring学习四
1先导入 Asject的jar包
2配置文件加入标签 ,并加入
<aop:aspectj-autoproxy proxy-target-class="true">(如果是实现接口模式的代理就不用后面的true)
</aop:aspectj-autoproxy>
3代理class加@Componet 和@Aspect,方法前面加@Before 当然不止Before 后面介绍
代码如下
package AOP;//接口类
public interface CalculatorMethod {
int add(int x,int y);
int sub(int x,int y);
int mul(int x,int y);
int div(int x,int y);
}
package AOP;
import org.springframework.stereotype.Component;
@Component
public class Calculator implements CalculatorMethod {
public int add(int x,int y) {
return (x+y);
}
public int sub(int x,int y) {
return (x-y);
}
public int mul(int x,int y) {
return (x*y);
}
public int div(int x,int y) {
return (x/y);
}
}
package AOP;//关键代理文件
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class Logging {
@Before("execution(int AOP.Calculator.add(int, int))")
/*
* 可以缩略成execution(int AOP.Calculator.*(int, int)),代表这个包下所有方法都行。
*
* */
public void log(){
System.out.println("I am out");
}
}
package AOP;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");//在工程目录下读取bean的配置。
// CalculatorMethod cal = (CalculatorMethod) context.getBean("calculator");//这是基于接口形式 如果要基于cglib这种,则要修改xml配置文件加入proxy-target-class="true"
Calculator cal = (Calculator) context.getBean("calculator");
System.out.println(cal.add(8, 8));
System.out.println(cal.sub(8, 8));
}
}
/*
输出
I am out
16
0
*/
Bean文件添加
<!-- 如果要指定某些anntion 则可以使用 标签<context:include-filter>当然 use-defalut-filters要设置为false -->
<context:component-scan base-package="AOP" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan> <aop:aspectj-autoproxy proxy-target-class="true"> </aop:aspectj-autoproxy>
五种注解,@Before 前置,@After后置, @AfterReturning 返回,@AfterThrowing 异常, @Around环绕,具体关系看代码。
package AOP; import java.util.Arrays;
import java.util.List; import org.aspectj.lang.JoinPoint;
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.springframework.stereotype.Component; @Aspect
@Component
public class Logging { @Before("execution(int AOP.Calculator.add(int, int))")
/*
* 可以缩略成execution(int AOP.Calculator.*(int, int)),代表这个包下所有方法都行。
*
* */
public void log(){
System.out.println("I am out");
} @After("execution(int AOP.Calculator.*(int, int))")//这里不能用返回值,因为返回值得再返回函数。
public void log2(JoinPoint jp){
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" with "+l); } //@AfterReturning("execution(int AOP.Calculator.*(int, int))",returning="result")
@AfterReturning(returning="result"
, pointcut="execution(int AOP.Calculator.*(int, int))")
public void log3(JoinPoint jp,Object result){
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" end with "+result);
} @AfterThrowing(throwing="e", pointcut="execution(int AOP.Calculator.*(int, int))")
public void log4(JoinPoint jp,Exception e){//注意这里填写什么异常就捕获什么异常,比如NullPointExcepiton只捕获空指针异常。
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" with "+l+" error:"+e);
} @Around("execution(int AOP.Calculator.*(int, int))")//相当于一次代理,用这个可以理解上面的过程
public Object log5(ProceedingJoinPoint pjp){
Object result =null; try { System.out.println("Around 前置"); //前置
result = pjp.proceed();
System.out.println("Around 后置");//后置
} catch (Throwable e) {//异常
// TODO Auto-generated catch block
System.out.println("Around 异常");
e.printStackTrace();
} System.out.println("Around 返回");//返回
return result;
}
}
切面的优先级 @Order 数值越小优先级越高,切入表达式 @Pointcut 声明表达式,不用加入其它方法,只是用于声明切入点,用的在其他方法里面加入该方法名字即可。其他class加class名字
代码简单如下
@Order(1)
@Aspect
@Component
public class Logging2 { @Pointcut("execution(int AOP.Calculator.add(int, int))")
public void logPoint(){} @After("logPoint()")
public void log1(){
System.out.println("afetr log 2");
} }
package AOP; import java.util.Arrays;
import java.util.List; import org.aspectj.lang.JoinPoint;
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.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Order(2)
@Aspect
@Component
public class Logging { @Before("Logging2.logPoint()")
/*
* 可以缩略成execution(int AOP.Calculator.*(int, int)),代表这个包下所有方法都行。
*
* */
public void log(){
System.out.println("I am out");
} @After("Logging2.logPoint()")//这里不能用返回值,因为返回值得再返回函数。
public void log2(JoinPoint jp){
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" with "+l); } //@AfterReturning("execution(int AOP.Calculator.*(int, int))",returning="result")
@AfterReturning(returning="result"
, pointcut="Logging2.logPoint()")
public void log3(JoinPoint jp,Object result){
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" end with "+result);
} @AfterThrowing(throwing="e", pointcut="Logging2.logPoint()")
public void log4(JoinPoint jp,Exception e){//注意这里填写什么异常就捕获什么异常,比如NullPointExcepiton只捕获空指针异常。
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" with "+l+" error:"+e);
} @Around("Logging2.logPoint()")//相当于一次代理,用这个可以理解上面的过程
public Object log5(ProceedingJoinPoint pjp){
Object result =null; try { System.out.println("Around 前置"); //前置
result = pjp.proceed();
System.out.println("Around 后置");//后置
} catch (Throwable e) {//异常
// TODO Auto-generated catch block
System.out.println("Around 异常");
e.printStackTrace();
} System.out.println("Around 返回");//返回
return result;
}
}
基于xml的配置aspect切面
先声明切面的bean,之后配置AOP 用 aop:config
//删除所有注解注入方式
public class Logging { /*
* 可以缩略成execution(int AOP.Calculator.*(int, int)),代表这个包下所有方法都行。
*
* */
public void log(){
System.out.println("I am out");
} public void log2(JoinPoint jp){
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" with "+l); } //@AfterReturning("execution(int AOP.Calculator.*(int, int))",returning="result") public void log3(JoinPoint jp,Object result){
String methodName = jp.getSignature().getName(); System.out.println("Method name: "+methodName+" end with "+result);
} public void log4(JoinPoint jp,Exception e){//注意这里填写什么异常就捕获什么异常,比如NullPointExcepiton只捕获空指针异常。
String methodName = jp.getSignature().getName();
List<Object> l = Arrays.asList(jp.getArgs());
System.out.println("Method name: "+methodName+" with "+l+" error:"+e);
} public Object log5(ProceedingJoinPoint pjp){
Object result =null; try { System.out.println("Around 前置"); //前置
result = pjp.proceed();
System.out.println("Around 后置");//后置
} catch (Throwable e) {//异常
// TODO Auto-generated catch block
System.out.println("Around 异常");
e.printStackTrace();
} System.out.println("Around 返回");//返回
return result;
}
}
bean 修改如下
<!-- 配置切面的bean -->
<bean id="loggin1" class="AOP.Logging"></bean>
<bean id="loggin2" class="AOP.Logging2"></bean> <!-- 切面的具体设置 -->
<aop:config>
<aop:pointcut expression="execution(int AOP.Calculator.add(int, int))" id="express"/><!-- 切面需要代理的点 --> <!-- 一个aspect可以代表一个切面 -->
<aop:aspect ref="loggin1" order="1">
<aop:before method="log" pointcut-ref="express"/>
<aop:after method="log2" pointcut-ref="express"/>
<aop:after-throwing method="log4" pointcut-ref="express" throwing="e"/>
<aop:after-returning method="log3" pointcut-ref="express" returning="result"/>
<aop:around method="log5" pointcut-ref="express"/>
</aop:aspect> <aop:aspect ref="loggin2" order="2">
<aop:after method="log1" pointcut-ref="express"/>
</aop:aspect> </aop:config>
Spring学习四的更多相关文章
- spring学习(四) ———— 整合web项目(SSH)
清楚了spring的IOC 和 AOP,最后一篇就来整合SSH框架把,记录下来,以后应该会用的到. --WH 一.web项目中如何使用spring? 当tomcat启动时,就应该加载spring的配置 ...
- Spring学习(四)--面向切面的Spring
一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往 ...
- spring学习四:springMVC
ref:http://www.cnblogs.com/ysocean/tag/SpringMVC%E5%85%A5%E9%97%A8%E7%B3%BB%E5%88%97/ Spring MVC的处理流 ...
- spring学习 四 对象的创建
spring中,有三种创建对象的方式 (1)构造创建 (2)实例工厂构造 (3)静态工厂构造 一 构造器创建 在构造器创建对象时,有无参构造和有参构造 两种 (1)在spring中,默认的是无参构造 ...
- Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子
在Spring,bean可以“访问”对方通过bean配置文件指定相同或不同的引用. 1. Bean在不同的XML文件 如果是在不同XML文件中的bean,可以用一个“ref”标签,“bean”属性引用 ...
- Spring学习四----------Bean的配置之Bean的配置项及作用域
© 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...
- Spring学习(四)
Spring Ioc容器 1.具有依赖注入功能的容器.负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖.在Spring中BeanFactory是Ioc容器的实际代表者.BeanFactor ...
- spring学习四:Spring中的后置处理器BeanPostProcessor
BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...
- 我的Spring学习记录(四)
虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...
随机推荐
- PGAdmin 4使用笔记
1. import 默认username为postgres psql -U username -h localhost -d databasename -f "file address&qu ...
- Bulb Switcher (leetcode java)
问题描述: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ...
- Python之深浅copy与字符编码
一.深浅copy 1. 首先看赋值运算 l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barr ...
- 【其他】【navicat】【1】navicat导入txt文件中文乱码问题解决
正文: TXT文件默认编码为ANSI,另存为编码为UTF-8的文本文件即可 备注: 1,一般需要导入的数据都是一张excel表,需要将excel表另存为“文本文件(制表符分隔)(*.txt)”保存类型 ...
- MySQL存储引擎之Myisam和Innodb总结性梳理-转
原文链接:https://www.cnblogs.com/kevingrace/p/5685355.html 谢谢楼主 Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 ...
- Rail_UVa514_栈
/* https://vjudge.net/problem/UVA-514 */ #include "pch.h" #include<iostream> #includ ...
- 17. Letter Combinations of a Phone Number C++回溯法
简单的回溯法! class Solution { public: void backTrack(string digits, vector<string> words, string an ...
- echarts3 使用总结
由于项目需要自学了echarts,下面将学到的东西总结如下,如果有哪里写的不好,请批评指正 一.前期准备 1.使用echarts之前先要引入echarts.js,js可以到官网下载 2.写一个div容 ...
- Eclipse集成weblogic教程
1.在线安装插件 1.1安装Oracle Weblogic Servers Tools oeop是添加的软件仓库的名字,随便写主要是方便记. 仓库链接:http://www.oracle.com/te ...
- java爬虫进阶 —— ip池使用,iframe嵌套,异步访问破解
写之前稍微说一下我对爬与反爬关系的理解 一.什么是爬虫 爬虫英文是splider,也就是蜘蛛的意思,web网络爬虫系统的功能是下载网页数据,进行所需数据的采集.主体也就是根据开始的超链接,下 ...