Spring相关配置
@Configuration
@ComponentScan(value = "com.best")
public class AppConfig {
}
不打印debug日志,logback-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<logger name="org.springframework" level="OFF"/>
</configuration>
1.定义策略接口
// 抽象策略类
@Component
public interface Strategy {
// 策略方法
void strategyMethod();
String getStrategyName();
default boolean support() {
return true;
}
}
2.定义两个实现类,策略A和策略B
// 具体策略类A
@Component
public class ConcreteStrategyA implements Strategy{
@Override
public void strategyMethod() {
System.out.println("具体策略A的策略方法被访问");
}
@Override
public String getStrategyName() {
return "A";
}
@Override
public boolean support() {
return true;
}
}
// 具体策略类B
@Component
public class ConcreteStrategyB implements Strategy {
@Override
public void strategyMethod() {
System.out.println("具体策略B的策略方法被访问!");
}
@Override
public String getStrategyName() {
return "B";
}
}
3.定义环境类
@Component
public class Context {
@Autowired
private StrategyFactory strategyFactory;
public void strategyMethod(String strategyName) {
Strategy strategy = strategyFactory.getStrategy(strategyName);
strategy.strategyMethod();
}
}
4.定义策略工厂
@Component
public class StrategyFactory implements InitializingBean {
@Autowired
private ApplicationContext applicationContext;
/**
* K-策略枚举,V-对应的SpringBean
*/
private final Map<String, Strategy> strategyMap = new HashMap<>();
public Strategy getStrategy(String strategyName) {
Strategy strategy = strategyMap.get(strategyName);
return strategy;
}
@Override
public void afterPropertiesSet() {
Map<String, Strategy> beanMap = applicationContext.getBeansOfType(Strategy.class);
beanMap.forEach((beanName, strategy) -> {
System.out.println(beanName + ", " + strategy);
strategyMap.put(strategy.getStrategyName(), strategy);
});
System.out.println(beanMap);
}
}
5.定义测试类
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(annotationConfigApplicationContext.getBean("concreteStrategyA").getClass().getName());
System.out.println(annotationConfigApplicationContext.getBean("concreteStrategyB").getClass().getName());
Context context = annotationConfigApplicationContext.getBean(Context.class);
// 两种策略:A和B
context.strategyMethod("B");
}
}