`

Spring AOP 入门实例

阅读更多

AOP 面向切面,可以让我们在不修改业务代码的前提下,在业务代码执行前后进行执行相应的模块,这样,我们就可以把诸如日志的功能模块合核心业务模块分隔开来,以往的的日志做法都是由核心模块主动的调用日志记录功能,耦合性很强,使用AOP技术,可以将日志模块作为切面,插入到核心业务前执行,核心业务并不主动的调用日志记录功能

本例中使用GreetingHelloworldImpl代表核心业务模块,使用LoggerService代表作为aop实现的日志模块

核心业务并没有主动依赖日志模块

package SimpleAOPTest;

public interface GreetingHelloworld ...{
   public void sayHelloworld();
}


package SimpleAOPTest;

public class GreetingHelloworldImpl implements GreetingHelloworld ...{
   private String greetingText;
   private String greetingFromConstructor;
   public GreetingHelloworldImpl(String greetingFromConstructor)...{
       this.greetingFromConstructor=greetingFromConstructor;
   }
   public GreetingHelloworldImpl()...{
       
   }
    public String getGreetingText() ...{
       return greetingText;
   }
    public void setGreetingText(String greetingText) ...{
    this.greetingText = greetingText;
    }
    public void sayHelloworld() ...{
       System.out.println(this.getGreetingText());
       System.out.println(this.getGreetingFromConstructor());
    }
    public String getGreetingFromConstructor() ...{
        return greetingFromConstructor;
    }
    public void setGreetingFromConstructor(String greetingFromConstructor) ...{
        this.greetingFromConstructor = greetingFromConstructor;
    }

}

 日志模块:

package SimpleAOPTest;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class LoggerService implements MethodBeforeAdvice ...{
    public LoggerService()...{
        
    }
    public void before(Method method, Object[] obj, Object target)
            throws Throwable ...{
        System.out.println("this is info from LoggerService");
    }

}

 

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<beans>
 <bean id="greetingTarget" class="SimpleAOPTest.GreetingHelloworldImpl">
   <constructor-arg>
      <value>this is helloworld from construtor</value>
   </constructor-arg>
   <property name="greetingText">
     <value>hello world!</value>
   </property>
 </bean>
 
 <bean id="loggerService" class="SimpleAOPTest.LoggerService"></bean>
 <bean id="greeting" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="proxyInterfaces">
     <list>
       <value>SimpleAOPTest.GreetingHelloworld</value> <!-- 拦截GreetingHelloworld接口中的方法 -->
     </list>
   </property>
   <property name="interceptorNames">
     <list>
       <value>loggerService</value>  <!-- 处理loggerService请求,切入 -->  
     </list>
   </property>
       <property name="target">
      <ref bean="greetingTarget"/>  <!-- 然后处理greeting请求 -->
   </property>
   <!-- 代理目标为类时设置 
   <property name="proxyTargetClass"> 
     <value>true</value>
   </property>
  -->
  </bean>
  

</beans>

 测试代码:

package SimpleAOPTest;

import java.io.File;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;



public class TestHelloWorld ...{

    public static void main(String[] args) ...{

        String filePath=System.getProperty("user.dir")+File.separator+"SimpleAOPTest"+File.separator+"hello.xml";
        
        BeanFactory factory=new XmlBeanFactory(new FileSystemResource(filePath));
        
        
        
        //代理目标为接口时使用
        GreetingHelloworld greetingSerview=(GreetingHelloworld)factory.getBean("greeting");
        //代理目标为类是使用,并配置xml中proxyTargetClass,需要CGLIB包
        //<property name="proxyTargetClass"> 
        //<value>true</value>
        //</property>
        //GreetingHelloworldImpl greetingSerview=(GreetingHelloworldImpl)factory.getBean("greeting");
        greetingSerview.sayHelloworld();

    }
}

 运行结果:

2007-5-14 23:13:47 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from file [E:\项目\SpringInActionStudy\SimpleAOPTest\hello.xml]
this is info from LoggerService
hello world!
this is helloworld from construtor

可以看到,日志模块打印的信息“this is info from LoggerService”在核心业务运行之前执行了,这样,我们就算对日至模块进行天翻地覆的变化,都不会影响我们的核心业务

 

分享到:
评论

相关推荐

    spring AOP入门实例

    在这个入门实例中,我们将深入理解Spring AOP如何实现简单日志记录。 首先,AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入(Weaving)。切面是AOP中的核心...

    Spring AOP 入门实例1

    以下是一个简单的Spring AOP入门实例步骤: 1. 首先,定义一个切面类,包含通知方法。例如,一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example*...

    Spring AOP入门及其实例讲解、下载

    **Spring AOP 入门及其实例讲解** 在软件开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在提高代码的可重用性,减少冗余,并将关注点分离。Spring框架是Java开发中的一个流行...

    spring2-aop入门实例教程

    ### Spring2-AOP入门实例教程知识点详解 #### 一、Spring框架概述 - **轻量级J2EE开发框架**:Spring是一个轻量级的Java应用框架,它为开发复杂的企业级应用提供了一种简化的方法。 - **发展历程**:自2002年发布...

    Spring AOP 入门作者:廖雪峰

    ### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个关键特性,它为开发者提供了在运行时动态添加代码(即横切关注点或切面)到已有...

    最简单的SpringAOP入门案例

    本教程将通过一个简单的Spring AOP入门案例,帮助初学者理解这一概念。 ### 一、AOP基础 1. **切面(Aspect)**:切面是关注点的模块化,它封装了跨越多个对象的行为或数据。在Spring AOP中,切面可以由一个类定义...

    Spring AOP @AspectJ 入门实例

    本实例将带你深入理解并实践Spring AOP与@AspectJ的结合使用。 首先,了解AOP的基本概念。面向切面编程是一种编程范式,它允许程序员定义“切面”,即跨越多个对象的行为或责任。这些切面可以包含业务逻辑、日志、...

    spring AOP 实例(@AspectJ)

    一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......

    一个Spring的入门实例;一个Struts的入门实例

    以上就是 Spring 和 Struts 的基础概念及入门实例的创建流程。这两个框架各有优势,Spring 更注重模块化和灵活性,而 Struts 则更侧重于 MVC 结构的实现。在实际项目中,两者常被一起使用,形成所谓的“Spring + ...

    Spring -Aop入门

    ### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP (Aspect Oriented Programming) 是一种面向切面编程的技术,在Spring框架中得到了良好的支持。通过这种方式,开发者可以更加灵活地组织代码,使得...

    springAOP-dome

    在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...

    Spring_02_入门篇_AOP_简单实例

    **Spring AOP 入门篇:面向切面编程的注解与XML模式** 在软件开发中,Spring框架因其强大的功能和灵活性而广受欢迎,尤其是在企业级应用开发中。本教程将深入探讨Spring中的核心概念之一——面向切面编程(Aspect-...

    Jersey2.13+spring3.2.3入门实例

    ** Jersey2.13 + Spring3.2.3入门实例详解** 本文将深入探讨如何结合Jersey 2.13和Spring 3.2.3框架构建一个入门级的Web服务应用。首先,我们来了解这两个关键组件的核心功能。 **Jersey** 是Java语言中最流行的...

    spring AOP 例子参考

    本教程将深入探讨Spring AOP的概念、工作原理以及如何通过实例来理解和应用这一技术。 **一、Spring AOP基本概念** 1. **切面(Aspect)**:切面是关注点的模块化,例如日志、事务管理。在Spring AOP中,切面由...

    spring入门实例

    在这个"spring入门实例"中,我们将探索如何利用Spring和Spring JDBC构建一个简单的登录模块。 首先,我们需要理解Spring框架的基础概念。Spring框架的核心在于IoC(Inversion of Control,控制反转)和DI...

    spring菜鸟入门经典实例

    在Spring入门阶段,首先要理解的是依赖注入(DI)。DI是一种设计模式,它允许我们解耦组件,让它们之间通过接口而非具体的实现进行交互。Spring通过容器管理对象的生命周期和依赖关系,我们只需要配置好bean的定义,...

Global site tag (gtag.js) - Google Analytics