自定义注解+策略模式

 1.创建一个策略类实现ApplicationListener

@Component
@Slf4j
public class ReserveServiceStrategy implements ApplicationListener<ContextRefreshedEvent> {
    private Map<String, ReserveService> reserveServiceMap=new ConcurrentHashMap<>();
    public ReserveService get(String code){
        if(reserveServiceMap.containsKey(code)){
            return reserveServiceMap.get(code);
        }
        log.error("该策略的实现类不存在!");
        throw new ServiceException("该策略"+code+"不存在");
    }
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //事件发生在哪个容器里面
        ApplicationContext applicationContext = event.getApplicationContext();
        //容器里面哪个类用了自定义注解
        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(ReserviceServiceSubmit.class);
        if(beansWithAnnotation!=null){
            //reserveServiceMap=new ConcurrentHashMap<>();
            beansWithAnnotation.forEach((simpleName,fullName)->{
                if(fullName instanceof ReserveService){
                    log.info("simpleName=[{}],fullName=[{}]",simpleName,fullName);
                    ReserviceServiceSubmit annotation = fullName.getClass().getAnnotation(ReserviceServiceSubmit.class);
                    String code = annotation.code();
                    String msg = fullName.getClass().getAnnotation(ReserviceServiceSubmit.class).msg();
                    reserveServiceMap.put(code, (ReserveService) fullName);
                }
            });
        }
    }
}

2.创建自定义注解

@Target( ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReserviceServiceSubmit {
    String code() default "";
    String tableName() default "";
    String msg() default "";
}

3.在想要的类上面添加自定义的注解即可实现,当容器启动时,将策略类注入到map里面

@Slf4j
@Service
@ReserviceServiceSubmit(code = "AAAA", tableName = "service_aaaa_table", msg = "AAAA服务")
public class GlobeFindMedicineImpl implements ReserveService {
}

当项目启动的时候,就会将标有 @ReserviceServiceSubmit注解添加进map里面,从而实现了策略类

4.使用,注入工厂类调用工厂里面的get方法同时传入编码,即可得到编码对应的策略类

@Autowired
private ReserveServiceStrategy reserveServiceStrategy;
//传入对应的编码
ReserveService reserveService = reserveServiceStrategy.get("AAAA");
//调用编码对应策略类中的方法
reserveService.insertReserviceService("参数1","参数2");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值