在很多情况下 自己编写的 starter 会提供一些方法扩展
- starter 提供的抽象接口
新建抽象接口:
/**
* 日志抽象类
*
* @author Una Ma
* @date 2020/8/4 9:38 上午
*/
public abstract class AbstractLog {
public abstract void saveLog(SysLog sysLog);
}
默认实现:
/**
* 数据库日志实现
*
* @author Una Ma
* @date 2020/8/4 9:47 上午
*/
public class DataSourceAbstractLog extends AbstractLog {
@Autowired
private DataSource dataSource;
@SneakyThrows
@Override
public void saveLog(SysLog sysLog) {
Entity entity = new Entity("sys_log");
entity.parseBean(sysLog ,true ,true);
DbUtil.use(dataSource).insert(entity);
}
}
装载抽象接口:
/**
* 提供外部实现 当AbstractLog bean不存在的时候 默认实现为数据库存储
*
* @return {@link AbstractLog }
* @throws
*/
@Bean
@ConditionalOnMissingBean
public AbstractLog abstractLog(){
return new DataSourceAbstractLog();
}
默认使用 saveLog 方法:
/**
* 日志监听类
*
* @author Una Ma
* @date 2020/8/4 9:15 下午
*/
@Slf4j
public class LogEventListener {
@Autowired
private AbstractLog abstractLog;
@Subscribe
public void onMessageEvent(SysLog sysLog) {
// 保存日志
abstractLog.saveLog(sysLog);
}
}
- 自定义实现 AbstractLog
扩展为 mongo 存储:
/**
* mongo日志实现
*
* @author Una Ma
* @date 2020/8/4 9:51 上午
*/
public class MongoAbstractLog extends AbstractLog {
@Override
public void saveLog(SysLog sysLog) {
}
}
将新的实现注册为 bean:
/**
* nike自动装配类
*
* @author Una Ma
* @date 2020/08/04 22:36:13
*/
@Configuration
public class NikeConfiguration {
@Bean
public AbstractLog abstractLog(){
return new MongoAbstractLog();
}
}
注入 bean 会覆盖原有的数据源实现 因为加了注解:@ConditionalOnMissingBean