前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >引入增强-Spring AOP给目标bean添加新方法、功能

引入增强-Spring AOP给目标bean添加新方法、功能

作者头像
青山师
发布2023-05-05 19:51:09
1140
发布2023-05-05 19:51:09
举报

引入增强-Spring AOP给目标bean添加新方法、功能

引入增强:可以给已经存在的类增加方法、逻辑。 我们以一个简单的Person类,只能run,给他增加一个fly的方法。

在这里插入图片描述
在这里插入图片描述
  • IPerson
代码语言:javascript
复制
public interface IPerson {
    void run();
}
  • Person
代码语言:javascript
复制
public class Person implements IPerson {
    @Override
    public void run() {
        System.out.println("可以跑...");
    }
}

以上是一个很简单的接口、实现类,拥有一个run方法。

我们还拥有一个定义了fly的接口:

  • IFlying
代码语言:javascript
复制
public interface IFlying {
    void fly();
}

现在我们的目标是不修改IPerson、Person来让Person拥有fly的功能。这里可以使用Spring AOP的动态引入增强通知实现。

继承DelegatingIntroductionInterceptor

在这里插入图片描述
在这里插入图片描述

让FlyImpl扩展DelegatingIntroductionInterceptor 来实现

  • FlyImpl
代码语言:javascript
复制
public class FlyImpl extends DelegatingIntroductionInterceptor implements IFlying {
    @Override
    public void fly() {
        System.out.println("我还会飞...");
    }
}

配置代理

  • application.xml
代码语言:javascript
复制
<?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-->
    <bean id="person" class="org.byron4j.demo.Person"/>

    <!--引入增强,使得person拥有flyde方法-->
    <bean id="fly" class="org.byron4j.demo.FlyImpl"/>

    <!--配置ProxyFactoryBean-->
    <bean id="proxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">

        <!--引入的接口-->
        <property name="interfaces" value="org.byron4j.demo.IFlying"/>
        <!--包含增强逻辑的bean-->
        <property name="interceptorNames" value="fly"/>
        <!--目标增强bean-->
        <property name="target" ref="person"/>
        <property name="proxyTargetClass" value="true"/>
    </bean>

</beans>

pom.xml

代码语言:javascript
复制
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
      <scope>compile</scope>
    </dependency>


    <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

测试

代码语言:javascript
复制
@Test
    public void test(){

        ApplicationContext applicationContext
                = new ClassPathXmlApplicationContext("application.xml");

        // 获得的是person
        IPerson person = ((IPerson) applicationContext.getBean("proxyBean"));

        IFlying flying = (IFlying) person;

        flying.fly();   // 输出:我还会飞...


    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引入增强-Spring AOP给目标bean添加新方法、功能
    • 继承DelegatingIntroductionInterceptor
      • 配置代理
        • pom.xml
          • 测试
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档