zoukankan      html  css  js  c++  java
  • AOP的工作模式

    代理主要有静态代理和动态代理。

    静态代理:在代理中实现接口并创建实现类对象,在对实现类的方法增加功能(不常用)。

    动态代理:实现implements InvocationHandler接口。实现方法:

    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
    
        System.out.println("=========");
    
        Object o=method.invoke(this.ins, args);
    
        System.out.println("---------");
    
        return o;
    
    }
    

    流程图:在配置文件的配置

    配置文件代码:

    
    <!-- pointcut definition -->
    
        <p:bean id="cf" class="com.kettas.spring.aop.day4.MyClassFilter">
    
            <p:property name="classes">
    
                <p:set>
    
                    <p:value>com.kettas.spring.ioc.day1.HelloIF</p:value>   ---
    
                </p:set>
    
            </p:property>
    
        </p:bean>
    
        <p:bean id="mm" class="com.kettas.spring.aop.day4.MyMethodMatcher">
    
            <p:property name="methodNames">
    
                <p:set>
    
                    <p:value>sayHello</p:value>
    
                </p:set>
    
            </p:property>
    
        </p:bean>
    
        <p:bean id="pc" class="com.kettas.spring.aop.day4.MyPointcut">
    
            <p:property name="classFilter" ref="cf"></p:property>
    
            <p:property name="methodMatcher" ref="mm"></p:property>
    
        </p:bean>
    
    
    
        <!--advice   要继承implements MethodInterceptor-->
    
        <p:bean id="timingAdvice" class="com.kettas.spring.aop.day4.TimingInterceptor"></p:bean>
    
    
    
        <!-- advisor  把通知和切入点结合在一起- 最好给代理增加功能->
    
        <p:bean id="timingAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
    
            <p:property name="advice" ref="timingAdvice"></p:property>
    
            <p:property name="pointcut" ref="pc"></p:property>
    
        </p:bean>
    
    
    
        <!—target 目标 -->
    
        <p:bean id="helloTarget" class="com.kettas.spring.ioc.day1.HelloIFImpl">
    
            <p:property name="cal">
    
                <p:bean class="java.util.GregorianCalendar"></p:bean>
    
            </p:property>
    
            <p:property name="user" value="world"></p:property>
    
        </p:bean>
    
        <!-- proxy -->
    
        <p:bean id="hello" class="org.springframework.aop.framework.ProxyFactoryBean">
    
            <p:property name="target" ref="helloTarget"></p:property>
    
            <p:property name="interceptorNames">
    
                <p:list>
    
                    <p:idref bean="timingAdvisor"/>   增加一种服务
    
                    <p:idref bean="xxxAdvisor"/>   增加另一种服务
    
                </p:list>
    
            </p:property>
    
            <p:property name="proxyInterfaces">    要和目标类实现共同的接口
    
                <p:value>com.kettas.spring.ioc.day1.HelloIF</p:value>
    
            </p:property>
    
        </p:bean>
    
    </p:beans>
    

    简化配置:有可能只是目标类不一样,其他的都是一样的。解决每一个目标类都需要一个复杂的代理过程配置的问题,可以简化配置的问题 抽象ProxyFactoyBean的方法 如:

    
    <!--  抽象proxy --定义抽象的类,只是没有目标类,其他的通知和接口都一样>
    
    <p:bean id="helloBase" class="org.springframework.aop.framework.ProxyFactoryBean" abstract=“true”>
    
            <p:property name="interceptorNames">
    
                <p:list>
    
                    <p:idref bean="timingAdvisor"/>   增加一种服务
    
    <p:idref bean="xxxAdvisor"/>   增加另一种服务
    
                </p:list>
    
            </p:property>
    
            <p:property name="proxyInterfaces">    要和目标类实现共同的接口
    
                <p:value>com.kettas.spring.ioc.day1.HelloIF</p:value>
    
            </p:property>
    
        </p:bean>
    
    </p:beans>
    

    真正的代理

    
    <!—target 目标 继承抽象方法  只用写目标类就可以了 -->
    
    <!-- proxy -->
    
    <p:bean id="hello" parent=helloBase”>
    
        <p:property name="target" ref="helloTarget"></p:property>
    
    </p:bean>
  • 相关阅读:
    poj 3321 Apple Tree
    hdu 1520 Anniversary party
    Light OJ 1089 Points in Segments (II)
    Timus 1018 Binary Apple Tree
    zoj 3299 Fall the Brick
    HFUT 1287 法默尔的农场
    Codeforces 159C String Manipulation 1.0
    GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
    GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
  • 原文地址:https://www.cnblogs.com/yuyu666/p/9795635.html
Copyright © 2011-2022 走看看