SpringAop_切入点表达式

 

(..) 所有的方法 任意的参数,  com.spring..*   子包

 

 

例子:

前提 需要导入包:

 

commons-logging.jar
spring.jar
cglib-nodep-2.1_3.jar
aspectjrt.jar
aspectjweaver.jar

 

 

 

ApplicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

           <!-- 加入aop的命名空间
                  xmlns:aop="http://www.springframework.org/schema/aop"
                           xsi:schemaLocation= http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            -->

            <bean  id="personDao" class="com.spring.aop.xml.PersonDaoImpl"></bean>
            <bean  id="transaction" class="com.spring.aop.xml.Transaction"></bean>

            <aop:config>

                    <!--
                        切入点表达式 :确定目标类

                    -->
                    <aop:pointcut expression="execution(* com.spring.aop.xml.PersonDaoImpl.*(..) )" id="perform"/>

                    <!--
                        ref 指向切面
                    -->
                    <aop:aspect ref="transaction">
                        <aop:before method="beginTransaction" pointcut-ref="perform"/>
                        <aop:after method="commit" pointcut-ref="perform" />
                    </aop:aspect>
            </aop:config>

</beans>

 

 

切面

package com.spring.aop.xml;

/**
 * 切面
 */
public class Transaction {

    //通知
    public void beginTransaction(){

        System.out.println("beginTransaction ");
    }

    public void commit(){

        System.out.println("commit transaction ");

    }

}

 

 

目标类

package com.spring.aop.xml;

public interface PersonDao {
    public void savePerson();

}

 

 

package com.spring.aop.xml;

public class PersonDaoImpl implements PersonDao {

    @Override
    public void savePerson() {

        System.out.println("save person !");
    }

}

 

 

 

测试

package com.spring.aop.xml;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TransactionTest {

    @Test
    public void testTransaction(){

        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

        PersonDao personDao = (PersonDao) context.getBean("personDao");
        personDao.savePerson();

    }

}

 

 输出:

beginTransaction
save person !
commit transaction

 

原理:

* 原理:
1.当Spring容器启动的时候,加载两个bean,对两个bean进行实列化
2.当Spring容器对应的配置文件解析到<aop:config>的时候
3.把切入点表达式解析出来,按照切入点表达式匹配spring容器内容的bean
4.如果匹配成功,则为该bean创建代理对象
5.当客户端利用context.getBean获取一个对象时,如果该对应有代理对象,则返回代理对象
如果没有代理对象,则返回对象本身

 

时间: 2024-10-29 05:09:34

SpringAop_切入点表达式的相关文章

Spring切入点表达式常用写法

自从使用AspectJ风格切面配置,使得Spring的切面配置大大简化,但是AspectJ是另外一个开源项目,其规则表达式的语法也稍稍有些怪异. 下面给出一些常见示例的写法: 比如,下面是一个对Service包上所有方法的切面配置 <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* *..service*..*(..))"/> <aop:adv

AOP实现日志打印 基于xml配置的AOP实现 切入点表达式

前置通知,后置通知,异常通知,返回通知 使用注解需要加入 在xml中加入  <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 环绕通知(跟以上结果一样)  需要有返回值return rs: 基于xml配置的AOP实现(上面的注解全去掉,配置以下) ①切入点表达式的语法格式[参见第5章AOP细节] execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表])) 参见第5章AOP细节:演示验证 1.任

pointcut 切面表达式 切入点表达式

下面给出一些常见切入点表达式的例子. 任意公共方法的执行: execution(public * *(..)) 任何一个以"set"开始的方法的执行: execution(* set*(..)) AccountService 接口的任意方法的执行: execution(* com.xyz.service.AccountService.*(..)) 定义在service包里的任意方法的执行: execution(* com.xyz.service.*.*(..)) 定义在service包

Spring(三)--AOP【面向切面编程】、通知类型及使用、切入点表达式

1.概念:Aspect Oriented Programming 面向切面编程 在方法的前后添加方法 2.作用:本质上来说是一种简化代码的方式 继承机制 封装方法 动态代理 -- 3.情景举例 ①数学计算器接口[MathCalculator] int add(int i,int j); int sub(int i,int j); int mul(int i, int j); int div(int i,int j); 因为后面的通知方法需要返回值,所以在这里类型声明为 int 类型 public

框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate

1     AOP 1.1   什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. * AOP采取横向抽取机制,取代了传统纵向继承体系

切入点表达式解析

先来看看这个spring的配置文件的配置: <!-- 事务管理器 -->  <bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">   <property name="sessionFactory" ref="sessionFactory" /&g

Spring AOP 切入点表达式使用

1.切入点表达式 1)匹配类型 用于匹配哪些类型的方法启用方面组件,语法格式如下 within(类型) --匹配容器中HibernateCostDaoImpl的所有方法 within(com.tarena.dao.HibernateCostDaoImpl) --匹配com.tarena包下所有类的所有方法 within(com.tarena.*) --匹配com.tarena包及子包的所有类的所有方法 within(com.tarena..*) 2)匹配方法 用于匹配哪些方法启用方面组件,语法格

007 重用切入点表达式

一 . 概述 在前面的一节中,我们介绍了切入点表达式的书写方式. 但是一个通知后面需要加上一个切入点表达式,这样就会造成我们需要重复书写大量的切入点表达式. 因此,重用切入点表达式的需求就出现了. spring为我们提供这一实现. 二 .简单的例子 @Aspect public class MyAspect { @Pointcut("execution(* com.trek.aspect.RealSubject.test(..))") public void exp() {} @Bef

006 切入点表达式

一 .概述 在上一节之中,我们看到了使用AspectJ处理AOP变得十分简单了. 其核心有两点是需要我们重点注意的: (1)切入点表达式 (2)通知增强的注解 本节,重点说一下切入点表达式的问题. 二 .切入点表达式 切入点表达式重点表示的就是通知到底应该在上面方法上面生效. 因此,切入点表达式的核心就很好理解了. 在AspectJ之中,定义了很多的切入点表达式的情况,数量十分的多,但是我们却只需要知道少数的几个就能完成我们的日常任务. 其中最为重要的就是 execution() : 表达式函数