springAOP基于XML配置文件方式(一)

2014-11-24 00:07:54 · 作者: · 浏览: 2

包含:poincut,advisor,aspect元素,通过XML配置。

springAOP的具体加载步骤:
1、当spring容器启动的时候,加载了spring的配置文件
2、为配置文件中所有的bean创建对象
3、spring容器会解析aop:config的配置
1、解析切入点表达式,用切入点表达式和纳入spring容器中的bean做匹配
如果匹配成功,则会为该bean创建代理对象,代理对象的方法=目标方法+通知
如果匹配不成功,不会创建代理对象
4、在客户端利用context.getBean获取对象时,如果该对象有代理对象则返回代理对象,如果代理对象,则返回目标对象


说明:如果目标类没有实现接口,则spring容器会采用cglib的方式产生代理对象,如果实现了接口,会采用jdk的方式


MyAspect.java

package net.csdn.www.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;

public class MyAspect {
	
	public void authority(JoinPoint jp) {
		System.out.println("被代理方法名字:"+jp.getSignature().getName());
		System.out.println("被代理方法参数:"+jp.getArgs());
		System.out.println("被代理对象:"+jp.getTarget());
		System.out.println("现在调用的是权限验证");
          
	}

	
	public  void log(JoinPoint jp,Object rvt){
		System.out.println("被代理方法名字:"+jp.getSignature().getName());
		System.out.println("被代理方法参数:"+jp.getArgs());
		System.out.println("被代理对象:"+jp.getTarget());
		System.out.println("被代理对象的返回值"+rvt);
		System.out.println("现在调用的是日志管理");
	}
	

	public Object processTx(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("现在调用的是事务开启");		
		//得到业务方法的参数
		Object[] args=pjp.getArgs();
		System.out.println("业务方法的参数:"+args);
		//被代理对象的业务方法
		Object result=pjp.proceed(args);
		System.out.println("现在调用的是事务提交或回滚");
	    return result;
	}
	
	
	public void release(){
		System.out.println("资源已经被释放!");		
	}
}

UserDao.java

package net.csdn.www.dao;

import java.util.Date;

import org.springframework.stereotype.Component;

@Component
public class UserDao {
    public String save(String name){
    	System.out.println(name+"被保存");
    	return "success";
    }
}

applicationContext.xml

  

  
	
   
	
   
	
   

	
   
	
    
     
      
      
      
      
     
   

  

测试类Test.java

package net.csdn.www.text;

import java.util.Date;

import net.csdn.www.dao.UserDao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
   public static void main(String[] args) {
	ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
	UserDao  userDao=(UserDao) context.getBean("userDao");
     userDao.save("csdnccccccc");
   }
}

\


在UserDao类中声明一个带参数的方法

public String eat(Date date,String food){
    	System.out.println(date+"先准备:"+food);
    	return "好吃";
    }

MyAspect1.java

package net.csdn.www.aop;

import java.util.Date;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;

public class MyAspect1 {
	
	//注意:增加参数匹配,参数位置类型要和被代理方法一致	
     public void access(Date date, String food,Object rvt){
    	 System.out.println(date+"吃"+food+"-----");
    	 System.out.println("返回值为:"+rvt);
     }
	
}

在XML文件中配置切面

  

	
  
	
  
		
    
     
     
     
     
   
		 
    
     
   
	
  

调用userDao.eat(new Date(), "xiaochi");