zoukankan      html  css  js  c++  java
  • Spring的AOP浅尝

      项目中使用到了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,实现这个功能以后大家就可以想想关于过滤器啊,拦截器这一类功能也可以通过这种方法来完成。

      

      下载地址:

      http://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

  • 相关阅读:
    运算符的方向--好神奇
    a++ 和 ++a ;
    c语言中!和~的区别
    函数的参数,参数为数组
    反射的理解
    ThreadLocal类
    多线程面试题-sleep()和wait()区别
    话题1-关键字
    实现多线程的另一种方式-Callable
    线程池
  • 原文地址:https://www.cnblogs.com/fantiantian/p/3654837.html
Copyright © 2011-2022 走看看