springboot如何获取一个接口下的所有实体类(策略模式的使用)
第一种: 自定义注解加反射
public interface IStrategy {
String getName();
}
public @interface StrategyAnnotation {
String value();
}
@StrategyAnnotation("mysql")
public class MysqlStrategy implements IStrategy {
@Override
public String getName() {
return "mysql";
}
}
@StrategyAnnotation("oracle")
public class OracleStrategy implements IStrategy{
public String getName() {
return "oracle";
}
}
public class StrategyContext {
private static final StrategyContext NOTICE_SERVICE_FACTORY = new StrategyContext();
public static StrategyContext getInstance() {
return NOTICE_SERVICE_FACTORY;
}
private static final Map<String, String> NOTICE_SERVICE_MAP = new HashMap<>();
static {
Reflections reflections = new Reflections(
"所有实现类的包名");
Set<Class<?>> classSet = reflections.getTypesAnnotatedWith(StrategyAnnotation.class);
for (Class<?> clazz : classSet) {
StrategyAnnotation noticeService = clazz.getAnnotation(StrategyAnnotation.class);
NOTICE_SERVICE_MAP.put(noticeService.value(), clazz.getCanonicalName());
}
}
public IStrategy create(String type) {
String className = NOTICE_SERVICE_MAP.get(type);
try {
Class<?> clazz = Class.forName(className);
Constructor<?> constructor = clazz.getConstructor(String.class);
return (IStrategy) constructor.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
IStrategy iStrategy = StrategyContext.getInstance().create("mysql");
iStrategy.getName();
第二种: 依赖springbean的生命周期
public interface IStrategy {
String getName();
}
@ComponentScan("mysql")
public class MysqlStrategy implements IStrategy {
@Override
public String getName() {
return "mysql";
}
}
@ComponentScan("oracle")
public class OracleStrategy implements IStrategy{
public String getName() {
return "oracle";
}
}
@Configuration
public class StrategyContext implements ApplicationContextAware, InitializingBean {
private static ApplicationContext applicationContext;
public static Map<String, SliceService> map = new HashMap<>();
@Override
public void afterPropertiesSet() throws Exception {
map = applicationContext.getBeansOfType(IStrategy.class);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
StrategyContext.applicationContext = applicationContext;
}
public static IStrategy getStrategy(String type) {
return map.get(type);
}
}
IStrategy iStrategy = StrategyContext.getStrategy("mysql");
iStrategy.getName();
第三种:使用@AutoWird注入
public interface IStrategy {
String getName();
}
@ComponentScan("mysql")
public class MysqlStrategy implements IStrategy {
@Override
public String getName() {
return "mysql";
}
}
@ComponentScan("oracle")
public class OracleStrategy implements IStrategy{
public String getName() {
return "oracle";
}
}
@Component
public class StrategyContext {
@Autowired
Map<String, IStrategy> iStrategyMap = new HashMap<>();
public IStrategy getStrategy(String type) {
return iStrategyMap.get(type);
}
}
@Autowired
private StrategyContext strategyContext;
IStrategy iStrategy = strategyContext.getStrategy("mysql");
iStrategy.getName();