第三章 AOP 基于Schema的AOP
基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已。
3.7.1一般增强的使用
public class Target {
public void say(){
System.out.println("say...");
}
public String getName(int id,String name){
System.out.println("getName...");
return "MR"+name+id;
}
public void around(){
System.out.println("around...");
}
public void targetThrow(){
System.out.println("targetThrow");
throw new RuntimeException("我是一个运行期异常...");
}
}
b、
POJO(增强所在的类
)
public class Pojo {
public void before() {
System.out.println("前置增强");
}
public void afterReturning(String retName, int id, String name) {
System.out.println("后置增强,返回值为:"+retName+" 入参为:"+id+"-"+name);
}
public Object around(ProceedingJoinPoint point) throws Throwable{
System.out.println("方法执行之前");
Object object = point.proceed();
System.out.println("方法执行之后");
return object;
}
public void throwEx(Exception ex){
System.out.println("抛出异常增强,异常信息:"+ex.getMessage());
}
public void finalEx(){
System.out.println("Final增强");
}
}aop
命名空间与
Schema
方式配置
<?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:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 目标类 -->
<bean id="target" class="cn.framelife.spring.schema.Target"></bean> <!-- 增强所在的类 -->
<bean id="advisor" class="cn.framelife.spring.schema.Pojo"></bean> <!-- 配置基于schema的切面 -->
<aop:config proxy-target-class="true">
<!-- 确定增强所在类,并引入 -->
<aop:aspect ref="advisor">
<!—
前置增强
method是配置增强所在类中的方法
-->
<aop:before method="before" pointcut="target(cn.framelife.spring.schema.Target)"/> <!—
后置增强
Returning 是返回值,必须和method中的参数名是一样的
在Schema配置中,多个切点函数的与操作是and,或操作是or
-->
<aop:after-returning method="afterReturning" pointcut="execution(* cn.framelife.spring.schema..getName(..)) and args(id,name)" returning="retName" arg-names="retName,id,name"/> <!-- 环绕增强 -->
<aop:around method="around" pointcut="execution(* cn.framelife.spring.schema..around(..))"/> <!—
抛出异常增强
throwing是异常对象,必须和method中的参数是一样的
-->
<aop:after-throwing method="throwEx" pointcut="execution(* cn.framelife.spring.schema..targetThrow(..))" throwing="ex"/> <!-- Final增强 -->
<aop:after method="finalEx" pointcut="execution(* cn.framelife.spring.schema..targetThrow(..))"/>
</aop:config>
</beans>
d、测试
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
Target target = (Target) context.getBean("target");
target.say();
target.getName(10, "Zhang");
target.around();
target.targetThrow();
e、结果
前置增强
say...
前置增强
getName...
后置增强,返回值为:MRZhang10 入参为:10-Zhang
前置增强
方法执行之前
around...
方法执行之后
前置增强
targetThrow
抛出异常增强,异常信息:我是一个运行期异常...
Final增强
Exception in thread "main" java.lang.RuntimeException: 我是一个运行期异常...
3.7.2引介增强的使用
我们还是使用3.6.2@DeclareParents中的例子:Waiter为目标类,然后让目标类拥有ISeller接口的功能:
http://blog.csdn.net/p_3er/article/details/9269407
a、两个接口与两个类
目标类与其接口:
- public interface IWaiter {
- public void service();
- }
- @Component
- public class Waiter implements IWaiter {
- @Override
- public void service() {
- System.out.println("service");
- }
- }
运行期织入到目标类的功能类与其接口:
- public interface ISeller {
- public void sell();
- }
- public class Seller implements ISeller {
- @Override
- public void sell() {
- System.out.println("sell");
- }
- }
b、配置
<?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:p="http://www.springframework.org/schema/p"
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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 目标类 -->
<bean id="waiter" class="cn.framelife.spring.schema.Waiter"></bean> <!-- 增强所在的类 -->
<bean id="advisor" class="cn.framelife.spring.schema.Pojo"></bean> <aop:config proxy-target-class="true">
<!—
虽然引介增强不需要在增强所在的类中定义一个方法用于增强的实现,但<aop:aspect ref="advisor">中的ref属性依然要指定一个增强Bean
--> <aop:aspect ref="advisor">
<!—
引介增强
types-matching 目标类
implement-interface 要织入目标类的接口
default-impl 织入接口的实现类
-->
<aop:declare-parents
types-matching="cn.framelife.spring.schema.IWaiter+"
implement-interface="cn.framelife.spring.schema.ISeller"
default-impl="cn.framelife.spring.schema.Seller"/>
</aop:aspect>
</aop:config>
</beans>
c、测试
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
IWaiter waiter = (IWaiter) context.getBean("waiter");
waiter.service();
ISeller seller = (ISeller)waiter;
seller.sell();
d、结果
service
sell
第三章 AOP 基于Schema的AOP的更多相关文章
- spring aop 基于schema的aop
AOP的基本概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP ...
- 开涛spring3(6.3) - AOP 之 6.3 基于Schema的AOP
6.3 基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...
- spring3: 基于Schema的AOP
6.3 基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...
- 基于Schema的AOP 配置使用详解
原文地址:http://jinnianshilongnian.iteye.com/blog/1418598 基于Schema的AOP从Spring2.0之后通过"aop"命名空间来 ...
- Spring5参考指南:基于Schema的AOP
文章目录 基于Schema的AOP 定义Aspect 定义Pointcut 定义Advice advice参数 Advisors 基于Schema的AOP 上篇文章我们讲到了使用注解的形式来使用Spr ...
- spring的aop 基于schema
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 一 前期工作 1.新建一个java项目,我是使用的maven,所以我新建了一个简单的maven项目,因为mav ...
- Spring学习(20)--- Schema-based AOP(基于配置的AOP实现) -- 配置切入点pointcut
pointcut(切断点)表达式: execution(public * *(..)) execution(* set*(..)) execution(* com.xyz.service.Accoun ...
- 第三章 AOP 基于@AspectJ的AOP
在前面,我们分别使用Pointcut.Advice.Advisor接口来描述切点.增强.切面.而现在我们使用@AdpectJ注解来描述. 在下面的例子中,我们是使用Spring自动扫描和管理Bean. ...
- Spring学习(19)--- Schema-based AOP(基于配置的AOP实现) --- 配置切面aspect
Spring所有的切面和通知器都必须放在一个<aop:config>内(可以配置包含多个<aop:config>元素),每个<aop:config>包含pointc ...
随机推荐
- MFC 对话框中动态创建N级菜单以及响应事件
创建一个基于对话框的工程,工程名为CreateMenu 为该对话框增加一个文件菜单项和测试菜单项,如下图所示 测试菜单项至少要有一个子菜单项 在对话框属性中关联该菜单 在resource.h中增加 ...
- Data Recovery Advisor(数据恢复顾问)
Data Recovery Advisor 是11g新特性,是Oracle顾问程序架构的一部分,它会在遇到错误时自动收集有关故障信息.如果主动运行Data Recovery Advisor,通常可以在 ...
- xp下Oracle数据库导入SQLServer数据库数据
Oracle数据库利用ODBC数据源.PLSQL Developer导入SQLServer数据库数据 操作: 建立数据源:控制面板→管理工具→数据源 (ODBC) 打开,界面如下: 点击添加,界面如下 ...
- 多字符集(ANSI)和UNICODE及字符串处理方式准则
在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式 ...
- rcp(插件开发)org.eclipse.ui.decorators 使用
org.eclipse.ui.decorators这个扩展点可以为对应的节点添加不同的图标显示. 使用方式都差不多,以下就转载一下使用方式: 1.添加扩展点 org.eclipse.ui.decora ...
- Android---OpenGL ES之添加动作
本文译自:http://developer.android.com/training/graphics/opengl/motion.html 在屏幕上绘制对象是OpenGL的最基本功能,你可以使用其他 ...
- HNCU1100:彩票
http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1100 题目描述 有一种彩票的玩法是从1~ ...
- Windows平台Go调用DLL的坑(居然有这么多没听过的名词)
最近的项目中,使用了GO来开发一些服务中转程序.业务比较简单,但是有一些业务需要复用原有C++开发的代码.而在WINDOWS,用CGO方式来集成C/C++代码并不是太方便.所以用DLL把C++的代码封 ...
- CentOS 6.5安装Erlang/OTP 17.0
CentOS 6.5安装Erlang/OTP 17.0 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Erlang眼下已经是Fedora和Debian/ ...
- java多线程12设计模式
1.Single Threaded Execution Pattern(单线程运行模式) 2.Immutable Pattern(一成不变的模式) 3.Guarded Suspension Patte ...