- 浏览: 114896 次
- 性别:
- 来自: 广州
最新评论
-
焦德江:
非常感谢楼主啦!网上下载其他精简版的都不能用
安装oracle9i客户端精简版 -
fuyonglei:
这个标准应该严重过时了。。。。。。。。
我刚毕业一年,除了没带 ...
程序员 -
marc0658:
非常好。。
安装oracle9i客户端精简版 -
李智明:
和没说一样
IETester+DebugBar+Companion.JS -
JustDoNow:
哥们,谢啦
解决问题了
log4j日志文件乱码问题
这个例子非常的简单,下面是实体类
Java代码
- package test;
- /**
- *
- * @author neu_20063500
- *
- */
- public class HelloWorld {
- public void sayHello(String helloworld) {
- System.out.println(helloworld);
- throw new RuntimeException();
- //这个异常是拿来测试,可有可无
- }
- }
package test; /** * * @author neu_20063500 * */ public class HelloWorld { public void sayHello(String helloworld) { System.out.println(helloworld); throw new RuntimeException(); //这个异常是拿来测试,可有可无 } }
想使用AOP去处理这个sayHello方法
那么我们定义切面
Java代码
- package test;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- /**
- *
- * @author neu_20063500
- *
- */
- @Aspect
- public class AspectS {
- // execution最常用,可以通过 & || !进行切入点表达式的连接
- // 可是是表达式,可以通过切入点标识重用表达式
- @Pointcut ( "execution(public void test.HelloWorld.sayHello(String))" )
- public void helloworld() {
- }
- @Before ( "execution(public void test.HelloWorld.sayHello(String))" )
- public void beforeSayHello() {
- System.out.println("before sayHello" );
- }
- @After ( "helloworld()" )
- public void afterSayHello() {
- System.out.println("after sayHello" );
- }
- @AfterThrowing ( "test.AspectS.helloworld()" )
- public void exceptionSayHello() {
- System.out.println("throw runtime exception" );
- }
- @AfterReturning ( "test.AspectS.helloworld()" )
- public void returnSayHello() {
- System.out.println("method has returned" );
- }
- @Around ( "test.AspectS.helloworld()" )
- public Object aroundSayHello(ProceedingJoinPoint pjp) {
- Object obj = null ;
- try {
- System.out.println("around start" );
- obj = pjp.proceed();
- System.out.println("around end" );
- } catch (Throwable e) {
- e.printStackTrace();
- }
- return obj;
- }
- /*
- 任意公共方法的执行:
- execution(public * *(..))
- 任何一个以“set”开始的方法的执行:
- execution(* set*(..))
- AccountService 接口的任意方法的执行:
- execution(* com.xyz.service.AccountService.*(..))
- 定义在service包里的任意方法的执行:
- execution(* com.xyz.service.*.*(..))
- 定义在service包或者子包里的任意方法的执行:
- execution(* com.xyz.service..*.*(..))
- 在service包里的任意连接点(在Spring AOP中只是方法执行) :
- within(com.xyz.service.*)
- 在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) :
- within(com.xyz.service..*)
- 实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执 行) :
- this(com.xyz.service.AccountService)
- 'this'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知 体内访问到的部分。
- 实现 了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) :
- target(com.xyz.service.AccountService)
- 'target'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得目标对象可以在 通知体内访问到的部分。
- 任何一个只接受 一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行)
- args(java.io.Serializable)
- 'args'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得方法参数可以在通知 体内访问到的部分。
- 请注意在例子中给出 的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的 (Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。
- 有一 个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行)
- @target(org.springframework.transaction.annotation.Transactional)
- '@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得 annotation对象可以在通知体内访问到的部分。
- 任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执 行)
- @within(org.springframework.transaction.annotation.Transactional)
- '@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得 annotation对象可以在通知体内访问到的部分。
- 任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只 是方法执行)
- @annotation(org.springframework.transaction.annotation.Transactional)
- '@annotation' 也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得 annotation对象可以在通知体内访问到的部分。
- 任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点 (在Spring AOP中只是方法执行)
- @args(com.xyz.security.Classified)
- '@args'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得 annotation对象可以在通知体内访问到的部分。
- */
- }
package test; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; /** * * @author neu_20063500 * */ @Aspect public class AspectS { // execution最常用,可以通过 & || !进行切入点表达式的连接 // 可是是表达式,可以通过切入点标识重用表达式 @Pointcut("execution(public void test.HelloWorld.sayHello(String))") public void helloworld() { } @Before("execution(public void test.HelloWorld.sayHello(String))") public void beforeSayHello() { System.out.println("before sayHello"); } @After("helloworld()") public void afterSayHello() { System.out.println("after sayHello"); } @AfterThrowing("test.AspectS.helloworld()") public void exceptionSayHello() { System.out.println("throw runtime exception"); } @AfterReturning("test.AspectS.helloworld()") public void returnSayHello() { System.out.println("method has returned"); } @Around("test.AspectS.helloworld()") public Object aroundSayHello(ProceedingJoinPoint pjp) { Object obj = null; try { System.out.println("around start"); obj = pjp.proceed(); System.out.println("around end"); } catch (Throwable e) { e.printStackTrace(); } return obj; } /* 任意公共方法的执行: execution(public * *(..)) 任何一个以“set”开始的方法的执行: execution(* set*(..)) AccountService 接口的任意方法的执行: execution(* com.xyz.service.AccountService.*(..)) 定义在service包里的任意方法的执行: execution(* com.xyz.service.*.*(..)) 定义在service包或者子包里的任意方法的执行: execution(* com.xyz.service..*.*(..)) 在service包里的任意连接点(在Spring AOP中只是方法执行) : within(com.xyz.service.*) 在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) : within(com.xyz.service..*) 实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执行) : this(com.xyz.service.AccountService) 'this'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。 实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) : target(com.xyz.service.AccountService) 'target'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得目标对象可以在通知体内访问到的部分。 任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行) args(java.io.Serializable) 'args'在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得方法参数可以在通知体内访问到的部分。 请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。 有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行) @target(org.springframework.transaction.annotation.Transactional) '@target' 也可以在binding form中使用:请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。 任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行) @within(org.springframework.transaction.annotation.Transactional) '@within'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。 任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行) @annotation(org.springframework.transaction.annotation.Transactional) '@annotation' 也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。 任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行) @args(com.xyz.security.Classified) '@args'也可以在binding form中使用:- 请常见以下讨论通知的章节中关于如何使得annotation对象可以在通知体内访问到的部分。 */ }
然后定义配置文件,注意将切面对象和实体对象交给Spring管理:
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:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework.org/schema/tx"
- xsi:schemaLocation ="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
- < context:annotation-config />
- < aop:aspectj-autoproxy />
- < bean id = "aspects" class = "test.AspectS" > </ bean >
- < bean id = "helloworld" class = "test.HelloWorld" > </ bean >
- </ beans >
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <aop:aspectj-autoproxy /> <bean id="aspects" class="test.AspectS"></bean> <bean id="helloworld" class="test.HelloWorld"></bean> </beans>
然后使用客户端调用:
Java代码
- package test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Client {
- public static void main(String[] args) {
- ApplicationContext cx = new ClassPathXmlApplicationContext(
- "applicationContext.xml" );
- HelloWorld bean = (HelloWorld)cx.getBean("helloworld" );
- bean.sayHello("hello world" );
- }
- }
package test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client { public static void main(String[] args) { ApplicationContext cx = new ClassPathXmlApplicationContext( "applicationContext.xml"); HelloWorld bean = (HelloWorld)cx.getBean("helloworld"); bean.sayHello("hello world"); } }
当sayHello没有抛出异常时,执行结果是:
Java代码
- before sayHello
- around start
- hello world
- after sayHello
- method has returned
- around end
before sayHello around start hello world after sayHello method has returned around end
当sayHello执行抛出异常时候,执行结果是
Java代码
- around start
- hello world
- after sayHello
- throw runtime exception
around start hello world after sayHello throw runtime exception
给出一个比较典型和常用的切点:
Java代码
- package test;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Pointcut;
- @Aspect
- public class SystemArchitecture {
- /**
- * A join point is in the web layer if the method is defined in a type in
- * the com.xyz.someapp.web package or any sub-package under that.
- */
- @Pointcut ( "within(com.xyz.someapp.web..*)" )
- public void inWebLayer() {
- }
- /**
- * A join point is in the service layer if the method is defined in a type
- * in the com.xyz.someapp.service package or any sub-package under that.
- */
- @Pointcut ( "within(com.xyz.someapp.service..*)" )
- public void inServiceLayer() {
- }
- /**
- * A join point is in the data access layer if the method is defined in a
- * type in the com.xyz.someapp.dao package or any sub-package under that.
- */
- @Pointcut ( "within(com.xyz.someapp.dao..*)" )
- public void inDataAccessLayer() {
- }
- /**
- * A business service is the execution of any method defined on a service
- * interface. This definition assumes that interfaces are placed in the
- * "service" package, and that implementation types are in sub-packages.
- *
- * If you group service interfaces by functional area (for example, in
- * packages com.xyz.someapp.abc.service and com.xyz.def.service) then the
- * pointcut expression "execution(* com.xyz.someapp..service.*.*(..))" could
- * be used instead.
- */
- @Pointcut ( "execution(* com.xyz.someapp.service.*.*(..))" )
- public void businessService() {
- }
- /**
- * A data access operation is the execution of any method defined on a dao
- * interface. This definition assumes that interfaces are placed in the
- * "dao" package, and that implementation types are in sub-packages.
- */
- @Pointcut ( "execution(* com.xyz.someapp.dao.*.*(..))" )
- public void dataAccessOperation() {
- }
- }
-
发表评论
-
容器和队列
2014-12-05 11:26 743同步容器 主要代表有Vector和Hashtable,以及C ... -
tfs安装
2014-10-23 17:06 673yum install automake.noarch yum ... -
分析函数
2010-12-06 16:22 821row_number() over(partition by ... -
十个免费的Web压力测试工具
2010-11-03 10:12 884Grinder – Grinder是一个开源的JVM负载测试 ... -
Web服务器性能压力测试
2010-11-03 10:11 1020一、http_load 程序非常小,解压后也不到100K ... -
整理用SQL进行表单查询
2010-10-19 15:22 1315显示数据表的结构 desc 数据表名 查询所有记录 selec ... -
spring3 mvc 注解
2010-09-19 14:59 1011@Autowired @Component @Contro ... -
resin泛域名
2010-09-15 10:05 0Resin: <host id="ho ... -
memcache
2010-09-01 21:16 752http://www.chineselinuxuniversi ... -
需要掌握的技术【转】
2010-09-01 20:55 7541、主流框架要掌握如(ssh),没事可以了解下jsf,shal ... -
获取spring bean
2010-08-26 16:29 983某个线程处理回调时,需要对数据库进行操作,本来可以这样: ... -
转 spring mvc图
2010-08-12 09:02 825... -
sql函数大全
2010-06-11 10:01 9001、内部合计函数 1)COUNT(*) 返回行数 2)COUN ... -
Oracle复制表
2010-05-27 08:23 2211如下,表a是数据库中已经存在的表,b是准备根据表a进行复制创建 ... -
Spring2.5 注解 Aspect AOP (转)
2010-05-26 08:46 858在低版本Spring中定义一个切面是比较麻烦的,需要实现特定的 ... -
Java remote
2010-05-24 10:34 731在处理Remote调用时,通常思路如下: 1. WebSer ... -
创建session学习-request.getSession()
2010-05-15 15:12 1145在 HttpServlet中,HttpSessio ... -
JVM垃圾回收机制与GC调整
2010-02-20 15:56 778JVM垃圾回收机制与GC调 ... -
关于spring包的详解
2010-01-27 12:59 719[转http://www.iteye.com/topic/57 ... -
log4j日志文件乱码问题
2010-01-04 11:06 1423log4j.appender.A1.Encoding=UTF- ...
相关推荐
Spring 2.5 AOP(面向切面编程)...综上所述,Spring 2.5 AOP例子展示了如何利用类扫描和XML配置实现面向切面编程。通过理解这些概念和实践,我们可以更高效地管理和维护我们的应用程序,使其更具可扩展性和可维护性。
AspectJ是一个成熟的AOP框架,Spring在其AOP实现中整合了AspectJ,提供了更强大的面向切面编程能力。本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1....
Spring 2.5还支持基于注解的AOP(面向切面编程)。`@Aspect`注解用于定义一个切面,`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`注解用于声明前置通知、后置通知、环绕通知、返回后通知和...
Spring 2.5引入了一种基于注解的新方式来驱动Spring MVC框架,使得开发者能够更加简洁、直观地配置和管理控制器。这一变化显著提升了开发效率,减少了XML配置文件的复杂性,同时也使得代码更加模块化。 ### 1. 基于...
《精通Spring2.5》是一本深度探讨Spring框架的权威指南,主要针对Spring 2.5版本进行深入解析。Spring是Java企业级应用开发中最受欢迎的框架之一,它以其轻量级、模块化的设计,以及对IoC(Inversion of Control,...
### Spring2.5注解(标注)学习笔记 在探讨Spring2.5中常见的四个注解之前,我们先简要回顾一下Spring框架的基本概念。Spring框架是一个轻量级的Java应用开发框架,它通过依赖注入(DI)和面向切面编程(AOP)等...
Spring2.5版本是该框架的一个重要里程碑,它在2008年发布,带来了许多新特性和改进,提升了开发者在构建应用程序时的灵活性和效率。 **依赖注入(DI)和控制反转(IoC)** Spring的核心特性之一是依赖注入(Dependency...
Spring 2.5增加了对注解驱动的切面的支持,`@Aspect`、`@Before`、`@After`等注解使得AOP的使用更加直观。 4. **Bean工厂与ApplicationContext**: Spring 2.5中的Bean工厂是容器的基础,而ApplicationContext是更...
Spring2.5是核心的依赖注入(DI)和面向切面编程(AOP)框架,它可以管理对象的生命周期和依赖关系。在Spring2.5中,注解如`@Autowired`、`@Service`、`@Repository`和`@Controller`引入了无XML配置的可能性。`@...
在Spring 2.5中,AOP支持更灵活的切入点表达式和更多类型的切面,如注解驱动的切面,这使得AOP更加易用和强大。 3. **Beans包**:这是Spring框架的基础,包含Bean的定义、实例化、配置和管理。在Spring 2.5中,对...
AspectJ是Spring AOP实现的基础,它提供了一种声明式的方式来定义切面,包括切入点、通知等,极大地简化了代码的组织结构。 接着是spring-beans.jar,这是Spring的核心组件,它负责Bean的创建、配置和管理。在AOP中...
9. **事务管理**:Spring 2.5的事务管理支持包括编程式和声明式两种方式,可以在不侵入业务代码的情况下实现事务的控制。 10. **国际化(i18n)支持**:Spring 2.5提供了更好的国际化支持,使得应用可以轻松地根据...
3. **AOP增强**:Spring的面向切面编程(AOP)在2.5版本中也有所改进,新增了`@Aspect`注解,允许开发者直接在类级别定义切面。此外,还支持了注解驱动的通知,如`@Before`、`@After`、`@Around`和`@AfterThrowing`。 ...
3. **AOP(Aspect-Oriented Programming,面向切面编程)**:在Spring 2.5中,AOP支持更加丰富,包括注解式切面定义,如`@Before`、`@After`、`@Around`等,以及基于注解的切入点表达式,让切面的定义更加直观。...
其次,Spring2.5在AOP(面向切面编程)方面也有所加强。AOP是Spring用于实现横切关注点,如日志、事务管理的关键特性。在2.5版本中,AOP支持更灵活的切入点表达式,可以基于方法参数类型和注解进行匹配,增强了切面...
这个"Spring2.5-中文参考手册chm.zip"文件包含了关于Spring 2.5版本的详细中文指南,对于学习和理解Spring框架具有很高的价值。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程...
综上所述,这个"spring2.5基于注解的例子程序"涵盖了Spring 2.5的核心特性,包括注解驱动的配置、自动扫描、基于注解的事务管理、AOP支持、MVC框架的使用,以及依赖注入等。通过学习和理解这个例子,开发者可以更好...
通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...
Spring框架是一个开源的Java平台,它主要简化了企业级应用的开发工作,通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)等核心特性,实现了代码的解耦和模块化。...