基于springboot的策略模式(实现不同数据库下的日志操作)
·
一、定义策略类型
public class Const {
private Const(){
}
/**
* 日志存储 mysql
*/
public static final String LOG_STORGE_MYSQL = "mysql";
/**
* 日志存储 hbase
*/
public static final String LOG_STORGE_HBASE = "hbase";
}
二 、定义注解
@Target(ElementType.TYPE) //作用在类上
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited //子类可以继承此注解
public @interface HandlerLogType {
/**
* 策略类型
* @return
*/
String value();
}
三、定义日志策略接口
public interface LogStrategy {
/**
* 保存log到hbase以及es
* @param log
* @throws IOException
*/
void saveLog(Log log) throws IOException;
/**
* 创建日志相关表
*/
void createLogTable();
}
四、定义接口实现,有两个,分别HbaseLogStrategy ,MysqlLogStrategy
@Component("HbaseLogStrategy")
@HandlerLogType(Const.LOG_STORGE_HBASE)
public class HbaseLogStrategy implements LogStrategy {
private static final transient Logger logger = LoggerFactory.getLogger(HbaseLogStrategy.class);
@Override
public void saveLog(Log log) throws IOException{
logger.info(">>>>>>>>>> hbase save");
}
@Override
public void createLogTable() {
logger.info(">>>>>>>>>> hbase create");
}
}
@Service("mysqlLogStrategy ")
@HandlerLogType(Const.LOG_STORGE_MYSQL)
public class MysqlLogStrategy implements LogStrategy {
private static final transient Logger logger = LoggerFactory.getLogger(MysqlLogStrategy.class);
@Autowired
ApplicationContext applicationContext;
@Override
public void saveLog(Log log) throws IOException{
logger.info(">>>>>>>>>> mysql save");
}
@Override
public void createLogTable() {
logger.info(">>>>>>>>>> mysql create");
DataSource dataSource = applicationContext.getBean(DataSource.class);
try (Connection connection= dataSource.getConnection();
Reader resourceAsReader = Resources.getResourceAsReader("sql/generate/bus_log.sql");){
ScriptRunner runner=new ScriptRunner(connection);
runner.runScript(resourceAsReader);
} catch (SQLException | IOException e) {
logger.error(">>>>>>>>>>mysql建表异常", e);
}
}
}
五、日志策略获取
@Component
public class LogStrategyHandler {
//从配置获取,默认存储模式为hbase
@Value("${logStorage:hbase}")
private String logStorageDbType;
private static Map<String, LogStrategy> logStrategyBeanMap = new ConcurrentHashMap();
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void init() {
Map<String, Object> logStrategyMap = applicationContext.getBeansWithAnlnotation(HandlerLogType.class);
logStrategyMap.forEach((k,v)-> {
Class<LogStrategy> logStrategyClass = (Class<LogStrategy>) v.getClass();
String type = logStrategyClass.getAnnotation(HandlerLogType.class).value();
LogStrategy logStrategy= applicationContext.getBean(logStrategyClass);
logStrategyBeanMap.put(type,logStrategy);
});
}
public LogStrategy getLogStrategy(){
LogStrategy strategy= logStrategyBeanMap.get(logStorageDbType);
if(strategy==null) throw new IllegalArgumentException("没有对应的日志存储类型");
return strategy;
}
}
六 调用如下:
//注入
@Autowired
private LogStrategyHandler logStrategyHandler;
//自动创建日志相关表
logStrategyHandler.getLogStrategy().createLogTable();
更多推荐
所有评论(0)