• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Spring 自动代理创建器详细介绍及简单实例

    Spring 自动代理创建器

    前言:

    在经典的spring Aop中,可以手工为目标Bean创建代理Bean,配置文件必须为每一个需要增强的Bean声明一个代理,结果配置文件里声明了大量的代理Bean。

    在经典的Spring Aop中,Spring提供了自动代理创建器(Aotu proxy creator),有了自动代理创建器,就不再需要使用ProxyFactoryBean手工地创建代理了。

    接口Animal和Book:


     package com.zzj.aop; public interface Animal { public void eat(); public void drink(); }
    package com.zzj.aop; 
     
    public interface Book { 
     public void read(); 
    } 
    

    目标类:

    package com.zzj.aop; 
     
    public class Human implements Animal, Book{ 
     @Override 
     public void eat() { 
      System.out.println("eat..."); 
     } 
     
     @Override 
     public void drink() { 
      System.out.println("drink..."); 
     } 
     
     @Override 
     public void read() { 
      System.out.println("read..."); 
     } 
    } 
    

    前置通知和后置通知:

    package com.zzj.aop; 
     
    import java.lang.reflect.Method; 
     
    import org.springframework.aop.MethodBeforeAdvice; 
     
    public class MethodBefore implements MethodBeforeAdvice { 
     
     public void before(Method arg0, Object[] arg1, Object arg2) 
       throws Throwable { 
      System.out.println("before " + arg0.getName()); 
     } 
     
    } 
    
    
    package com.zzj.aop; 
     
    import java.lang.reflect.Method; 
     
    import org.springframework.aop.AfterReturningAdvice; 
     
    public class MethodAfter implements AfterReturningAdvice { 
     
     public void afterReturning(Object arg0, Method arg1, Object[] arg2, 
       Object arg3) throws Throwable { 
      System.out.println( "after " + arg1.getName()); 
     } 
     
    } 
    
    

    Spring配置文件:

    ?xml version="1.0" encoding="UTF-8"?> 
    beans xmlns="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd"> 
      !-- 定义目标对象 --> 
      bean id="human" class="com.zzj.aop.Human">/bean> 
      
      !-- 定义通知 --> 
      bean id="beforeAdvice" class="com.zzj.aop.MethodBefore">/bean> 
      bean id="afterAdvice" class="com.zzj.aop.MethodAfter">/bean> 
      
      !-- 定义切入点 --> 
      bean id="methodNamePointcut" 
       class="org.springframework.aop.support.NameMatchMethodPointcut"> 
       property name="mappedNames"> 
        list> 
         value>eat/value> 
         value>read/value> 
        /list> 
       /property> 
      /bean> 
      
      !-- 定义后置增强器(关联通知和切入点) --> 
      bean id="AfterMethodNameAdvisor" 
       class="org.springframework.aop.support.DefaultPointcutAdvisor"> 
       property name="advice" ref="afterAdvice">/property> 
       property name="pointcut" ref="methodNamePointcut">/property> 
      /bean> 
      !-- 定义前置增强器(关联通知和切入点) --> 
      bean id="BeforeMethodNameAdvisor" 
       class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor"> 
       property name="advice" ref="beforeAdvice">/property> 
       property name="expression"> 
        value>execution(* *.*in*(..))/value>!-- 可匹配drink --> 
       /property> 
      /bean> 
      
      !-- 定义自动代理创建器 --> 
      bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
       property name="beanNames"> 
        list> 
         value>*human/value> 
        /list> 
       /property> 
       property name="interceptorNames"> 
        list> 
         value>AfterMethodNameAdvisor/value> 
         value>BeforeMethodNameAdvisor/value> 
        /list> 
       /property> 
      /bean> 
    /beans> 
    

    以上自动代理器可以为以human结尾的Bean创建代理。

    测试:

    
    package com.zzj.aop; 
     
    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 
     
    public class Test { 
     
     /** 
      * @param args 
      */ 
     public static void main(String[] args) { 
      ApplicationContext context = new ClassPathXmlApplicationContext( 
        "applicationContext.xml"); 
      Animal animal = (Animal) context.getBean("human"); 
      Book book = (Book) animal; 
      animal.eat(); 
      animal.drink(); 
      book.read(); 
     
     } 
     
    } 
    
    

    输出:

    eat... 
    after eat 
    before drink 
    drink... 
    read... 
    after read 
    

    Spring还提供了另一个自动代理创建器:DefaultAdvisorAutoProxyCreator。这个自动代理创建器不需要任何配置,他会自动检查Ioc容器里声明的每一个增强器和Bean。如果存在与增强器切入点匹配的的Bean,那么DefaultAdvisorAutoProxyCreator将自动为其创建代理。

    bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 

    需要注意的是,DefaultAdvisorAutoProxyCreator可能会代理那些不希望被代理的目标Bean,所以使用时要格外小心。

    感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

    您可能感兴趣的文章:
    • 详解在Spring中如何自动创建代理
    • Springboot源码 AbstractAdvisorAutoProxyCreator解析
    • Spring-AOP自动创建代理之BeanNameAutoProxyCreator实例
    上一篇:Spring组件自动扫描详解及实例代码
    下一篇:JSP中EL表达式的用法详解(必看篇)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Spring 自动代理创建器详细介绍及简单实例 Spring,自动,代理,创建,器,