美文网首页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