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

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

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

引入增强-Spring AOP给目标bean添加新方法、功能_第1张图片

  • IPerson
public interface IPerson {
    void run();
}
  • Person
public class Person implements IPerson {
    @Override
    public void run() {
        System.out.println("可以跑...");
    }
}

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

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

  • IFlying
public interface IFlying {
    void fly();
}

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

继承DelegatingIntroductionInterceptor

引入增强-Spring AOP给目标bean添加新方法、功能_第2张图片
让FlyImpl扩展DelegatingIntroductionInterceptor 来实现

  • FlyImpl
public class FlyImpl extends DelegatingIntroductionInterceptor implements IFlying {
    @Override
    public void fly() {
        System.out.println("我还会飞...");
    }
}

配置代理

  • application.xml

<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="person" class="org.byron4j.demo.Person"/>

    
    <bean id="fly" class="org.byron4j.demo.FlyImpl"/>

    
    <bean id="proxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">

        
        <property name="interfaces" value="org.byron4j.demo.IFlying"/>
        
        <property name="interceptorNames" value="fly"/>
        
        <property name="target" ref="person"/>
        <property name="proxyTargetClass" value="true"/>
    bean>

beans>

pom.xml

<dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-aopartifactId>
      <version>${spring.version}version>
    dependency>

    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-contextartifactId>
      <version>${spring.version}version>
    dependency>


    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>${junit.version}version>
      <scope>compilescope>
    dependency>


    
    <dependency>
      <groupId>log4jgroupId>
      <artifactId>log4jartifactId>
      <version>${log4j.version}version>
    dependency>

    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>slf4j-apiartifactId>
      <version>${slf4j.version}version>
    dependency>

    <dependency>
      <groupId>org.slf4jgroupId>
      <artifactId>slf4j-log4j12artifactId>
      <version>${slf4j.version}version>
    dependency>

测试

@Test
    public void test(){

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

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

        IFlying flying = (IFlying) person;

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


    }

你可能感兴趣的:(【Spring入门到源码分析】)