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学习四的更多相关文章

  1. spring学习(四) ———— 整合web项目(SSH)

    清楚了spring的IOC 和 AOP,最后一篇就来整合SSH框架把,记录下来,以后应该会用的到. --WH 一.web项目中如何使用spring? 当tomcat启动时,就应该加载spring的配置 ...

  2. Spring学习(四)--面向切面的Spring

    一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往 ...

  3. spring学习四:springMVC

    ref:http://www.cnblogs.com/ysocean/tag/SpringMVC%E5%85%A5%E9%97%A8%E7%B3%BB%E5%88%97/ Spring MVC的处理流 ...

  4. spring学习 四 对象的创建

    spring中,有三种创建对象的方式 (1)构造创建 (2)实例工厂构造 (3)静态工厂构造 一  构造器创建 在构造器创建对象时,有无参构造和有参构造 两种 (1)在spring中,默认的是无参构造 ...

  5. Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子

    在Spring,bean可以“访问”对方通过bean配置文件指定相同或不同的引用. 1. Bean在不同的XML文件 如果是在不同XML文件中的bean,可以用一个“ref”标签,“bean”属性引用 ...

  6. Spring学习四----------Bean的配置之Bean的配置项及作用域

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...

  7. Spring学习(四)

    Spring Ioc容器 1.具有依赖注入功能的容器.负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖.在Spring中BeanFactory是Ioc容器的实际代表者.BeanFactor ...

  8. spring学习四:Spring中的后置处理器BeanPostProcessor

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...

  9. 我的Spring学习记录(四)

    虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...

随机推荐

  1. android ------- TCP/IP

    TCP/IP 是针对因特网的通信协议. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的通信协议. TCP/IP 指传输控制协议/网际协议 (Transmission Cont ...

  2. centos6 安装python3.5后pip无法使用的处理

    现象:安装pip后发现命令无法识别command not found 原因:which查看找到不到执行路径   find搜索发现安装后存放在/usr/local/python3.5/bin下,于是判断 ...

  3. vs2013添加mysql对EF的支持(转+说明)

    在vs2013中使用mysql连接entityFramework经常会遇到这个问题:您的项目引用了最新实体框架:但是,找不到数据连接所需的与版本兼容的实体框架数据提供程序.请退出此向导,安装兼容提供程 ...

  4. Linux中安装Mysql授权远程访问

    一.直接授权 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OP ...

  5. 串的模式匹配算法 ------ KMP算法

    //KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_ ...

  6. git clone项目

    1. 生成公钥和私钥 ssh-keygen 2. 将公钥添加到github或者gitlab上,一般github或者gitlab允许添加多个公钥,可能是考虑到用户使用不同的机器了吧,还是很贴心的. 3. ...

  7. C++的成员初始化列表和构造函数体(以前未知)

    成员的初始化列表和构造函数在对成员指定初值方面是不一样的.成员初始化列表是对成员初始化,而构造函数,是对成员赋值 成员初始化列表使用初始化的方式来为数据成员指定初值, 而构造函数的函数体是通过赋值的方 ...

  8. 关于export和export default的区别

    ES6的模块化中,export与export default都可以用于导出常量.函数.文件.模块等,我们可以通过在其它文件或模块中import(常量.函数.文件.模块)的方式导入,但在一个文件或模块中 ...

  9. 函数使用十一:FTP

    网上很多FTP说明的文档,也很详细,写这玩意是备份一下: 注:有的系统需要配置FTP地址和端口,有的好像没有... SM30->SAPFTP_SERVERS_V,默认端口21. 在做之前可以做个 ...

  10. 时间序列 ARIMA 模型 (三)

    先看下图: 这是1986年到2006年的原油月度价格.可见在2001年之后,原油价格有一个显著的攀爬,这时再去假定均值是一个定值(常数)就不太合理了,也就是说,第二讲的平稳模型在这种情况下就太适用了. ...