Spring学习之第一个AOP程序
IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP)。 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP 最大问题就是无法解耦组件进行开发,比如我们上边举例,而 AOP 就是为了克服这个问题而出现的,它来进行这种耦合的分离。AOP 为开发者提供一种进行横切关注点(比如日志关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。 1、AOP基本概念
?Spring有哪些通知类型呢?
在 AOP 中,通过切入点选择目标对象的连接点,然后在目标对象的相应连接点处织入通知,而切入点和通知就是切面(横切关注点),而在目标对象连接点处应用切面的实现方式是通过 AOP 代理对象,如图所示。 ?2、AOP的HelloWorld程序AOP代理就是 AOP框架通过代理模式创建的对象,Spring使用 JDK动态代理或 CGLIB代理来实现, Spring 缺省使用 JDK 动态代理来实现,从而任何接口都可被代理,如果被代理的对象实现不是接口将默认使用 CGLIB 代理,不过 CGLIB 代理当然也可应用到接口。AOP 代理的目的就是将切面织入到目标对象。 新建工程,导入Spring中对应的包,最后引入的jar包如下所示(有些包spring的lib下没有,需要另外下载): (1)定义目标接口 package com.log; public interface IHelloWorldService { public void sayHello(); } (2)定义目标接口实现类 package com.log; public class HelloWorldService implements IHelloWorldService { @Override public void sayHello() { System.out.println("---hello world---"); } } (3)定义切面支持类 package com.log; public class HelloWorldAspect { public void beforeAdvice() { System.out.println("---before advice---"); } public void afterAdvice() { System.out.println("---after advice---"); } } (4)在XML中进行配置 <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-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <!-- 配置目标类 --> <bean id="helloWorldService" class="com.log.HelloWorldService"/> <!-- 配置切面 --> <bean id="aspect" class="com.log.HelloWorldAspect"/> <aop:config> <aop:pointcut id="pointcut" expression="execution(* com.log..*.*(..))"/> <!-- aop:aspect的ref引用切面支持类的方法 --> <aop:aspect ref="aspect"> <aop:before pointcut-ref="pointcut" method="beforeAdvice"/> <aop:after pointcut-ref="pointcut" method="afterAdvice"/> </aop:aspect> </aop:config> </beans> 切入点使用<aop:config>标签下的<aop:pointcut>配置, expression属性用于定义切入点模式,默认是AspectJ语法,“ execution(* cn.javass..*.*(..))”表示匹配cn.javass包及子包下的任何方法执行。关于expression属性如何配置请点击:expression配置 切面使用<aop:config>标签下的<aop:aspect>标签配置,其中“ ref”用来引用切面支持类的方法。 (5)测试运行 package com.log; import org.springframework.context.ApplicationContext; org.springframework.context.support.ClassPathXmlApplicationContext; public class AopTest { static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("aopBean.xml"); IHelloWorldService hello = context.getBean("helloWorldService",IHelloWorldService.); hello.sayHello(); HelloWorldAspect advice = context.getBean("aspect",HelloWorldAspect.); advice.beforeAdvice(); } } (6)输出结果 ? ? 参考资料1、跟我学SpringMVC目录汇总贴、PDF下载、源码下载 2、Spring学习之第一个hello world程序 (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |