美文网首页Spring FrameWork Core Tech
The IoC Container 5.4.5. Introdu

The IoC Container 5.4.5. Introdu

作者: 小鲍比大爷 | 来源:发表于2019-03-07 07:51 被阅读0次

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这个注解也形象的表示了这个功能的意义所在)。

相关文章

网友评论

    本文标题:The IoC Container 5.4.5. Introdu

    本文链接:https://www.haomeiwen.com/subject/kusauqtx.html