Spring入门(二)——理解spring的AOP编程
来源:互联网 发布:福州大学软件学院 编辑:程序博客网 时间:2024/06/07 07:37
【前言】
AOP的编程思想在以前的项目中接触,它弥补了面向对象编程OO的不足,除了类之外,AOP提供了切面,将关注点进行模块化作为一种独立的服务横向“插入”到项目中去。
【内容】
1.spring的AOP:
提供声明式企业服务,最重要的服务是:声明性事务管理,允许用户实现自定义的切面,用AOP来完善了OOP的使用。
2.AOP的切面术语:
♤切面:(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中的一个横切关注点的很好的例子。
♤连接点(Joinpoint):在程序运行的某一个特定的点,比如说某方法调用或者处理异常的时候。在spring AOP中,一个连接点代表一个方法的执行。
♤通知(Advice):在切面的某个特定的点(joinpoint)上执行的动作,通知的类型包括了“around”“before”和“after”等通知。
♤切入点(PointCut):匹配连接点的断言。通知和一个切入表达式相连,并在满足这个切入点的连接点上执行。
备注: 切入点表达式如何和连接点匹配是AOP的核心。
♤引入(Introduction):声明额外的方法或者是某一个类型的字段
♤目标对象(target Object):被一个或者多个切面(aspect)所通知的(advise)对象。
♤ AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)
♤织入(Weaving):把切面(aspect)链接到其他应用程序类型或者对象上。并创建一个被通知的对象。
3.AOP术语之间的关系:
** 4.实现addUser的checkSecurity验证简单例子:**
☆ 采用annotation创建AOP
UserManager接口定义了方法addUser
package com.cyl.spring;public interface UserManager { public void addUser(String username,String password);}
UserManagerImp1类实现了接口UserManager
package com.cyl.spring;public class UserManagerImp1 implements UserManager { @Override public void addUser(String username, String password) { System.out.println("add()"); }}
切面SecurityHandler定义了pointcut,advice
package com.cyl.spring;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;@Aspect //加入注解,声明是模块化public class SecurityHandler { /** * 定义pointcut,pointcut的名称为addAddmethod(),此方法没有返回值和参数 * 该方式就是一个标识,不进行调用 */ @Pointcut("execution(* add*(..))") private void addAddMethod(){}; //声明它是advice,在之前还是之后使用; /* * 定义advice,表示我们的advice应用到那些pointcut订阅的joinpoint上 */ @Before ("addAddMethod()") private void checkSecurity(){ System.out.println("-------------checkSecurity-------------"); }}
applicationContext.xml 启用aspect对annotation的支持:
<?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:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 启用aspect对annotation的支持 --> <aop:aspectj-autoproxy/> <bean id="userManager" class="com.cyl.spring.UserManagerImp1"></bean> <bean id="SecurityHandler" class="com.cyl.spring.SecurityHandler"></bean></beans>
Client端:
package com.cyl.spring;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client { public static void main(String [] args){ BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager=(UserManager)factory.getBean("userManager"); userManager.addUser("张三", "123"); }}
☆采用配置文件的方式:主要的变化是切面SecurityHandler和applicationContext.xml
切面SecurityHandler只进行模块化,看起来类似一个普通的类:
package com.cyl.spring;public class SecurityHandler { private void checkSecurity(){ System.out.println("-------------checkSecurity-------------"); }}
applicationContext.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:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 启用aspect对annotation的支持 --> <aop:aspectj-autoproxy/> <bean id="userManager" class="com.cyl.spring.UserManagerImp1"></bean> <bean id="SecurityHandler" class="com.cyl.spring.SecurityHandler"></bean> <aop:config> <aop:aspect id="securityAspect" ref="SecurityHandler"> <!-- 以add的方法起作用 --> <aop:pointcut id="addAddMethod" expression="execution(* add*(..))"/> <!-- 在执行add方法前执行方法 checkSecurity--> <aop:before method="checkSecurity" pointcut-ref="addAddMethod"/> </aop:aspect> </aop:config></beans>
@AspectJ和xml,xml仅仅支持singleton切面实例模型,并且在xml中不能组合命名连接点的声明。所以@AspectJ更加丰富。总之使用@AspectJ适用更多的情况。
【总结】
AOP编程简单介绍到这里,小编也在逐步的深入,希望可以加深你对AOP编程的了解!
- Spring入门(二)——理解spring的AOP编程
- [Spring] Spring AOP编程理解
- spring aop编程(二)
- 【spring系列】(1)——对于面向切面编程(AOP)的理解
- Tiny-Spring源码阅读(二)、AOP部分的理解
- Spring AOP的实现——对AOP的理解
- Spring学习笔记(二)AOP入门
- Spring之AOP入门(二)
- spring aop的理解
- Spring AOP的理解
- spring 的AOP 理解
- Spring AOP的理解
- Spring AOP的理解
- 5、spring 入门—Spring AOP基本概念
- spring aop入门(序列二)
- Spring AOP实践(二)编程篇
- Spring AOP之二 ——AOP的实现方式
- 【Spring】Spring的AOP编程
- 将博客搬至CSDN
- 51Nod1116 K进制下的大数(思维)
- 用R实现一个简单的感知机
- poj2388Who's in the Middle(快速排序)
- [bzoj1057][ZJOI2007]棋盘制作
- Spring入门(二)——理解spring的AOP编程
- 第二十二讲项目1-翻转数组
- 【阶段小结】库房管理需求敲定
- ACM-并查集- How Many Tables-HDU
- Java经典设计模式之十一种行为型模式(附实例和详解)
- Android使用友盟集成QQ、微信、微博等第三方登录
- 自定义分页功能的实现代码
- 05.18 nginx之web服务
- 华为机试:合法IP、字串的连接最长路径查找