Spring AOP支持给用户的实现类动态引入其他接口的实现。
通过@DeclareParents指定需要引入接口的类,引入的接口实现为DefaultUsageTracked。
接口UsageTracked:
package examples;
public interface UsageTracked {
void incrementUseCount();
}
UsageTracked接口实现:
package examples;
import java.util.concurrent.atomic.AtomicInteger;
public class DefaultUsageTracked implements UsageTracked {
private AtomicInteger atomicInteger = new AtomicInteger(0);
public void incrementUseCount() {
System.out.println("atomicInteger = " + atomicInteger.incrementAndGet());
}
}
com.xzy.myapp.service包下面的类型都会引入接口实现DefaultUsageTracked。相当于这些类型都继承自UsageTracked,实现是DefaultUsageTracked。
@Aspect
public class UsageTracking {
@DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)
public static UsageTracked mixin;
@Before("com.xyz.myapp.SystemArchitecture.businessService() && this(usageTracked)")
public void recordUsage(UsageTracked usageTracked) {
usageTracked.incrementUseCount();
}
}
在获取用户类后,可以将其强转为引入的接口类型,这背后都是Spring AOP使用动态代理帮我们实现的。
UsageTracked usageTracked = (UsageTracked) context.getBean("myService");
引入其他接口的功能,相当于动态增加了原有类所属的接口类型(@DeclareParents这个注解也形象的表示了这个功能的意义所在)。
网友评论