Spring使用——切面编程AOP使用
在我们的spring xml配置中,加上<aop:config>之后,Eclipse报错,提示The prefix "aop" for element "aop:config" is not bound,这是因为,需要在beans中加入xmlns:aop="http://www.springframework.org/schema/aop",以及在xsi:schemaLocation中加入http://www.springframework.org/schema/aop和http://www.springframework.org/schema/aop/spring-aop.xsd。然后问题就可以解决了。
再运行程序,报错Unexpected exception parsing XML document from class path resource [com/juggler/juggler.xml]; nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice。这是因为缺少了一个aopalliance.jar,下载了一个aopalliance-1.0.jar之后。
运行后报bean创建异常了异常信息是这样的:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'juggler22' defined in class path resource [com/juggler/juggler.xml]:
BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0':
Cannot create inner bean '(inner bean)#5f0ab09f' of type [org.springframework.aop.aspectj.AspectJMethodBeforeAdvice] while setting constructor argument;
nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name '(inner bean)#5f0ab09f': Cannot create inner bean '(inner bean)#6c69d02b' of type [org.springframework.aop.aspectj.AspectJExpressionPointcut] while setting constructor argument;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#6c69d02b':
Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
错误消息很长,意思就是在创建我们自己指定的juggler bean的时候,内部对象发生错误了。一开始以为是自己的juggler bean定义的时候有问题,不过之前也是这么定义的,所以应该没问题,删除掉aop的config部分之后,程序也能正常运行。那么就是string aop部分引入的问题了,google后发现,其实又是少了aspectj-1.6.9.jar包,还有aspectjweaver-1.6.9.jar包。因为spring的aop是使用了aspectj的部分功能的,所以需要引入aspectj的jar包也是正常。
不过这里不得不吐槽一下java的第三方包库。。。真的有点环环相扣的感觉了,部署环境比较恶心。
不过这个问题解决了之后,我的第一次spring aop的简单测试,也是顺利的输出预计的结果了。
其中Juggler类:
package com.juggler;
public class Juggler {
private int beanBags = 0;
private Poem poem = null;
private Instructment instructment;
public Juggler(int _beanBags, Poem _poem) {
System.out.println("Juggler constructor");
beanBags = _beanBags;
poem = _poem;
}
public void perform() {
System.out.println("throw " + Integer.toString(beanBags) + " _beanBags");
poem.read();
instructment.play();
}
public void initObject() {
System.out.println("juggler initObject calls");
}
public void destroyObject() {
System.out.println("juggler destroyObject calls");
}
public void setInstructment(Instructment _instructment) {
instructment = _instructment;
}
}
Audience类代码:
package com.juggler;
public class Audience {
public Audience() {
}
public void takeSeat() {
System.out.println("audience take seat");
}
public void applaud() {
System.out.println("clap clap clap");
}
}
juggler.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:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"
default-init-method = "initObject"
default-destroy-method = "destroyObject"> <bean id="juggler" class="com.juggler.Juggler">
<constructor-arg value="5" />
<constructor-arg ref="sonnet" />
<property name="instructment" ref="piano" />
</bean> <bean id="sonnet" class="com.juggler.SonnetPoem"/>
<bean id="sonnetMulti" class="com.juggler.SonnetPoem" scope="prototype"/> <bean id="piano" class="com.juggler.Piano" />
<bean id="audience" class="com.juggler.Audience" /> <aop:config>
<aop:aspect ref="audience">
<aop:before pointcut="execution(* com.juggler.Juggler.perform(..))" method="takeSeat" />
<aop:after pointcut="execution(* com.juggler.Juggler.perform(..))" method="applaud" />
</aop:aspect>
</aop:config>
</beans>
上述代码,我们有几个类的代码就没有贴出来了,只是简单的测试一下aop的切片功能。
从xml中我们可以了解,主要是针对juggler的perform做了一个切片,在它执行前,执行后分别调用了我们指定的method。
Spring使用——切面编程AOP使用的更多相关文章
- Spring面向切面编程(AOP)
1 spring容器中bean特性 Spring容器的javabean对象默认是单例的. 通过在xml文件中,配置可以使用某些对象为多列. Spring容器中的javabean对象默认是立即加载(立即 ...
- Spring面向切面编程(AOP,Aspect Oriented Programming)
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- Spring面向切面编程(AOP)方式二
使用注解进行实现:减少xml文件的配置. 1 建立切面类 不需要实现任何特定接口,按照需要自己定义通知. package org.guangsoft.utils; import java.util.D ...
- Spring面向切面编程AOP(around)实战
spring aop的环绕通知around功能强大,我们这里就不细说,直接上代码,看着注释就能明白 需要的可以点击下载源码 1.如果使用注解的方式则需要先创建个注解类 package com.mb.a ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)
一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...
- spring框架(2)— 面相切面编程AOP
spring框架(2)— 面相切面编程AOP AOP(Aspect Oriented Programming),即面向切面编程. 可以说是OOP(Object Oriented Programming ...
- Spring框架学习笔记(2)——面向切面编程AOP
介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...
- Spring之控制反转——IoC、面向切面编程——AOP
控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...
随机推荐
- 20个Linux服务器安全强化建议(二)
接上文,继续介绍一些Linux服务器的安全配置. #6.强密码策略. 当我们使用 useradd.usermod 命令创建或维护用户账号时,确保始终应用强密码策略.例如,一个好的密码至少包括8个字 ...
- Python学习笔记(2)
变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,它会存储在存储中,称之为变量(Variable),在大多数语言中,都把这种行为称为“给变量赋值”或“把值存储在变量中”. 而Python与 ...
- python走起之第二话
Python基础 一.整数(int) 如: 18.73.84 整数类的功能方法及举例: 带__的方法代表有多种表达方式 1.__abs__ <==> abs() 求整数的绝对值:(-11) ...
- 01-C语言概述
本文目录 一.C语言简史 二.C语言的特点 三.C语言能做什么? 四.C语言的版本问题 五.C语言语法预览 回到顶部 一.C语言简史 C语言于1972年发明,首次使用是用于重写UINX操作系统(UNI ...
- 解决lScrollView嵌套ListView只显示一行的问题,listvie显示全部的item
ScrollView嵌套ListView只显示一行的问题 1.思路:给listview重新添加一个高度. listview的高度==listview.item的高度之和. 2.注意:关键是添加list ...
- oracle连接本地数据库
连接方式: 通过SQL Developer进行连接: 通过sql plus 进行连接: SQL Developer进行连接1.安装Oracle 11g会自带一个叫做SQL Developer的工具,它 ...
- eclipse注释模板及格式化模板导入步骤
1.点击Window->Preference->Java -> Code Style -> Formatter 2.点击右侧Import选择*.xml模板文件导入即可 3.如果 ...
- PHP 二维码解码 (读取二维码)
#zbar wget http://ncu.dl.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10.tar.bz2 yum install gtk2 g ...
- winform界面闪退
我在登录成功后跳转到主页面的时候,总是会闪退,调试发现调用这个ShowDialog之后,就会触发主页面的FormClosing C# 窗体关闭时可以触发的事件 FormClosing :在窗体关闭时, ...
- MySQL数据库管理用户权限
http://blog.itpub.net/7607759/viewspace-675079/ 2.2 授予权限 前面提到了grant命令,grant的语法看起来可是相当复杂的呐: GRANT pri ...