Spring学习(七)——增强类
Spring 切点
什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在这为数从多的连接点中,如何定位到某个感兴趣的连接点上呢?AOP通过"切点"定位特定连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了;连接点相当于数据库中的记录,而切点相当于查询条件.
在Spring中,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条
件,Spring
AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点---其实确切地说,应该是执行点而非连接点,因为连接点是方法执行前、执行后等包
括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体连接点上,还需要提供方位信息。
aop术语:
1、切面:所有切入点的集合
2、切入点:一组符合某种规则的连接点
3、连接点:狭义上通俗的讲指的是某个方法
4、通知:在某个连接点上的某种操作,该操作并非连接点中的操作,而是外来的操作。
5、引入(Introduction):引入(在AspectJ中被称为inter-type声明)使得一个切面可以定义被通知对象实现给定的接口, 并且可以为那些对象提供具体的实现
- 前置增强
- 后置增强
- 环绕增强
- 异常抛出增强
- 引介增强
package
com.paic.zhangqi.spring.aop;
public
interface
Waiter {
void
greetTo(String name);
void
serveTo(String name);
}
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+...);
}
}
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学习(七)——增强类的更多相关文章
- Spring学习七----------Bean的配置之自动装配
© 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...
- Spring AOP 创建增强类
AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强: 1)前置增强:org.springframework.aop.BeforeAd ...
- spring学习七 spring和dynamic project进行整合
spring和web项目进行整合,其实就是在项目启动时,就创建spring容器,然后在servlet中使用spring容器进行开. 注意:为了页面可以访问到servlet,因此servlet必须放进t ...
- Spring学习(七)--Spring MVC的高级技术
一.Spring MVC配置的替代方案 我们已经了解如何通过AbstractAnnotationConfigDispatcherServlet- Initializer快速搭建了Spring MVC环 ...
- Spring学习(七)
注解产生原因 1.传统spring的做法:使用xml来对bean进行注入和或者是配置aop.事物配置文件体积庞大,造成了配置文件的可读性和可维护性很低Java文件和xml不断切换,造成思维不连贯开发效 ...
- Spring学习七:ComponentScan注解
今天主要从以下几个方面来介绍一下@ComponentScan注解: @ComponentScan注解是什么 @ComponentScan注解的详细使用 1.ComponentScan注解是什么 其实很 ...
- Spring学习(七)-----Spring Bean的5种作用域
在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者.bean支持的5种范围域: 单例(singleton) - 每个Spring IoC 容器返回一 ...
- spring学习七
一: web.xml中常用配置元素? <servlet></servlet>: 在向servlet或JSP页面制定初始化参数或定制URL时,首先命名servlet或JSP页面. ...
- (转)SpringMVC学习(七)——Controller类的方法返回值
http://blog.csdn.net/yerenyuan_pku/article/details/72511844 本文所有案例代码的编写均建立在前文SpringMVC学习(六)——SpringM ...
随机推荐
- 用启动器py成功解决python2和python3同时共存且同时运行的问题
缘起:之前一直用PHP来开发微信公众号后台,最近正在学习python,而且看到微信官方也把公众号后台的示例代码换成了python的,但是示例中用的web.py需要用到python2,而我自己的电脑上装 ...
- 利用.htaccess文件将多个子域名解析至对应的子目录
对于不支持子域名解析但是支持 .htaccess 的主机来说,这个功能就非常有用了 假设有主域名 ppios.com,子域名 yspx.ppios.com 和 ask.ppios.com,设置结果为访 ...
- USB助手
自动拷贝U盘的数据--- 由于之前学习了win32的编程就想着做一个有趣的东西.想了想准备做一个可以自动复制U盘数据的程序. 对于这个程序的功能首先就是要能够识别U盘是否插入了,这里使用了函数GetL ...
- 2017-2018-1 20155318 《信息安全系统设计基础》第2周课堂实践、makefile、以及myod
2017-2018-1 20155318 <信息安全系统设计基础>第2周课堂实践.makefile.以及myod 测试3-gdb测试 用gcc -g编译vi输入的代码 在main函数中设置 ...
- 你真的认为iphone只是一部手机么
闲言不表,直奔主题.我是一个程序员,上周参加了一个开源软件交流大会,其实会上并没有听到什么新鲜的东西.但是在会中,偶然间听到了一个关于iphone的秘密,却着实令我震惊了,事情具体是这样的,听我慢慢道 ...
- c++ 全局变量
一.全局变量 声明 全局变量的定义和一般变量定义相同,不同的就是它的位置.一般会放在所有共享函数的前边. 作用 在函数间共享数据. 二.全局变量的运用 三.作业: 写出代码运行结果: ; //0 in ...
- python 多线程笔记(6)-- 生产者/消费者模式(续)
用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import ...
- 【LG3232】[HNOI2013]游走
题面 洛谷 题解 代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstr ...
- Zabbix学习之路(二)之添加主机监控及自定义item监控
1.zabbix_get命令详解 安装zabbix-get命令 [root@linux-node1 ~]# yum install -y zabbix_get 参数说明: -s --host: 指定客 ...
- 没有执行过rm -rf /*的开发不是好运维
没有执行过rm -rf /*的开发不是好运维 起因 突然收到用户反馈说网站在手机端打开是白屏, 很奇怪的问题. 在电脑端试了下,确实也是白屏,HTML加载进来了,好像有个核心JS加载失败. 看到一个错 ...