zoukankan      html  css  js  c++  java
  • Spring【AOP】

        AOPOOP的延续,是软件开发中的一个热点


        AOP技术,OOP补充。

    OOP引入封装。继承和多态建立一种对象层次结构模拟公共行为集合,而对从左到右的关系则显得无能为力。对于AOP则恰恰适应这样的横切技术。


        简单说。就与业务无关。却为了业务模块所共同调用的逻辑封装起来,便于降低系统反复代码,降低模块间耦合度。利用维护和可操作性


        横切技术将软分为两部分:核心关注点和横切关注点:业务处理流程为核心关注,与之关系不大的是横切关注。

    如:系统中各处都相似的日志,事务。权限成为横切关注点。AOP作用是将核心点与横切点分开。


       实现的一些技术点有:

    Aspect:横切关注点的模块,表示在哪里做和做什么(一个类,是advicepoint的结合)

    Advice:表示做什么

    Point:是joinpoint的集合,表示在哪里做的集合

    Jointpoint:程序运行的一个精确点,比如类的一个方法,是抽象的概念,不一定要定义一个joinpoint


       没有aspect:我们怎样设计系统。如模拟一个系统模块中某个方法

     

    //BusinessLogic属于核心关注点,它会调用到Security,Logging。Persistence等横切关注点。
    public classBusinessLogic
    {
        public void SomeOperation()
        {
           //验证安全性;Securtity关注点;
           //运行前记录日志;Logging关注点。
     
           DoSomething();
     
           //保存逻辑运算后的数据;Persistence关注点。
           //运行结束记录日志。Logging关注点;
        }
    }
     

    差点儿每一个业务方法都是这样,反复性太大。AOP的目的,就是将注入logging之类的横切关注点从bussinessz中分类。

    形成单独的Aspect


    这就保证了横切关注点的复用。因为BusinessLogic类中不再包括横切关注点的逻辑代码。为达到调用横切关注点的目的,能够利用横切技术,截取BusinessLogic类中相关方法的消息,比如SomeOperation()方法,然后将这些“aspect”织入到该方法中

     

       AOP代码实现对加入做权限验证和日志效果。此为annotation实现注解


    1  定义eao接口

    packagecom.bjpower.node.spring.dao;
    public interfaceIUserDao {
     
    publicvoid addUser(String username, String password);
    }

      实现类

    package com.bjpower.node.spring.dao;
    
    public class UserDaoOracle implements IUserDao {
    
    	@Override
    	public void addUser(String username, String password) {
    		// TODO Auto-generated method stub
    		System.out.println("----------userDalOral.adduser--------");
    	}
    

    2  manager接口

    package com.bjpower.node.spring.manager;
    
    public interface UserManager {
    
    	public void addUser (String username, String password);
    }
    

      manager实现类

    package com.bjpower.node.spring.manager;
    
    import com.bjpower.node.spring.dao.IUserDao;
    import com.bjpower.node.spring.dao.UserDaoOracle;
    
    public class UserManagerImp implements UserManager {
    
    	public void addUser(String username, String password) {
    		userDao.addUser(username, password);
    	}
    
    	private IUserDao userDao;
    
    	public void setUserDao(IUserDao userDao) {
    		this.userDao = userDao;
    	}
    
    	///set方法的默认配置
    	public UserManagerImp() {
    	}
    
    }
    

    3  建立横切对象


    3.1引入依赖包spring.jar ,log4j.jar commons-logging.jar aspectj.jar

    3.2建立aspect横切类

    3.3注解定义pointcutadvice

    package com.bjpower.node.spring;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    
    @Aspect
    public class SecurityHandler {
    
    //advice要指定范围,pointcut为该范围指定用在哪里
    	@Pointcut("execution(* add*(..)) )")
    	private void addAddMethod(){};
    	
    	/***
    	  * before指定advice的方式
    	 * @param joinPoint 获取截获的方法和參数
    	 */
    	@Before("addAddMethod()")
    	//joinpoint为横切获取客户信息
    	private void checkSecurity(JoinPoint joinPoint){
    		for (int i = 0; i<joinPoint.getArgs().length;i++) {
    			System.out.println(joinPoint.getArgs()[i]);
    		}
    		System.out.println(joinPoint.getSignature().getName());
    		System.out.println("----------checkSecurity----");
    	}
    
    }

    "execution(* add*(..)) )为查询表达式

    第一个*为返回值,

    第二个參数为拦截的方法名称。能够有模糊匹配,也能够指定某个类或某个包。若不指定则拦截全部包

    第三个參数(..)第一个点号为參数,第二个是匹配

     

    3.4xml文件配置

    <!--开启注解-->
    <aop:aspectj-autoproxy/>
    <beanid="userDalOracle"class="com.bjpower.node.spring.dao.UserDaoOracle" />
    <beanid="userManager"class="com.bjpower.node.spring.manager.UserManagerImp">
    <!-- 描写叙述set方法 -->
    <propertyname="userDao" ref="userDalOracle"></property>
    </bean>
    <!--引入横切类-->
    <beanid="securityHandler"class="com.bjpower.node.spring.SecurityHandler" />
    <!--========================= ASPECT CONFIGURATION ======================== -->

    4  client的调用

    package com.bjpower.node.spring.client;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.bjpower.node.spring.dao.UserDaoMysql;
    import com.bjpower.node.spring.manager.UserManager;
    import com.bjpower.node.spring.manager.UserManagerImp;
    
    public class Client {
    
    	public static void main(String[] args) {
    	
    	  BeanFactory  factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    	  UserManager userManager=(UserManager) factory.getBean("userManager");
    	  userManager.addUser("hanhan", "passowrd");}
    
    }
    

    拦截到的效果为下面打印,达到了在方法运行前对其进行检查的效果。


    hanhan

    passowrd

    方法名称为 = addUser

    ----------checkSecurity----

     

    小结: 


    整体上aop降低了我们同样代码量,节省了时间,同一时候使得我们仅仅须要关注核心业务,建立了松耦合,可复多功能性。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    ADLINK 8158控制程序-连续运动(VB.NET)
    .NET通信中的同步和异步处理
    Java 数据类型转换(转换成字节型)
    matlab中的三维坐标系与旋转
    maya和Unity中的坐标系旋转
    Android Volley完全解析(一),初识Volley的基本用法
    基于VLC的视频播放器(转载)
    android超快模拟器Ggenymotion的安装和配置
    真机在wifi下调试android程序
    Android图片异步加载框架Android-Universal-Image-Loader
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4716475.html
Copyright © 2011-2022 走看看