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编程的了解!