Spring Boot 高效数据聚合

1、定义一个聚合接口

@Component
public class UserAggregate {
    @DataProvider(id="userFullData")
    public User userFullData(@DataConsumer(id = "user") User user,
                             @DataConsumer(id = "posts") List<Post> posts,
                             @DataConsumer(id = "followers") List<User> followers) {
        user.setFollowers(followers);
        user.setPosts(posts);
        return user;
    }
}


@DataProvider 表示这个方法是一个数据提供者, 数据Id为 userFullData

@DataConsumer 表示这个方法的参数, 需要消费数据, 数据Id为 user ,posts, followers.

当然, 原来的3个原子服务 用户基础信息 ,用户博客列表, 用户的粉丝数据, 也分别需要添加一些注解

@Service
public class UserServiceImpl implements UserService {
    @DataProvider(id = "user")
    @Override
    public User get(@InvokeParameter("userId") Long id) {}
}
@Service
public class PostServiceImpl implements PostService {
    @DataProvider(id = "posts")
    @Override
    public List<Post> getPosts(@InvokeParameter("userId") Long userId) {}
}
@Service
public class FollowServiceImpl implements FollowService {
    @DataProvider(id = "followers")
    @Override
    public List<User> getFollowers(@InvokeParameter("userId") Long userId){}
}


其中

@DataProvider 与前面的含义相同, 表示这个方法是一个数据提供者
@InvokeParameter 表示方法执行时, 需要手动传入的参数
这里注意 @InvokeParameter 和 @DataConsumer的区别, 前者需要用户在最上层调用时手动传参; 而后者, 是由框架自动分析依赖, 并异步调用取得结果之后注入的.

最后, 仅仅只需要调用一个统一的门面(Facade)接口, 传递数据Id, Invoke Parameters,以及返回值类型. 剩下的并行处理, 依赖分析和注入, 完全由框架自动处理.

@Component
public class UserQueryFacade {
    @Autowired
    private DataBeanAggregateQueryFacade dataBeanAggregateQueryFacade;
    public User getUserFinal(Long userId) throws InterruptedException, 
                IllegalAccessException, InvocationTargetException {
        return dataBeanAggregateQueryFacade.get("userFullData",
                Collections.singletonMap("userId", userId), User.class);
    }
}

pom.xml以来引入(来自社区高手的封装,同时提交到maven中央仓库中):

<dependency>
  <groupId>io.github.lvyahui8</groupId>
  <artifactId>spring-boot-data-aggregator-starter</artifactId>
  <version>1.0.1</version>
</dependency>

并在 application.properties 文件中声明注解的扫描路径.

# 替换成你需要扫描注解的包
io.github.lvyahui8.spring.base-packages=io.github.lvyahui8.spring.example
之后, 就可以使用如下注解和 Spring Bean 实现聚合查询

@DataProvider
@DataConsumer
@InvokeParameter
Spring Bean DataBeanAggregateQueryFacade
注意, @DataConsumer 和 @InvokeParameter 可以混合使用, 可以用在同一个方法的不同参数上. 且方法的所有参数必须有其中一个注解, 不能有没有注解的参数.

项目地址和上述示例代码: https://github.com/lvyahui8/spring-boot-data-aggregator

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值