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的版本号问题




  • 相关阅读:
    EF4.3 到底能不能用?
    系统架构师(详解+转)
    silverlight MD5加密
    silverlight自定义安装客户端插件
    vs2010中文安装英文版silverlight5,和MVC 3
    如何自定义gridview的表格显示?
    Scott Mitchell的ASP.NET2.0数据指南中文版索引
    成功软件开发者的9种编程习惯(一)
    第8章 商品目录管理
    6/29 项目目录结构有所调整
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5246595.html
Copyright © 2011-2022 走看看