Spring Boot 高效数据聚合

1、定义一个聚合接口

@Component
public class UserAggregate {
    @DataProvider(id="userFullData")
    public User userFullData(@DataConsumer(id = "user") User user,
                             @DataConsumer(id = "posts") List posts,
                             @DataConsumer(id = "followers") List 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 getPosts(@InvokeParameter("userId") Long userId) {}
}
@Service
public class FollowServiceImpl implements FollowService {
    @DataProvider(id = "followers")
    @Override
    public List 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中央仓库中):


  io.github.lvyahui8
  spring-boot-data-aggregator-starter
  1.0.1

并在 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

你可能感兴趣的:(Spring Boot 高效数据聚合)