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>
posted @   尐鱼儿  阅读(320)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示