zoukankan      html  css  js  c++  java
  • 转-springAOP基于XML配置文件方式

    springAOP基于XML配置文件方式

    <aop:config.../>包含: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 
    <?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:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    	http://www.springframework.org/schema/aop 
    	http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    	<!-- 切面 -->
    	<bean id="myAspect" class="net.csdn.www.aop.MyAspect"></bean>
    	<bean id="userDao" class="net.csdn.www.dao.UserDao"></bean>
    
    	<!-- 切入点 -->
    	<aop:config>
    		<aop:aspect id="asp1" ref="myAspect">
    			<aop:before method="authority" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    			<aop:after method="release" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    			<aop:after-returning method="log"
    				pointcut="execution(* net.csdn.www.dao.*.*(..))" returning="rvt" />
    			<aop:around method="processTx" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    		</aop:aspect>
    	</aop:config>
    </beans>

    测试类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文件中配置切面

    <bean id="myAspect1" class="net.csdn.www.aop.MyAspect1"></bean>
    
    	<!-- 切入点 -->
    	<aop:config>
    		<aop:aspect id="asp1" ref="myAspect">
    			<aop:before method="authority" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    			<aop:after method="release" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    			<aop:after-returning method="log"
    				pointcut="execution(* net.csdn.www.dao.*.*(..))" returning="rvt" />
    			<aop:around method="processTx" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    		</aop:aspect>
    		 <aop:aspect id="asp2" ref="myAspect1" order="1">
    			<aop:after-returning method="access"
    				pointcut="execution(* net.csdn.www.dao.*.*(..)) and args(date,food)"
    				returning="rvt" />
    		</aop:aspect>
    	</aop:config>
    调用userDao.eat(new Date(), "xiaochi");

    设置切入点 

    <aop:pointcut expression="execution(* csdn.dao.*.*(..))" id="mypoint"/> 
    id 切入点的标示名 
    expression 切入点表达式 
    <aop:after method="release" pointcut-ref="mypoint"/> 

    把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:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    	http://www.springframework.org/schema/aop 
    	http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    	http://www.springframework.org/schema/context
    	http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    	<!-- 切面 -->
    	<bean id="myAspect" class="net.csdn.www.aop.MyAspect"></bean>
    	<bean id="userDao" class="net.csdn.www.dao.UserDao"></bean>
    	<bean id="myAspect1" class="net.csdn.www.aop.MyAspect1"></bean>
    
    	<!-- 切入点 -->
    	<aop:config>
    	    <aop:pointcut expression="execution(* net.csdn.www.dao.*.*(..)) and args(date,food)" id="xxx"/> 
    		<aop:aspect ref="myAspect1"> <aop:after-returning method="access" 
    			pointcut-ref="xxx" returning="rvt"/> </aop:aspect> 
    	        <aop:aspect id="asp1" ref="myAspect" order="2">
    			<aop:before method="authority" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    			<aop:after method="release" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    			<aop:after-returning method="log"
    				pointcut="execution(* net.csdn.www.dao.*.*(..))" returning="rvt" />
    			<aop:around method="processTx" pointcut="execution(* net.csdn.www.dao.*.*(..))" />
    		</aop:aspect>
    	</aop:config>
    </beans>
  • 相关阅读:
    Element 更新以及全局设置属性
    第二次作业
    软件工程---自我介绍
    git lfs
    SUID
    G1 log 解析
    CMS jvm flags详解
    java不安全证书报证书路径找不到问题
    记一次CMS unloading class 耗时长调查
    springboot jsp 在Linux中报404问题
  • 原文地址:https://www.cnblogs.com/anruy/p/6025377.html
Copyright © 2011-2022 走看看