用spring boot的@Order注解实现责任链模式

        责任链可以将发送方和接收方的业务处理逻辑隔离开来,降低耦合,提高代码的可扩展性。比如在订单业务中,接收方处理订单时,需要先校验订单的合法性,然后计算订单的花费,接着校验库存和余额等信息,最后更新数据库。中途如果想要添加或者删除功能,都需要在接收方代码中进行修改。这时就需要责任链来处理中间过程,接收方只需要进行最后的数据库更新即可。

订单类:

@Data
public class OrderPojo {
    //订单编号
    private long num;

    private BigDecimal price;


}

 定义处理器接口:

public interface OrderHandler {
    OrderPojo handle(OrderPojo orderPojo);
}

 定义具体的处理器类

@Order(1)//数字越小,越先执行
@Component
public class FirstHandler implements OrderHandler {
    @Override
    public OrderPojo handle(OrderPojo orderPojo) {
        System.out.println("第一步:校验订单的合法性");
        return orderPojo;
    }
}
@Order(2)
@Component
public class SecondHandler implements OrderHandler {

    @Override
    public OrderPojo handle(OrderPojo orderPojo) {
        System.out.println("第二步:计算花费");
        orderPojo.setPrice(orderPojo.getPrice().subtract(new BigDecimal("1")));
        return orderPojo;
    }
}
@Order(3)
@Component
public class ThirdHandler implements OrderHandler {

    @Override
    public OrderPojo handle(OrderPojo orderPojo) {
        System.out.println("第三步:校验库存和余额");
        return orderPojo;
    }
}

定义拦截器上下文类,由消费方直接调用

@Component
public class OrderContext {
    @Autowired
    private List<OrderHandler> list;//sprig会根据Order注解顺序注入该接口的实现类

    public OrderPojo doInterceptor(OrderPojo orderPojo) {
        for (OrderHandler myInterceptor : list) {
            orderPojo = myInterceptor.handle(orderPojo);
            if (orderPojo == null) return null;
        }
        return orderPojo;
    }
}

消费方代码:

@SpringBootTest
public class Consumer {
    @Autowired
    private OrderContext orderContext;
    @Test
    public void test(){
        OrderPojo orderPojo = new OrderPojo();
        orderPojo.setNum(1L);
        orderPojo.setPrice(new BigDecimal("10.0"));
        System.out.println("orderPojo = " + orderPojo);
        orderPojo = orderContext.doInterceptor(orderPojo);
        System.out.println("orderPojo = " + orderPojo);
    }
}

结果:

        使用责任链模式后,在任何一个步骤中添加操作只需要添加实现类即可,增加了代码的可扩展性。 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java Spring Boot项目中,如果需要在@PostConstruct注解前执行逻辑,可以使用BeanPostProcessor接口,该接口提供了两个方法:postProcessBeforeInitialization和postProcessAfterInitialization。 在这两个方法中,可以对Bean进行一些初始化操作。其中,postProcessBeforeInitialization方法在@PostConstruct注解之前被调用,可以在该方法中进行一些预处理操作。 下面是一个示例代码: ```java @Component public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof MyService) { MyService myService = (MyService) bean; myService.setMyValue("Hello World!"); } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } ``` 在上面的代码中,MyBeanPostProcessor实现了BeanPostProcessor接口,并重写了postProcessBeforeInitialization和postProcessAfterInitialization方法。在postProcessBeforeInitialization方法中,我们可以对MyService类进行预处理,设置myValue的值为"Hello World!"。在postProcessAfterInitialization方法中,我们不进行任何操作,直接返回原始的Bean。 需要注意的是,如果BeanPostProcessor的实现类有多个,那么这些类的执行顺序是不确定的。如果需要控制执行顺序,可以使用@Order注解来指定顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值