Spring 提供同类型bean 自动装配到 map 或者 list 等集合中,超级好用,结合一些方式可以减少 if else 的业务逻辑判断以及处理。
上demo:
测试用的组件如下:(用Color ,省事也方便理解)
public interface Color {
void show();
}
@Component
public class Red implements Color {
@Override
public void show() {
System.out.println("this is RED");
}
@Override
public String toString() {
return "Red{}";
}
}
@Component
public class Green implements Color {
@Override
public void show() {
System.out.println("this is Green");
}
@Override
public String toString() {
return "Green{}";
}
}
@Component
public class Blue implements Color {
@Override
public void show() {
System.out.println("this is Blue");
}
@Override
public String toString() {
return "Blue{}";
}
}
bean的config类:
@Configuration
@ComponentScan(value = "com.wk.improve.spring.annotation")
public class ColorConfig {
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ColorConfig.class)
public class TestColor {
@Autowired
private Map<String, Color> colorMap;
@Autowired
private List<Color> colorList;
@Test
public void testColor() {
if (colorMap != null) {
for (Map.Entry<String, Color> entry : colorMap.entrySet()) {
System.out.println(entry.getKey());
entry.getValue().show();
}
System.out.println("--------map----------");
}
if (colorList != null) {
colorList.stream().forEach(color->color.show());
System.out.println("--------list----------");
}
}
}
输出的结果:
结果可以看到, 在bean装配到 map 或者list 中的时候, 一定是该类型的bean
@Autowired
private Map<String, Color> colorMap;
@Autowired
private List<Color> colorList;
使用 @Autowired 注解进行装配, map 中 key 是组件的id (默认情况下, @Component 使用类名第一个字母小写作为bean 的id注册到容器中)
这种方式方便同类型的service,处理不同的业务逻辑方式使用, 避免了各种if else 的逻辑判断来处理不同的逻辑。