zoukankan      html  css  js  c++  java
  • Spring学习(23)--- AOP之Introductions应用

    • 简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象
    • 由<aop:aspect>中的<aop:declare-parents>元素声明该元素用于声明所匹配的类型拥有一个新的parents(因此得名)

    配置:

    <aop:aspect id="usageTrackerAspect" ref="usageTracking">
              <aop:declare-parents types-matching="com.xyz.myapp.service.*+" 
                                     implement-interface="com.xyz.myapp.service.tracking.UsageTracked"
                                     default-impl="com.xyz.myapp.service.tracking.DefaultUsageTracked"/>
    </aop:aspect>
    public void recordUsage(){
    	usageTracked.incrementUseCount();
    }
    UsageTracked usageTracked = (UsageTracked) context.getBean("myservice");
    

    例子:

    新建接口Fit及实现类FitImpl

    package com.aop.schema;
    
    public interface Fit {
    	void filter();
    }
    
    package com.aop.schema;
    
    public class FitImpl implements Fit {
    
    	@Override
    	public void filter() {
    		System.out.println("FitImpl.filter");
    
    	}
    
    }
    

    切面类(同上节,不做修改了):

    package com.aop.schema.advice;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    
    /**
    *
    * 切面类
    *
    */
    public class MyAspect {
    
    	public void before(){
    		System.out.println("MyAspect.before");
    	}
    	
    	public void afterreturning(){
    		System.out.println("MyAspect.afterreturning");
    	}
    	
    	public void afterthrowing(){
    		System.out.println("MyAspect.afterthrowing");
    	}
    	
    	public void after(){
    		System.out.println("MyAspect.after");
    	}
    	
    	public void around(ProceedingJoinPoint pjp) {
    		try {
    			System.out.println("MyAspect.around_1");
    			Object obj=pjp.proceed();
    			System.out.println("MyAspect.around_2");
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void around_init(ProceedingJoinPoint pjp,String name,int age) {
    		System.out.println(name+"  "+age);
    		try {
    			System.out.println("MyAspect.around_1");
    			Object obj=pjp.proceed();
    			System.out.println("MyAspect.around_2");
    		} catch (Throwable e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    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.1.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-4.1.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
             
         <bean id="myAspect" class="com.aop.schema.advice.MyAspect"></bean>
         <aop:config>
              <aop:aspect id="myAspectAOP" ref="myAspect">
                <!-- com.aop.schema.advice.*+ 指的是advice包下的所有类 -->
                <aop:declare-parents types-matching="com.aop.schema.advice.*+" 
                                     implement-interface="com.aop.schema.Fit"
                                     default-impl="com.aop.schema.FitImpl"/>
              </aop:aspect>
         </aop:config>
     
    </beans>
    

    单元测试:

    package com.aop.schema;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.aop.schema.advice.ApsectBiz;
    
    public class UnitTest {
    
    	@Test
    	public void test(){
    		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-aop.xml");
    		Fit fit = (Fit)context.getBean("myAspect");
    		fit.filter();
    	}
    }
    

    测试结果:

    七月 11, 2015 1:15:13 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@31b3c607: startup date [Sat Jul 11 13:15:13 CST 2015]; root of context hierarchy
    七月 11, 2015 1:15:13 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [spring-aop.xml]
    FitImpl.filter

    PS:说明为指定的类型强制指定了一个父类。

     

  • 相关阅读:
    Windows server 2016 解决“无法完成域加入,原因是试图加入的域的SID与本计算机的SID相同。”
    Windows Server 2016 辅助域控制器搭建
    Windows Server 2016 主域控制器搭建
    Net Framework 4.7.2 覆盖 Net Framework 4.5 解决办法
    SQL SERVER 2012更改默认的端口号为1772
    Windows下彻底卸载删除SQL Serever2012
    在Windows Server2016中安装SQL Server2016
    SQL Server 创建索引
    C#控制台或应用程序中两个多个Main()方法的设置
    Icon cache rebuilding with Delphi(Delphi 清除Windows 图标缓存源代码)
  • 原文地址:https://www.cnblogs.com/JsonShare/p/4638458.html
Copyright © 2011-2022 走看看