`
zyl
  • 浏览: 486321 次
社区版块
存档分类
最新评论

spring aop 2.0 编程(二)一个实例

阅读更多

前面这是讲了许多的概念,下面以一个例子来说明:
一个很好理解的aop 例子,也就是日志服务。
先从aop第一种方式来实现,也就是xml配置方式
先创建基本的日志类:
public class Logger {

    private static Log log = LogFactory.getLog(Logger.class);

    public void entry(String message) {
        log.info(message);
    }
}
这里只是简单的一个方法,当然实际情况可能不同。
由于xml配置需要一个方面的实现bean
所以创建一个简单的bean :
public class LogBean {

    private Logger logger = new Logger();

    public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.entry("before invoke method:"
                     + joinPoint.getSignature().getName());
        Object object = joinPoint.proceed();
        logger.entry("after invoke method:"
                     + joinPoint.getSignature().getName());
        return object;
    }
}
这里采取简单的around advice,其他类型的advice 基本上都差不多

当然有了这两个核心的日志类,需要一个测试类,用于测试。
public class TestBean {

    public void method1() {
        System.out.println("in method1");
    }

    public void method2() {
        System.out.println("in method2");
    }
}
这就是需要测试的类了,需要记录日志的方法只有两个,这里用System.out.println,只是想显示方法的调用顺序。


然后关键的在于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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
 
 <aop:config>
    <!--  expression 表示要执行的匹配表达式,这里匹配所有的public方法,但是去除logger类的所有方法,防止无限调用-->

      <aop:pointcut id="loggableCalls"
          expression="execution(public * *(..)) and !execution(* org.spring.test.aop.log.Logger.*(..))"/>


  <aop:aspect id="logAspect" ref="logBean">
   <aop:around pointcut-ref="loggableCalls" method="aroundLogCalls"/>
  </aop:aspect>
 
 </aop:config>
 <bean id="logBean" class="org.spring.test.aop.log.LogBean" />
 <bean id="testBean" class="org.spring.test.aop.log.TestBean"/>
 
</beans>

现在写一个测试类:

public class LogXmlTest extends RootTest {

    @Override
    protected String getBeanXml() {
        return "org/spring/test/aop/log/bean.xml";
    }

    public void testLog() {
        TestBean bean = (TestBean) ctx.getBean("testBean");
        bean.method1();
        bean.method2();
    }

}

public abstract class RootTest extends TestCase {

    protected ApplicationContext  ctx;

    protected Log log = LogFactory.getLog(getClass());

    protected RootTest() {
        ctx = new ClassPathXmlApplicationContext(getBeanXml());
    }

    protected abstract String getBeanXml();

}

打印的消息如下:
2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - before invoke method:method1
in method1
2006-09-17 11:08:28,203 INFO [org.spring.test.aop.log.Logger] - after invoke method:method1
2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - before invoke method:method2
in method2
2006-09-17 11:08:28,218 INFO [org.spring.test.aop.log.Logger] - after invoke method:method2

第二种实现方式,采用注释方式:

Logger 类不变
创建一个LogAspect类
@Aspect
public class LogAspect {

    private Logger logger = new Logger();

    @Pointcut("execution(public * *(..))")
    public void publicMethods() {

    }

    @Pointcut("execution(* org.spring.test.aop.log.Logger.*(..))")
    public void logObjectCalls() {

    }

    @Pointcut("publicMethods()&&!logObjectCalls()")
    public void loggableCalls() {

    }

    @Around("loggableCalls()")
    public Object aroundLogCalls(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.entry("before invoke method:"
                     + joinPoint.getSignature().getName());
        Object object = joinPoint.proceed();
        logger.entry("after invoke method:"
                     + joinPoint.getSignature().getName());
        return object;
    }
}

配置文件就简单多了
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
 
 <aop:aspectj-autoproxy/>
 
 <!-- 或者使用以下定义
 
 
 
 <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
 
 -->
 <bean id="logAspect" class="org.spring.test.aop.log.LogAspect"/>
 <bean id="testBean" class="org.spring.test.aop.log.TestBean"/>
 
</beans>

测试类:
跟上面的差不多
把xml文件换掉就行

打印的方式差不多

个人还是比较喜欢第二种实现。 



分享到:
评论
1 楼 Ben.Sin 2008-08-29  
依照你的例子,但是我test的时候出现以下结果

我把class都放在package springapp.aop.log;

不知道那里除了问题,网赐教


2008-8-29 10:29:47 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@12d03f9: display name [org.springframework.context.support.ClassPathXmlApplicationContext@12d03f9]; startup date [Fri Aug 29 10:29:47 CST 2008]; root of context hierarchy
2008-8-29 10:29:47 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [springapp/aop/log/bean2.xml]
2008-8-29 10:29:48 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@12d03f9]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1d7ad1c
2008-8-29 10:29:48 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1d7ad1c: defining beans [org.springframework.aop.config.internalAutoProxyCreator,logAspect,testBean]; root of factory hierarchy
2008-8-29 10:29:48 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
信息: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1d7ad1c: defining beans [org.springframework.aop.config.internalAutoProxyCreator,logAspect,testBean]; root of factory hierarchy

相关推荐

    struts2.0与spring2.0集成实例

    Struts2.0是一个用于构建企业级Web应用程序的强大的MVC框架,而Spring2.0则是一个全面的Java应用框架,提供了包括DI、面向切面编程(AOP)、事务管理等在内的多种功能。将这两个框架集成可以充分利用它们各自的优势...

    spring 2.0使用AOP实例(基于Annotation的配置方式)

    以上就是Spring 2.0中使用AOP的一个基本实例,基于注解的配置方式使得AOP的使用更加直观和简洁。在实际开发中,我们可以根据需求灵活地定义切面和通知,以实现各种横切关注点的功能。 通过阅读提供的压缩包中的`src...

    Spring Framework 2.0开发参考手册(中文版chm)

    Spring作为一个轻量级、全面的企业级应用框架,为Java开发提供了强大的支持,尤其在依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,AOP)以及数据访问集成方面表现卓越。...

    spring 2.0使用AOP实例(基于XML的配置方式)

    本实例将探讨Spring 2.0版本中如何利用AOP(面向切面编程)来实现横切关注点的解耦。AOP是Spring框架的一个重要特性,它允许我们编写与业务逻辑无关的代码,如日志、事务管理、性能监控等,并在适当的时候自动插入到...

    Spring2.0整合Struts2.0

    **Spring 2.0** 是Spring框架的一个重要版本,引入了许多新特性,如支持JSR-250规范、改进的AOP支持、数据源管理以及对Java Persistence API (JPA)的支持。这一版本加强了Spring作为企业级应用基础架构容器的能力,...

    spring2.0学习源码

    Spring作为Java领域的主流框架,其2.0版本是一个重要的里程碑,引入了许多创新特性,提升了框架的灵活性和可扩展性。 在Spring 2.0中,最重要的更新之一是AOP(面向切面编程)的增强。这一版本引入了基于注解的AOP...

    Spring2.0 实例源码

    Spring框架是Java开发中广泛应用的一个开源框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)功能而著名。Spring2.0是该框架的一个重要版本,它在...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    spring 2.0中文参考手册

    Spring作为一个轻量级的Java企业级应用框架,以其模块化、松耦合的设计理念,已经成为现代Java开发中的基石。手册详细介绍了如何利用Spring来构建高效、可维护的软件系统,包括了Spring的IoC(Inversion of Control...

    java学习之spring2.0

    - **Spring 初探**:Spring的核心在于依赖注入(DI)和面向切面编程(AOP),提供了一个轻量级的容器来管理对象的生命周期和相互依赖关系。 - **Spring 体系**:包括Core Container(核心容器)、Data Access/...

    spring2.0核心技术最佳实践源代码

    1. **AOP(面向切面编程)**:Spring 2.0在AOP方面有着强大的支持,允许开发者创建和管理横切关注点,如日志、事务管理和安全性。AOP通过定义切点、通知和组装切面来实现代码解耦,提高可维护性。 2. **事务管理**...

    Spring2.0(一)第一个Spring程序、IoC的应用

    本文将深入探讨Spring 2.0的第一个程序以及IoC(Inversion of Control,控制反转)的应用。 Spring 2.0的发布标志着该框架的重大进步,它引入了对Java 5和Java EE 5的支持,增强了AOP(面向切面编程)功能,并且...

    struts1+spring2.0+ibatis整合实例

    Spring2.0则是一个全面的轻量级框架,提供依赖注入(DI)和面向切面编程(AOP),以及对其他框架的集成支持;而iBatis则是一个SQL映射框架,它将Java代码与SQL语句分离,使得数据库操作更为简洁和灵活。 在这个...

    廖雪峰 Spring 2.0 核心技术与最佳实践 高清扫描版

    教程会深入讨论Spring MVC的工作原理,包括处理器映射、视图解析、模型绑定等关键概念,并通过实际案例展示如何构建一个完整的Web应用。 除此之外,教程还会涵盖Spring 2.0的其他关键模块,如Spring的Messaging支持...

    spring 2.0 技术手册

    Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心理念,为开发者提供了简化复杂应用程序设计的强大工具。...

    Spring2.0

    综上所述,Spring 2.0是一个全面的框架,提供了从服务层到Web层的解决方案。通过依赖注入、面向切面编程、Java配置以及与其他框架的深度集成,Spring 2.0极大地简化了Java应用的开发和维护。提供的文档资源可以帮助...

    struts2+hibernate3.2+spring2.0配置+入门实例

    本文将详细介绍如何配置和构建一个基于Struts2、Hibernate3.2和Spring2.0的企业级Java应用入门实例。首先,我们理解整体架构,这有助于我们更好地了解各个组件的作用。 **1. 整体架构** 在企业级Java应用中,常见...

    jSF2.0与Spring整合实例+教程

    JSF 是一个用于构建用户界面的组件模型框架,而 Spring 则是一个全面的后端服务管理框架。将两者整合,可以实现从前端到后端的无缝衔接,提供强大的功能和灵活性。 **JSF 2.0 知识点:** 1. **组件模型**:JSF 2.0...

Global site tag (gtag.js) - Google Analytics