Spring入门(二)——理解spring的AOP编程

【前言】

 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编程的了解!
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值