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");