zoukankan      html  css  js  c++  java
  • Spring AOP应用实例demo


    AOPAspect-Oriented Programming。面向方面编程)。能够说是OOPObject-OrientedPrograming。面向对象编程)的补充和完好。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。


    OOP的问题,AOP的补充


    当我们须要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP同意你定义从上到下的关系,但并不适合定义从左到右的关系。

    比如日志功能。日志代码往往水平地散布在全部对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其它类型的代码,如安全性、异常处理和透明的持续性也是如此。这样的散布在各处的无关的代码被称为横切(cross-cutting)代码。在OOP设计中,它导致了大量代码的反复,而不利于各个模块的重用。

     

    所谓“方面”,简单地说,就是将那些与业务无关。却为业务模块所共同调用的逻辑或责任封装起来。便于降低系统的反复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

     

    Spring中对 AOP的支持

     

    Spring AOP代理由Spring IoC容器负责生成、管理,其依赖关系也由 IoC容器负责管理。因此,AOP代理能够直接使用容器中的其它 Bean实例作为目标,这样的关系可由 IoC容器的依赖注入提供。Spring默认使用 Java动态代理来创建AOP代理。这样就能够为不论什么接口实例创建代理了。当须要代理的类不是代理接口的时候, Spring自己主动会切换为使用 CGLIB代理,也可强制使用 CGLIB


    程序猿參与部分 


    AOP编程事实上是非常easy的事情。

    纵观 AOP编程,当中须要程序猿參与的仅仅有三个部分:

     

       定义普通业务组件。

       定义切入点,一个切入点可能横切多个业务组件。

       定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作。

     

    所以进行 AOP编程的关键就是定义切入点和定义增强处理。一旦定义了合适的切入点和增强处理,AOP框架将会自己主动生成AOP代理。即:代理对象的方法 =增强处理 +被代理对象的方法。

     

    Spring中使用方式:

     

    基于 Annotation的“零配置”方式。

     

    1)启动注解。配置文件applicationContext.xml

    <!-- 启动对@AspectJ注解的支持 -->     
    <aop:aspectj-autoproxy/>
    
    <bean id="user" class="com.tgb.spring.aop.IUserImpl"/>
    
    <bean id="check" class="com.tgb.spring.aop.CheckUser"/>

    2)编写切面类

    package com.tgb.spring.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    
    @Aspect 
    public class CheckUser {
    
    	@Pointcut("execution(* com.tgb.spring.aop.*.find*(..))")
    	public void checkUser(){
    		System.out.println("**************The System is Searching Information For You****************");
    	}
    	
    	@Pointcut("execution(* com.tgb.spring.aop.*.add*(..))")
    	public void checkAdd(){
    		System.out.println("**************<< Add User >> Checking.....***************");
    	}
    	
    	@Before("checkUser()")
    	public void beforeCheck(){
    		System.out.println(">>>>>>>> 准备搜查用户..........");
    	}
    	
    	@After("checkUser()")
    	public void afterCheck(){
    		System.out.println(">>>>>>>> 搜查用户完成..........");
    	}
    
    	@Before("checkAdd()")
    	public void beforeAdd(){
    		System.out.println(">>>>>>>> 添加用户--检查ing..........");
    	}
    	
    	@After("checkAdd()")
    	public void afterAdd(){
    		System.out.println(">>>>>>>> 添加用户--检查完成!

    未发现异常!.........."); } //声明围绕通知 @Around("checkUser()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入方法---围绕通知"); Object o = pjp.proceed(); System.out.println("退出方法---围绕通知"); return o; } }

    3)定义接口

    package com.tgb.spring.aop;
    
    public interface IUser {
    
    	public String findUser(String username);
    	public void addUser(String username);
    	public void findAll();
    }

    4)定义实现

    package com.tgb.spring.aop;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class IUserImpl implements IUser {
    
    	public static Map map = null;
    	public static void init(){
    		String[] list = {"Lucy", "Tom", "小明", "Smith", "Hello"};
    		Map tmp = new HashMap();
    		for(int i=0; i<list.length; i++){
    			tmp.put(list[i], list[i]+"00");
    		}
    		map = tmp;
    	}
    	public void addUser(String username) {
    		init();
    		map.put(username, username+"11");
    		System.out.println("--------------【addUser】: "+username+" --------------");
    		System.out.println("【The new List:"+map+"】");
    	}
    
    	public void findAll() {
    		init();
    		System.out.println("---------------【findAll】: "+map+" ------------------");
    	}
    
    	public String findUser(String username) {
    		init();
    		String password = "没查到该用户";
    		if(map.containsKey(username)){
    			password = map.get(username).toString();
    		}
    		System.out.println("-----------------【findUser】-----------------");
    		System.out.println("-----------------Username:"+username+"-----------------");
    		System.out.println("-----------------【Result】:"+password+"------------------");
    		return password;
    		
    	}
    
    }

    5)測试

    public class Test {
    	
    	public static void main(String as[]){
    		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
    		IUser user = (IUser) factory.getBean("user");
    		user.findAll();
    		
    		User u = new User();
    //		u.setUsername("Tom");
    //		user.findUser(u.getUsername());
    		
    		/*u.setUsername("haha");
    		user.addUser(u.getUsername());*/
    	}
    }

    运行结果:

     

    进入方法---围绕通知

    >>>>>>>>准备搜查用户..........

    ---------------【findAll】: {Smith=Smith00, Tom=Tom00, 小明=小明00, Lucy=Lucy00,Hello=Hello00} ------------------

    退出方法---围绕通知

    >>>>>>>> 搜查用户完成..........

     

    注:@Before是在所拦截方法运行之前运行一段逻辑。@After是在所拦截方法运行之后运行一段逻辑。@Around是能够同一时候在所拦截方法的前后运行一段逻辑。

     

    以上是针对注解的方式来实现。那么配置文件也一样,仅仅须要在applicationContext.xml中加入例如以下代码:

    <!--  <aop:config>
    		<aop:pointcut id="find" expression="execution(* com.tgb.spring.aop.*.find*(..))" />
    		<aop:pointcut id="add" 	expression="execution(* com.tgb.spring.aop.*.add*(..))" />
    		
    		<aop:aspect id="checkUser" ref="check">
    			<aop:before method="beforeCheck" pointcut-ref="find"/>
    			<aop:after method="afterCheck" pointcut-ref="find"/>
    		</aop:aspect>
    		
    		<aop:aspect id="checkAdd" ref="check">
    			<aop:before method="beforeAdd" pointcut-ref="add"/>
    			<aop:after method="afterAdd" pointcut-ref="add"/>
    		</aop:aspect>
    	
    	</aop:config>-->

    总结:

     

    以上是简介了一下怎样使用Spring AOP,在使用的过程中也加深我们对AOP思想的理解。事实上AOP就是要我们实现热插拔效果,下篇会继续介绍Spring AOP的实现原理。

     

    附:在使用过程中注意JDK版本号与易用的aspectJrt的版本号问题




  • 相关阅读:
    HDU 2852 KiKi's K-Number (主席树)
    HDU 2089 不要62
    Light oj 1140 How Many Zeroes?
    Bless You Autocorrect!
    HDU 6201 transaction transaction transaction
    HDU1561 The more ,The better (树形背包Dp)
    CodeForces 607B zuma
    POJ 1651 Mulitiplication Puzzle
    CSUOJ 1952 合并石子
    Uva 1599 Ideal path
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5246595.html
Copyright © 2011-2022 走看看