`
8366
  • 浏览: 809131 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第20讲--aspectj的切入点语法定义细节

阅读更多

表达式分析:

 

 

expression="execution(* cn.com.xinli.service.impl.PersionServiceBean.*(..))"

1.第一个星号表示 拦截方法的返回值为任意

 

  如果为 java.lang.String    表示只拦截 返回值为String的方法

  如果为 void                      则表示只拦截 返回值为 void 的方法

  如果为 !void                     则表示只拦截 返回值 非 void的方法

 

2. 如果我们只拦截 方法第一个参数为String,剩下的参数类型任意 则可以

 

 

expression="execution(java.lang.String cn.com.xinli.service.impl.PersionServiceBean.*(java.lang.String,..))"

 

 

未处理的问题:

 

基于配置实现aop的方式 如何给各种通知传递参数,比如给前置通知传递方法的入参,给后置通知传递方法的返回值,等晚上发了版本在研究,基于注解的已经实现了.

 

 

处理遗留问题:基于注解的方式实现在前置置通知得到拦截方法的入参,在置通知得到拦截方法的返回值,谢谢楼下的  windywindy 帮助,表示感谢!!

 

首先在beans.xml中配置切面,拦截表达式,各种通知的定义。。。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" 
       xmlns:aop="http://www.springframework.org/schema/aop"      
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  
			
           <aop:aspectj-autoproxy proxy-target-class="true"/>
           <!--切面和业务bean都需要交给容器管理--> 
            <bean id="myInterceptor" class="cn.com.xinli.service.MyInterceptor"></bean>
        	<bean id="personService" class="cn.com.xinli.service.impl.PersionServiceBean"></bean>
        	
        	 <aop:config>
        	 <!-- 定义一个切面 -->
        	 <aop:aspect id="asp" ref="myInterceptor">
        	 <!-- 定义切入点,定义拦截表达式,前置通知,后置通知,等.. --> 
        		<aop:pointcut id="mycut" expression="execution(* cn.com.xinli.service.impl.PersionServiceBean.*(..))and args(name)"/>
        		<aop:before pointcut-ref="mycut" method="doAccessCheck" arg-names="name"/>
        		<aop:after-returning pointcut-ref="mycut" method="doAfterReturning" returning="result"/>
			  	<aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>
			  	<aop:after pointcut-ref="mycut" method="doAfter"/>
			  	<aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
        	</aop:aspect>
        </aop:config>
      
       
     		
	</beans>

 

 

1.前置置通知得到拦截方法的入参,关键就是在前置方法中定义一个连接点,从连接点中得到入参,如果有多个则可以用便利的方式得到。                    测试调用 ps.save("huxl");

 

public void doAccessCheck(JoinPoint joinPoint) {
		System.out.println("前置通知:");
		Object[] args = joinPoint.getArgs(); 
		
        for (int i=0; i<args.length; i++) {     
            System.out.println("入参:"+args[i]);     
        } 
       
	}

 

 

结果:

入参:huxl
进入方法
我是save()方法
后置通知中得到结果:null
最终通知
退出方法

 

2.在后置通知中得到拦截方法的返回值 关键在与给在配置文件中 给后置方法配置返回的参数,在后置方法中将返回参入当做入参传递                 测试  ps.getPersonName(1);

 

public void doAfterReturning(String result) {
		System.out.println("后置通知中得到结果:"+result);
	}

 

 

结果:

 

前置通知:
入参:1
进入方法
我是getPersonName()方法
后置通知中得到结果:xxx
最终通知
退出方法

 

分享到:
评论
1 楼 windywindy 2009-06-10  
未解决的问题让我来帮你解决吧!
哈哈~
public class XMLInterceptor {

	 public void doAccessCheck(JoinPoint joinPoint,Integer name) {  
	        System.out.println("前置通知--"+name);  
	        Object[] args = joinPoint.getArgs();  
	        for (int i=0; i<args.length; i++) {  
	            System.out.println("---"+args[i]);  
	        }  
	        System.out.println(joinPoint.getSignature().getName());  
	    }  
	  
	    public void doAfterReturning(Person person) {  
	        System.out.println("后置通知="+person.getName());  
	    }  
	      
	    public void doAfter() {  
	        System.out.println("最终通知");  
	    }
	      
	    public void doAfterThrowing() {  
	        System.out.println("例外通知");  
	    }  
	      
	    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {  
	        System.out.println("进入方法");  
	        Object result = pjp.proceed();  
	        System.out.println("退出方法");  
	        return result;  
	    }  
}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
          <context:component-scan base-package="com"/>
          
          <bean id="person" class="com.pojo.Person"/>
          
          <aop:aspectj-autoproxy proxy-target-class="true"/>   
           <bean id="xmlInterceptor" class="com.aop.XMLInterceptor"/>  
           <bean id="personService"     class="com.service.PersonService"/>   
           
              <aop:config>  
              <aop:pointcut id="mycut" expression="execution(* com.service..*.*(..)) "/>  
              <aop:pointcut id="argcut" expression="execution(* com.service.PersonService.*(..)) and args(name)"/>
              <aop:pointcut id="personcut" expression="execution(* com.service.PersonService.*(..)) and args(person)"/>    
             <!-- 定义一个切面 -->  
             <aop:aspect id="asp" ref="xmlInterceptor">  
                <aop:before pointcut-ref="argcut" method="doAccessCheck" arg-names="name" />  
                <aop:after-returning pointcut-ref="personcut" method="doAfterReturning" arg-names="person" />  
                <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"/>  
                <aop:after pointcut-ref="mycut" method="doAfter" />  
                <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>  
            </aop:aspect>  
        </aop:config> 
</beans>

public class Person {
	private int age;

	private String name;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String string) {
		this.name = string;
	}
}
测试自己写吧!


相关推荐

    sentinel-annotation-aspectj-1.4.0.jar

    sentinel-annotation-aspectj-1.4.0.jar

    跟我学Spring3(6.5)AspectJ切入点语法详解

    在本篇内容中,我们将深入探讨Spring框架中的一个重要概念——AspectJ切入点语法,这是Spring AOP(面向切面编程)的核心部分。通过学习这一章节,您可以掌握如何在Spring3中利用AspectJ的强大功能来实现更加灵活和...

    spring-aop-aspectj-case

    - **AspectJ语法**:包括引入(Introduction)、注解(Annotation)和声明式通知(Declarative Advice)等,使切面定义更加直观。 - **Pointcut Expression**:AspectJ的切点表达式语言,用于精确匹配方法或类。 ...

    jar包---Spring Aop AspectJ新增包.rar

    Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到现有类的方法中,来实现跨切面的关注点,如日志、事务管理等。AspectJ则是一...

    sentinel-annotation-aspectj-1.8.6.jar

    sentinel-annotation-aspectj-1.8.6.jar 如果下载不了,关注我,评论区联系我。

    spring-aop-aspectj(Schema)-case

    描述中提到的"NULL"意味着没有提供具体的描述信息,但我们可以根据标题推测,这个案例可能包含如何定义切面、通知(advises)、切入点表达式(pointcut expressions)以及如何在Spring配置文件中声明和启用AspectJ的...

    gradle-kotlin-aspectj-weaver:一个Gradle插件,可让您使用AspectJ编织已编译的Java和Kotlin文件

    AspectJ 提供了自己的语言,用于定义切面和连接点。例如,以下是一个简单的日志切面示例: ```java public aspect LoggingAspect { before(): execution(* com.example.MyClass.*(..)) { System.out.println(...

    Spring4 In Action-4.2-@AspectJ-切面

    Spring4 In Action-4.2-@AspectJ-切面,Spring4 In Action-4.2-@AspectJ-切面。Spring4 In Action-4.2-@AspectJ-切面

    Android代码-org.aspectj

    AspectJ Building AspectJ has a multi module maven build. Although various modules produce intermediate results, the key artifacts at the end of the build are: aspectjrt - the AspectJ runtime ...

    SpringAOPAspectJ切入点语法详解

    SpringAOPAspectJ切入点语法详解

    Aspect-Oriented Programming with AspectJ

    AspectJ通过引入切入点(Join Points)、通知(Advisors)和织入(Weaving)等概念,使得我们可以定义和组织这些关注点,使其独立于主要业务逻辑。 ### AspectJ教程 #### 首个示例 一个简单的AspectJ示例可能涉及...

    android-gradle-aspectj:gradle插件在Android项目中添加了对AspectJ的支持

    这个插件的目的是让Android开发者能够利用AspectJ的强大功能,如声明切面、定义通知(advice)、定义切入点(pointcut)等,来实现代码的解耦和增强。例如,我们可以使用AspectJ来统一处理日志、性能监控、权限检查...

    aspectj-1.7.0.jar

    aspectj-1.7.0.jar aspectj的包

    aspectJ-1.6.11-aspectj5rt-javadoc

    自制CHM版的API文档,带索引。 注:如果各位下载后打开或无法显示页面,请在CHM文件右键—属性—解除锁定即可。

    AspactJ详解 什么是aspactJ

    AspectJ 的语法与 JavaCC 的语法类似,都是用于定义代码生成规则的。AspectJ 的编译工具能够将 AspectJ 代码编译成 Java 字节码,运行时需要包含 AspectJ 的 Runtime 库。 AspectJ 的运行原理 ------------------ ...

    aspectj-1.8.8.jar

    AspectJ提供了丰富的语法来定义切面,包括切入点(Pointcut)和通知(Advice)。切入点是切面关注点的具体定位,可以是方法调用、异常抛出等特定行为;通知则是执行的具体操作,可以在切入点匹配时被触发。例如,...

    AspectJ程序设计指南

    ### AspectJ程序设计指南知识点概览 #### 一、AspectJ简介与起步 **1.1 概述** - **AspectJ**是一种面向切面编程(AOP)的扩展语言,它扩展了Java语言来支持AOP特性。 - AOP允许程序员定义“切面”(aspect),这些切...

    aspectj-1.9.1.jar包及src文件

    aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 aspectj-1.9.1.jar和aspectj-1.9.1.src.jar包。用于切面编程。 原来积分太高,我现在...

    SpringMVC3.0-Jar全量包含cglib几个包-aop的aspectj几个包

    Spring的IoC容器管理对象的生命周期和依赖关系,而AOP则允许我们定义横切关注点,如日志、性能监控和事务管理,无需侵入业务代码。 3. **cglib**:CGLIB(Code Generation Library)是一个Java字节码操纵库,常用于...

    sentinel-annotation-aspectj-1.8.0.jar中文-英文对照文档.zip

    中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...

Global site tag (gtag.js) - Google Analytics