Spring AOP之Introduction

在文章Spring AOP之术语简介中有提到,introduction代表为一个类添加的新字段或方法定义。Spring AOP允许我们为任何对象introduce(引入)新的接口实现。

如何使用Introduction

Spring为我们提供了一个注解@DeclareParents来定义需要introduce(引入)新的接口实现的类、以及默认的接口实现类型。

@DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)	//所有`com.xzy.myapp.service`包下的类及其子类均新增对`UsageTracked`接口的实现,默认实现类为`DefaultUsageTracked`
public static UsageTracked mixin;

举例说明

  • 定义一个接口RunInterface
public interface RunInterface {
	void run();
}
  • 定义一个RunInterface接口的默认实现类DefaultRunInterface
public class DefaultRunInterface implements RunInterface {
	@Override
	public void run() {
		System.out.println("default run method");
	}
}
  • 定义Spring的Java配置类AppConfig
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class AppConfig {}
  • 定义切面类AspectClass
@Aspect
@Component
public class AspectClass {
	@DeclareParents(value = "com.qyh.test.introduction.Person", defaultImpl = DefaultRunInterface.class)
	private RunInterface runInterface;
}
  • 定义一个实体类Person
@Component
public class Person {}
  • 定义测试类Test
public class Test {
	public static void main(String[] args) {
		ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
		RunInterface person = applicationContext.getBean("person", RunInterface.class);
		person.run();
	}
}
  • 测试结果
default run method
  • 结果分析
    AspectClass里,我们定义了一个Introduction,使Person类实现RunInterface,因此容器中的person实例可以被转型为RunInterface类型,调用其run()方法会调用RunInterface的默认实现DefaultRunInterface中的run()方法。相当于给person实例新增了一个run()方法。

References

Spring Framework 5.2.5 Reference Doc.
Spring AOP之Introduction(@DeclareParents)简介

你可能感兴趣的:(Spring)