您的位置:首页 > 编程语言 > Java开发

Spring 学习记录 5

2014-10-22 15:44 204 查看
上篇介绍了 Spring 自动扫描 bean 的功能。

这篇将介绍 Spring 中的 AOP。

Spring 中的 AOP 功能有限,只能作用于函数。

我们还是讲一个故事。

从前,有一个勇敢的骑士,四处探险。

有一位忠心的吟游诗人跟随者他,赞美他。

版本1

public class Knight {

    public void quest() {
        System.out.println("Knight is questing!");
    }

}
public class Minstrel {

    public void singBeforeQuest(){
        System.out.println("Fa la la; The knight is so brave!");
    }

    public void singAfterQuest(){
        System.out.println("How brave he is!!");
    }

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

        Knight knight =new Knight();
        Minstrel minstrel = new Minstrel();
        minstrel.singBeforeQuest();
        knight.quest();
        minstrel.singAfterQuest();
    }


我们发现了问题,骑士和吟游诗人的耦合度太低了。
如果骑士再次探险,我们必须要写3行代码。

版本2

public class Knight {

    private Minstrel minstrel;

    public Knight(Minstrel minstrel) {

        this.minstrel = minstrel;
    }

    public void quest() {

        minstrel.singBeforeQuest();
        System.out.println("Knight is questing!");
        minstrel.singAfterQuest();
    }

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

        Knight knight = new Knight(new Minstrel());
        knight.quest();
    }


这样,main 函数中的代码变得简洁了。
骑士再次探险也只需要1行代码了。

但是,Knight 类变得臃肿了。
骑士的责任应该就是探险,不应该负责指挥吟游诗人为他歌功颂德。

于是,我们可以使用 Spring 中的 AOP 了,让吟游诗人变得智能化。

首先是依赖
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>

        <!-- aop 注解需要引入的包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.9</version>
        </dependency>

    </dependencies>


applicationContext 所需的配置文件,名字就叫 knight.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd        http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 
    <aop:aspectj-autoproxy/>
    <context:component-scan base-package="pack3"/>

</beans>


<aop:aspectj-autoproxy>标签将启用 AOP 注解。
所有类文件都在包 pack3 下。

版本3

@Component("kn")
public class Knight { public void quest() { System.out.println("Knight is questing!"); } }
@Aspect
@Component
public class Minstrel {

    @Before("execution(void pack3.Knight.quest())")
    public void singBeforeQuest(){
        System.out.println("Fa la la; The knight is so brave!");
    }

    @AfterReturning("execution(void pack3.Knight.quest())")
    public void singAfterQuest(){
        System.out.println("How brave he is!!");
    }

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

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("knight.xml");
        Knight knight = (Knight) applicationContext.getBean("kn");
        knight.quest();
    }


个人对 AOP 没什么感触,所以就写这点啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: