本来是测试网上的例子,看着看着,觉得可以修改的简单一点,说干就干。
1,在Eclispe里面建立一个项目,随便,这叫context吧,使用jdk5的环境。
2,在项目里面加入log4j-1.2.8.jar,commons-logging-1.0.4.jar,cglib-nodep-2.1_3.jar,spring.jar(2.5),aspectweaver.jar,aspecjrt.jar。
3,为了能够在系统中使用log4j,在项目目录下加入log4j.properties,内容
- log4j.rootLogger=INFO,stdout
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n
4,加入spring的配置文件exception_config.xml
开始的内容:
<!---->
<beans xmlns="http://www.springframework.org/schema/beans"></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: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/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd">
- </beans>
5,做一个程序接口
- public interface LogicInterface {
- /**
- *
- * @param name
- */
- void doInsert(String name);
- /**
- *
- * @param name
- */
- void doUpdate(String name);
- /**
- *
- * @param name
- */
- void doDelete(String name);
- }
6,做两个接口的实现
- package phoenics.context.code;
- /**
- * @author phoenics
- * Logic1
- */
- public class Logic1 implements LogicInterface{
- private int j=0;
- /* (非 Javadoc)
- * @see phoenics.context.code.LogicInterface#doDelete(java.lang.String)
- */
- public void doInsert(String name) {
- System.out.println("Logic1...执行具体负责新增的业务逻辑…");
- for (int i = 0; i < 100000000; i++) {
- j++;
- //模拟执行时间
- }
- }
- /* (非 Javadoc)
- * @see phoenics.context.code.LogicInterface#doInsert(java.lang.String)
- */
- public void doUpdate(String name) {
- System.out.println("Logic1...执行具体负责修改的业务逻辑…");
- for (int i = 0; i < 200000000; i++) {
- j++;
- //模拟执行时间
- }
- }
- /* (非 Javadoc)
- * @see phoenics.context.code.LogicInterface#doUpdate(java.lang.String)
- */
- public void doDelete(String name) {
- System.out.println("Logic1...执行具体负责删除的业务逻辑…");
- for (int i = 0; i < 300000000; i++) {
- j++;
- i = i / 0;//模拟异常发生
- }
- }
- }
- package phoenics.context.code;
- /**
- * @author phoenics
- * Logic2
- */
- public class Logic2 {
- int j=0;
- // 负责新增
- public void doInsert(String name){
- System.out.println("Logic2...执行具体负责新增的业务逻辑…");
- for (int i = 0; i < 100000000; i++) {
- j++;
- //模拟执行时间
- }
- }
- //负责修改
- public void doUpdate(String name){
- System.out.println("Logic2...执行具体负责修改的业务逻辑…");
- for (int i = 0; i < 200000000; i++) {
- j++;
- //模拟执行时间
- }
- }
- //负责删除
- public void doDelete(String name){
- System.out.println("Logic2...执行具体负责删除的业务逻辑…");
- for (int i = 0; i < 300000000; i++) {
- j++;
- i = i / 0;//模拟异常发生
- }
- }
- }
7,log类,增加两个method,一个用于INFO,另一个用于error
- package phoenics.context.code;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * @author phoenics
- * Logger
- */
- public class Logger {
- private static Log log = LogFactory.getLog(Logger.class);
- public void entry_info(String message) {
- log.info(message);
- }
- public void entry_error(String message) {
- log.error(message);
- }
- }
8,好了,现在才增加aop相关的类,先看代码
- package phoenics.context.code;
- import org.aspectj.lang.JoinPoint;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Pointcut;
- /**
- * @author phoenics
- * LogAspect
- */
- @Aspect
- public class LogAspect {
- /**
- * logger
- *
- */
- private Logger logger = new Logger();
- @Pointcut("execution(public * *(..))")
- public void method1(){}
- @Pointcut("within(phoenics.context.code.Logic2)")
- public void method2(){}
- /**
- *
- * @param jp
- * @param ex
- */
- @AfterThrowing(
- pointcut="method1()",
- throwing="ex"
- )
- public void doExceptionActions(JoinPoint jp,Throwable ex ){
- String aa=jp.getSignature().getName();
- logger.entry_error(jp.getArgs()[0] + " run " + aa + " Throw...." + ex);
- }
- /**
- *
- * @param p
- * @return
- * @throws Throwable
- */
- @Around("method2()")
- public Object doTimerActions(ProceedingJoinPoint p) throws Throwable{
- long procTime = System.currentTimeMillis();
- logger.entry_info(p.getArgs()[0] + " run Starting " + p.getSignature().getName() + " method");
- try {
- Object result = p.proceed();
- return result;
- } finally {
- //计算执行时间
- procTime = System.currentTimeMillis() - procTime;
- logger.entry_info(p.getArgs()[0] + " run " + p.getSignature().getName() + " method end");
- logger.entry_info( "run "+p.getSignature().getName() +" and run method in " + procTime + "ms");
- }
- }
- }
这个里面有两个拦截的方法一个是doExceptionActions,拦截所有的发生异常的method,另一个doTimerActions,根据连接点看,它只会拦截phoenics.context.code.Logic2中的方法。
9,修改spring的配置文件exception_config.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: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/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd">
- <aop:aspectj-autoproxy proxy-target-class="true"/>
- <bean id="logic1" class="phoenics.context.code.Logic1"/>
- <bean id="LogBean1" class="phoenics.context.code.LogAspect"/>
- <bean id="logic2" class="phoenics.context.code.Logic2"/>
- beans>
<bean class="phoenics.context.code.Logic2" id="logic2"></bean>
10,编写测试类
- package phoenics.context.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.FileSystemXmlApplicationContext;
- import phoenics.context.code.Logic2;
- import phoenics.context.code.LogicInterface;
- /**
- * @author phoenics
- * TestAop
- */
- public class TestAop {
- public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
- //通过ApplicationContext获取配置文档
- ApplicationContext actx=new FileSystemXmlApplicationContext("exception_config.xml");
- LogicInterface logic1 = (LogicInterface)actx.getBean("logic1");
- Logic2 logic2 = (Logic2)actx.getBean("logic2");
- //模拟执行新增、修改、删除方法
- try {
- System.out.println("logic1 starting...");
- logic1.doInsert("张三");
- logic1.doUpdate("李四");
- logic1.doDelete("王五");
- } catch (Exception ex) {}
- try {
- System.out.println("logic2 starting...");
- logic2.doInsert("张三");
- logic2.doUpdate("李四");
- logic2.doDelete("王五");
- } catch (Exception ex) {}
- }
- }
11,看到的结果:
logic1 starting...
Logic1...执行具体负责新增的业务逻辑…
Logic1...执行具体负责修改的业务逻辑…
Logic1...执行具体负责删除的业务逻辑…
2007-10-26 20:31:53,390 ERROR (Logger.java:30) - 王五 run doDelete Throw....java.lang.ArithmeticException: / by zero
logic2 starting...
2007-10-26 20:31:53,421 INFO (Logger.java:27) - 张三 run Starting doInsert method
Logic2...执行具体负责新增的业务逻辑…
2007-10-26 20:31:53,625 INFO (Logger.java:27) - 张三 run doInsert method end
2007-10-26 20:31:53,625 INFO (Logger.java:27) - run doInsert and run method in 204ms
2007-10-26 20:31:53,625 INFO (Logger.java:27) - 李四 run Starting doUpdate method
Logic2...执行具体负责修改的业务逻辑…
2007-10-26 20:31:54,078 INFO (Logger.java:27) - 李四 run doUpdate method end
2007-10-26 20:31:54,078 INFO (Logger.java:27) - run doUpdate and run method in 453ms
2007-10-26 20:31:54,093 INFO (Logger.java:27) - 王五 run Starting doDelete method
Logic2...执行具体负责删除的业务逻辑…
2007-10-26 20:31:54,093 INFO (Logger.java:27) - 王五 run doDelete method end
2007-10-26 20:31:54,093 INFO (Logger.java:27) - run doDelete and run method in 0ms
2007-10-26 20:31:54,093 ERROR (Logger.java:30) - 王五 run doDelete Throw....java.lang.ArithmeticException: / by zero
相关推荐
Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力而闻名,而Struts2则是一款优秀的MVC框架,提供了良好的动作(Action)管理和结果映射功能。当我们需要构建复杂的企业级应用时,将两者整合能充分发挥它们...
2. **AOP(面向切面编程)**:Spring 2.0提供了更强大的面向切面编程支持,允许开发者定义切面、通知(advisors)和切点(pointcuts),并将其应用于业务代码,实现如日志、事务管理等功能。切面可以是接口、类或...
本文档旨在为用户提供一份详尽且全面的Spring Security 2.0.x版本的中文指南,它不仅覆盖了核心概念、配置方法以及实际应用案例,还深入探讨了安全框架的内部工作原理和技术细节。无论是初学者还是有一定经验的安全...
Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...
2. **面向切面编程(AOP)**:Spring 2.0提供了强大的AOP支持,允许开发者定义方法拦截器和切面,实现如事务管理、日志记录等横切关注点的解耦。 3. **Web MVC**:Spring的Model-View-Controller(MVC)架构模式在...
Spring 2.0 通过代理机制实现了 AOP 支持,主要支持两种类型的代理: - **JDK 动态代理**:基于 JDK 的 Proxy 类实现,只能代理接口。 - **CGLIB 代理**:使用 CGLIB 库实现,可以直接代理类,无需实现接口。 ####...
以上是Spring Security 2.0的一些核心概念和功能。虽然现在Spring Security已经发展到了更高级的版本,但2.0版本的基础依然牢固,许多核心理念和设计模式在后续版本中得以保留和改进。理解这些基础,将有助于开发者...
2. **AOP(面向切面编程)**:Spring的AOP模块允许我们在不修改源代码的情况下,对代码进行拦截和增强,实现如日志记录、权限控制等功能。DWR2.0可以通过Spring的AOP支持来实现这些功能,提升应用程序的安全性和可...
1. **AOP(面向切面编程)**:Spring 2.0在AOP方面有着强大的支持,允许开发者创建和管理横切关注点,如日志、事务管理和安全性。AOP通过定义切点、通知和组装切面来实现代码解耦,提高可维护性。 2. **事务管理**...
2. **面向切面编程(Aspect-Oriented Programming, AOP)**:Spring 2.0提供了基于代理的AOP实现,允许开发者定义切面,进行方法拦截,实现事务管理、日志记录等功能。 3. **Bean工厂和ApplicationContext**:Spring...
3. **spring-core-2.0.6.jar**:这是Spring框架的基础库,包含了基本的类型转换、资源处理和异常处理等功能。它还提供了IoC容器的基础支持,如ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,...
标题 "ext2.0+struts2.1+spring2.0+jdbc框架" 提到的是一个基于Java的Web开发架构,它结合了四个关键组件:EXT JS的2.0版本,Struts2.1,Spring2.0,以及JDBC(Java Database Connectivity)。这个组合在早期的Web...
Spring 2.0 MVC框架是Java Web开发中的一个重要里程碑,它极大地简化了企业...随着对Spring框架更深入的理解,开发者可以利用其强大的依赖注入、AOP(面向切面编程)和其他高级特性,构建更加复杂和健壮的企业级应用。
网上找了很多例子多数都不能运行。包括after,before,round,throw切入,可对类直接拦截,不需要定义接口文件,自己研究了2天整理出来的。 Spring AOP 的完整例子,可直接运行。带jar包。
Spring 2.0 的配置是其核心特性之一,它引入了依赖注入(IOC)和面向切面编程(AOP)的概念,极大地简化了Java企业级应用的开发。然而,随着应用规模的扩大,配置文件的数量和复杂度也随之增加,特别是事务配置。在...
Spring2.0支持JDK动态代理和CGLIB代理,允许在运行时创建AOP代理对象,实现对目标对象的增强。 综上所述,Spring2.0使用说明书详细阐述了这些关键特性的使用方法,是开发者理解和掌握Spring框架的宝贵资源。无论是...
在Spring 2.0的学习过程中,我们主要会接触到一系列的核心概念和关键特性,这些知识点对于理解和掌握Spring框架至关重要。下面将详细阐述其中的关键点。 1. **IoC(Inversion of Control,控制反转)**: Spring的...
9. **Spring的扩展性**:Spring的模块化设计使得它可以很容易地扩展和定制,如自定义拦截器、AOP代理等。这部分会介绍如何利用Spring的API进行扩展。 10. **最佳实践**:文档最后通常会提供一些最佳实践和常见问题...
7. **最佳实践**:在实际开发中,集成Struts2和Spring可以遵循一些最佳实践,例如使用注解进行配置以减少XML的复杂性,使用Spring的AOP处理事务,以及利用Spring的MVC支持来简化视图和模型的处理。 8. **测试与调试...
AOPAlliance是一个开源项目,旨在为不同的AOP实现提供一个共同的接口,以便于在不同的AOP框架之间共享代码和实现互操作性。它定义了一些基础的AOP接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aop...