Spring 学习记录 5
2014-10-22 15:44
204 查看
上篇介绍了 Spring 自动扫描 bean 的功能。
这篇将介绍 Spring 中的 AOP。
Spring 中的 AOP 功能有限,只能作用于函数。
我们还是讲一个故事。
从前,有一个勇敢的骑士,四处探险。
有一位忠心的吟游诗人跟随者他,赞美他。
我们发现了问题,骑士和吟游诗人的耦合度太低了。
如果骑士再次探险,我们必须要写3行代码。
这样,main 函数中的代码变得简洁了。
骑士再次探险也只需要1行代码了。
但是,Knight 类变得臃肿了。
骑士的责任应该就是探险,不应该负责指挥吟游诗人为他歌功颂德。
于是,我们可以使用 Spring 中的 AOP 了,让吟游诗人变得智能化。
首先是依赖
applicationContext 所需的配置文件,名字就叫 knight.xml
<aop:aspectj-autoproxy>标签将启用 AOP 注解。
所有类文件都在包 pack3 下。
个人对 AOP 没什么感触,所以就写这点啦。
这篇将介绍 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 没什么感触,所以就写这点啦。
相关文章推荐
- jqGrid分页技术学习(五)spring jdbc 通用DAO——修改一条记录
- spring.net 学习笔记之 AOP (异常记录实例)转
- Spring学习记录(Spring Securit)
- 记录我的Spring学习过程,大神勿看
- Spring学习记录(一)
- jqGrid分页技术学习(三)spring jdbc 通用DAO——添加一条记录
- Spring学习记录(2) Spring MVC+Mybatis 注解配置
- Spring 学习记录 6
- Spring 学习记录 4 扫描包
- spring学习笔记(点滴记录)
- spring security3学习记录
- maven学习记录2.2:spring-mvc.xml配置
- maven学习记录2.3:spring-mybatis.xml配置
- Spring学习记录一(SpringIOC容器初级)
- Spring 学习记录 冷兵器时代的故事
- jqGrid分页技术学习(六)spring jdbc 通用DAO——查询所有记录
- 记录Spring.net学习中遇到的各种问题
- Spring mvc ,spring ,ibatis 学习记录(2)
- spring AOP学习记录1
- spring-data-jpa 多条件查询 学习记录