Spring 切点

什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在这为数从多的连接点中,如何定位到某个感兴趣的连接点上呢?AOP通过"切点"定位特定连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了;连接点相当于数据库中的记录,而切点相当于查询条件.
 
    
在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条
件,Spring
AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点---其实确切地说,应该是执行点而非连接点,因为连接点是方法执行前、执行后等包
括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。

aop术语:

1、切面:所有切入点的集合

2、切入点:一组符合某种规则的连接点

3、连接点:狭义上通俗的讲指的是某个方法

4、通知:在某个连接点上的某种操作,该操作并非连接点中的操作,而是外来的操作。

5、引入(Introduction):引入(在AspectJ中被称为inter-type声明)使得一个切面可以定义被通知对象实现给定的接口, 并且可以为那些对象提供具体的实现

spring aop 增强类型支持5种:
  • 前置增强
           org.springframework.aop.BeforeAdvice  代表前置增强,因为spring只支持方法级的增强,所以MethodBeforeAdvice 是目前可用前置增强,表示在目标方法执行前实施增强。
  • 后置增强
           org.springframework.aop.AfterAdvice 代表后增强,表示目标方法在执行后实施增强 
  • 环绕增强
            org.springframework.aop.MethodInterceptor 代表环绕增强,表示目标方法执行前后实施增强
  • 异常抛出增强
            org.springframework.aop.ThrowsAdvice 代表抛出异常增强,表示目标方法抛出异常后实施增强
  • 引介增强
            org.springframework.aop.IntroductionInterceptor 代表引介增强,表示在目标类中添加一些新的方法和属性
 
前置增强,后置增强
 
服务员接口 Waiter.java

package com.paic.zhangqi.spring.aop;
 
public interface Waiter {
    void greetTo(String name);
    void serveTo(String name);
}
 
服务员接口实现类 NaiveWaiter.java

package com.paic.zhangqi.spring.aop;
 
public class NaiveWaiter implements Waiter {
 
    @Override
    public void greetTo(String name) {
        System.out.println(greet to +name+...);
    }
 
    @Override
    public void serveTo(String name) {
        System.out.println(serving +name+...);
    }
}
前置增强类 GreetingBeforeAdvice.java 在目标类方法执行前执行

package com.paic.zhangqi.spring.aop;
 
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
 
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
     
    @Override
    public void before(Method method, Object[] args, Object obj) throws Throwable {
        String clientName = (String)args[0];
        System.out.println(How are you!Mr.+clientName+.);
    }
}

后置增强类GreetingAfterAdvice.java 在目标类方法调用后执行

package com.paic.zhangqi.spring.aop;

import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice; public class GreetingAfterAdvice implements AfterReturningAdvice { @Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println(Please enjoy yourself!);
}
}

测试类 TestAdvice.java

package com.paic.zhangqi.spring.aop;

import org.springframework.aop.AfterAdvice;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.ProxyFactory; public class TestAdvice { public static void main(String[] args) { Waiter target = new NaiveWaiter(); BeforeAdvice beforeAdvice = new GreetingBeforeAdvice();
AfterAdvice afterAdvice = new GreetingAfterAdvice(); // spring 提供的代理工厂
ProxyFactory pf = new ProxyFactory(); // 设置代理目标
pf.setTarget(target); // 为代理目标添加增强
pf.addAdvice(beforeAdvice);
pf.addAdvice(afterAdvice); // 生成代理实例
Waiter proxy = (Waiter)pf.getProxy(); proxy.greetTo(John);
proxy.serveTo(Tomcat); }
}

输出结果

How are you!Mr.John.
greet to John...
Please enjoy yourself!
How are you!Mr.Tomcat.
serving Tomcat...
Please enjoy yourself!

使用配置文件进行配置 beans.xml

<beans beans="" http:="" schema="" spring-beans-3.0.xsd="" www.springframework.org="" 
xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans">
      <bean class="com.paic.zhangqi.spring.aop.GreetingBeforeAdvice" id="greetingBefore" />
      <bean class="com.paic.zhangqi.spring.aop.GreetingAfterAdvice" id="greetingAfter" />
      <bean class="com.paic.zhangqi.spring.aop.NaiveWaiter" id="target" />
</beans>

对应的测试类 SpringConfigTest.java

package com.paic.zhangqi.spring.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringConfigTest { public static void main(String[] args) {
String configPath = com/paic/zhangqi/spring/aop/beans.xml;
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waiter waiter = (Waiter) ctx.getBean(waiter);
waiter.greetTo(John);
waiter.serveTo(Tomcat);
}
}

同样得到输出

How are you!Mr.John.
greet to John...
Please enjoy yourself!
How are you!Mr.Tomcat.
serving Tomcat...
Please enjoy yourself!

Spring学习(七)——增强类的更多相关文章

  1. Spring学习七----------Bean的配置之自动装配

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...

  2. Spring AOP 创建增强类

    AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强:     1)前置增强:org.springframework.aop.BeforeAd ...

  3. spring学习七 spring和dynamic project进行整合

    spring和web项目进行整合,其实就是在项目启动时,就创建spring容器,然后在servlet中使用spring容器进行开. 注意:为了页面可以访问到servlet,因此servlet必须放进t ...

  4. Spring学习(七)--Spring MVC的高级技术

    一.Spring MVC配置的替代方案 我们已经了解如何通过AbstractAnnotationConfigDispatcherServlet- Initializer快速搭建了Spring MVC环 ...

  5. Spring学习(七)

    注解产生原因 1.传统spring的做法:使用xml来对bean进行注入和或者是配置aop.事物配置文件体积庞大,造成了配置文件的可读性和可维护性很低Java文件和xml不断切换,造成思维不连贯开发效 ...

  6. Spring学习七:ComponentScan注解

    今天主要从以下几个方面来介绍一下@ComponentScan注解: @ComponentScan注解是什么 @ComponentScan注解的详细使用 1.ComponentScan注解是什么 其实很 ...

  7. Spring学习(七)-----Spring Bean的5种作用域

    在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者.bean支持的5种范围域: 单例(singleton) - 每个Spring IoC 容器返回一 ...

  8. spring学习七

    一: web.xml中常用配置元素? <servlet></servlet>: 在向servlet或JSP页面制定初始化参数或定制URL时,首先命名servlet或JSP页面. ...

  9. (转)SpringMVC学习(七)——Controller类的方法返回值

    http://blog.csdn.net/yerenyuan_pku/article/details/72511844 本文所有案例代码的编写均建立在前文SpringMVC学习(六)——SpringM ...

随机推荐

  1. java 加载并读取Properties 文件

    1 .系统自带的application.properties  (以下代码仅供参考,不能粘贴复制) 假设application.properties文件有下面两个值: come.test.name = ...

  2. 运行Delphi XE10的MongoDB例程,测试Delphi插入记录性能

    Delphi XE10支持MongoDB的数据库,提供了个例子restaurants可批量导入数据. 本文对比Delphi例子与MongoDB自带的mongoimport导入批量数据的性能. 步骤: ...

  3. NOR Flash的原理与操作

    学习目标: 1.了解nor flash存储芯片的概念和特性 2.掌握使用s3c2440芯片对外挂的nor flash进行读写擦除操作 1.NOR Flash的简单介绍 NOR Flash最早是由Int ...

  4. PICT工具一键生成正交试验用例

    PICT工具一键生成正交试验用例 作用: 1.解决手动设计大量测试用例.或覆盖不全面问题,提高测试效率 2.读取excel,将生成的参数组合自动带入脚本,进行接口自动化测试 一.PICT简介 PICT ...

  5. Google protobuf使用技巧和经验

    Google protobuf是非常出色的开源工具,在项目中可以用它来作为服务间数据交互的接口,例如rpc服务.数据文件传输等.protobuf为proto文件中定义的对象提供了标准的序列化和反序列化 ...

  6. Linux下IPC机制

    Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...

  7. 20145207《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    <Java 程序设计>实验一(Java开发环境的熟悉)实验报告 目录 改变 Java开发环境的熟悉实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.增加了自 ...

  8. wmware 10 升级到11后,macos不能运行的问题

    解决方案: 1.由于wmware升级,原来的unlocker已不能使用. 所以得升级unlocker版本,目前支持wmware11的最新版本是2.0.4 http://www.insanelymac. ...

  9. [转]WIN2008 IIS7的日期格式

    最近项目升级服务器从32位升级到64位的WIN2008,日期显示格式非我们所期望的yyyy-M-d格式,原以为修改控制面板的日期格式即可,可是不行. 修改注册表问题解决. 修改方法: 运行注册表编辑器 ...

  10. devpi 快速入门:上传,测试,推送发行版

    安装 devpi 客户端和服务器端 pip install -U devpi 这将安装devpi-client,devpi-server 和 devpi-web 三个Python PyPi包. 初始化 ...