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. hdu-3001 三进制状态压缩+dp

    用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...

  2. java 循环读取文件夹里面的文件

    public ArrayList<String> list = new ArrayList<String>(0);//用arraylist保存扫描到的路径public void ...

  3. Composer 的学习

    一.Composer简介 Composer 是PHP用来管理依赖关系的工具. 使用 composer 的必要前提有: 1.PHP版本要高于PHP5.3.2 2.PHP支持OpenSSL扩展 3.安装有 ...

  4. dp练习2

    1, CF 808G Anthem of Berland 2, CF 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses

  5. hbase知识

    HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统 HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据. HBASE ...

  6. PAT 1009 Product of Polynomials

    1009 Product of Polynomials (25 分)   This time, you are supposed to find A×B where A and B are two p ...

  7. python中bottle模块的使用

    1.简介 2.示例 2.1一个简单的bottle接口 # -*- coding: utf-8 -*- from bottle import route, request, run import jso ...

  8. 十八、Spring框架(AOP)

    一.AOP(基于XML方式配置AOP) AOP(Aspect Oriented Program):面向切面编程.思想是:把功能分为核心业务功能和周边功能. 所谓核心业务功能:比如登录,增删改数据都叫做 ...

  9. MSSQL数据库后台进程(线程)

    与Oracle数据库类似,微软数据库产品MSSQL也有诸多后台进程来保证数据库系统的高效正常运转,由于MSSQL采用的是线程模型,应该叫做后台线程,为了大家易于理解,我们在暂且称之为后台进程,下面我们 ...

  10. PowerShell使用教程

    一.说明 1.1 背景说明 个人对PowerShell也不是很熟悉,开始的时候就突然看到开始菜单中多了个叫PowerShell的文件夹,后来一点就看到某个教程视频说PowerShell很厉害但也没怎么 ...