AOP采用Annotation声明方式

来源:互联网 发布:之知为知之不知为不知 编辑:程序博客网 时间:2024/06/06 04:17

AOP主要概念

**Cross Cutting Concern
是一种独立服务,它会遍布在系统的处理流程之中
**Aspect
对横切性关注点的模块化
**Advice
对横切性关注点的具体实现
**Pointcut(切入点)
它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用、
**JoinPoint(连接点)
Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持
**Weave(织入)
将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入
**Target Objec(目标)
Advice被应用的对象
**Proxy(代理)
Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
**Introduction
可以动态的为类添加方法

采用Annotation声明方式

引入jar包
* spring.jar
* log4j-1.2.14.jar
* commons-logging.jar
* aspectj/*.jar
建立userManger接口

package com.bjpowernode.spring;public interface UserManager {    public void addUser(String username, String password);    public void delUser(int userId);    public String findUserById(int userId);    public void modifyUser(int userId, String username, String password);}

建立 UserManagerImpl

package com.bjpowernode.spring;public class UserManagerImpl implements UserManager {    public void addUser(String username, String password) {        //checkSecurity();        System.out.println("---------UserManagerImpl.add()--------");    }    public void delUser(int userId) {        //checkSecurity();        System.out.println("---------UserManagerImpl.delUser()--------");    }    public String findUserById(int userId) {        //checkSecurity();        System.out.println("---------UserManagerImpl.findUserById()--------");        return "张三";    }    public void modifyUser(int userId, String username, String password) {        //checkSecurity();        System.out.println("---------UserManagerImpl.modifyUser()--------");    }//  private void checkSecurity() {//      System.out.println("-------checkSecurity-------");//  }}

SecurityHandler

import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;@Aspectpublic class SecurityHandler {    /**     * 定义Pointcut,Pointcut的名称为addAddMethod(),此方法没有返回值和参数     * 该方法就是一个标识,不进行调用     */    @Pointcut("execution(* add*(..))")    private void addAddMethod(){};    /**     * 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上     */    @Before("addAddMethod()")    //@After("addAddMethod()")    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">    <!-- 启用AspectJ对Annotation的支持 -->           <aop:aspectj-autoproxy/>               <!-- 目标类 -->    <bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>    <!-- 切面 -->    <bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/></beans>

Client

public class Client {    public static void main(String[] args) {        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");        //从Spring容器中获得        UserManager userManager = (UserManager)factory.getBean("userManager");        //执行        userManager.addUser("张三", "123");    }}

原创粉丝点击