首页 > 技术文章 > Spring的AOP浅尝

fantiantian 2014-04-10 13:24 原文

  项目中使用到了Spring,写了一个简单的例子,跟大家分享一下,由于自己写东西,所以在技术选择上充分自由,虽然对于Spring的利弊众说纷纭,我也不能评判,反正我是尝试用了,记得在上学时候老师讲Spring的时候给出的几个关键点是,控制反转(IOC),和依赖注入。这些概念真的是让人望而却步。所以上学的时候关于这部分内容就基本忽略了。我的浅见是Spring有自己的反射机制,能够将开发者配置到配置文件中的类实例化。

  我写的内容就是通过注入的方式实现一个Hello的功能,然后在通过aop的方式来实现一些上下文的铺垫,使用的是Spring3.0,下面看一下代码,首先我定义了一个ISayHello类,内容如下:

package spring_test;

public interface ISayHello {
    public void sayHello();
}

  在定义两个类分别继承ISayHello接口,实现sayHello方法,AmericaSay,ChineseSay内容分别如下:  

package spring_test;

public class AmericaSay implements ISayHello {

    @Override
    public void sayHello() {
        System.out.println("Hello");
    }

}

  

package spring_test;

public class ChineseSay implements ISayHello {

    @Override
    public void sayHello() {
        System.out.println("你好");
    }

}

  然后在定一个映射类,用来获取在配置文件中获取到的对象:  

package spring_test;

public class PeopleSayHello {
    public ISayHello iSayHello;

    public ISayHello getiSayHello() {
        return iSayHello;
    }

    public void setiSayHello(ISayHello iSayHello) {
        this.iSayHello = iSayHello;
    }

    public void SayHello() {
        iSayHello.sayHello();
    }
}

  OK,准备工作做完了,下面也就是最重要的部分,如何在配置文件中配置Bean:  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="  
            http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="ChineseSayBean " class="spring_test.ChineseSay"></bean>
    <bean id="SayHelloBean" class="spring_test.PeopleSayHello">
        <property name="iSayHello" ref="ChineseSayBean"></property>
    </bean>
</beans>

  现在准备工作都完成了,下面该是如何让这些准备工作实现价值的时候了:  

package spring_test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Spring_001_main {
    public static void main(String[] arg) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "sayHello.xml");
        PeopleSayHello s = (PeopleSayHello) ctx.getBean("SayHelloBean");
        s.SayHello();
    }
}

 

  运行结果:输出您好。感觉有些突兀,我们在给他添加一些铺垫,在输出你好之前,和你好之后在加一些内容,我们通过aop来实现,首先需要将配置文件中加上aop的约束,以及切片的定义。关于切片大家可以了解一下:http://shouce.jb51.net/spring/aop.html  

<?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-3.0.xsd  
            http://www.springframework.org/schema/aop  
            http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
    <bean id="HostBean" class="spring_test.aop.Host"></bean>
    <bean id="ChineseSayBean " class="spring_test.ChineseSay"></bean>
    <bean id="SayHelloBean" class="spring_test.PeopleSayHello">
        <property name="iSayHello" ref="ChineseSayBean"></property>
    </bean>

    <aop:config>
        <aop:aspect id="HostAspect" ref="HostBean">
            <aop:pointcut id="sayhello"
                expression="execution(* spring_test.ChineseSay.*(..))" />
            <aop:before method="doBefore" pointcut-ref="sayhello" />
            <aop:after method="doAfter" pointcut-ref="sayhello" />
        </aop:aspect>
    </aop:config>
</beans>

   上面这段话的简单解释就是定义一个切面HostAspect,该切面引用HostBean,就是要调用HostBean指向类中的方法,在切面中有个切入点sayhello,在切入点sayhello有前置通知和后置通知,分别调用doBefore和doAfter方法。

,,下面就是在不敢变源代码的接触上加上主持人的角色和任务,在同学上台之前,由主持人引荐,在发言人下台之后,主持人送一下,下面就是添加的主持人的角色:  

package spring_test.aop;

import org.aspectj.lang.JoinPoint;

public class Host {
    public void doBefore(JoinPoint jp) {
        System.out.println("欢迎下一位同学发言,鼓掌:papapapapapa");
    }

    public void doAfter(JoinPoint jp) {
        System.out.println("谢谢同学的发言,再次把掌声送给他,papappapapa");
    }
}

  OK,我们要实现的功能已经完成了,你信不,很方便。看一下执行结果:  

欢迎下一位同学发言,鼓掌:papapapapapa
你好,我是雷锋,请多多照顾
谢谢同学的发言,再次把掌声送给他,papappapapa

  很简单的一个功能,可以下载我的demo,实现这个功能以后大家就可以想想关于过滤器啊,拦截器这一类功能也可以通过这种方法来完成。

  

 

  下载地址:

  https://files.cnblogs.com/fantiantian/javatest.rar

 

spring相关的jar文件可以从一下地址下载:

http://s3.amazonaws.com/dist.springframework.org/release/SPR/spring-framework-3.0.2.RELEASE.zip

http://s3.amazonaws.com/dist.springframework.org/release/SPR/spring-framework-3.0.2.RELEASE-dependencies.zip

 

推荐阅读