需求举例:比如我们有两个人,StudentPerson和TeacherPerson,他们实现了person的eat方法,现在要根据前台的请求分别调用各自的eat方法。
public interface Person{
void eat();
}
@Component("student")
public class StudentPerson implements Person{
public void eat(){
.....
}
}
@Component("teacher")
public class TeacherPerson implements Person{
public void eat(){
......
}
}
SpringContext工具类
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<? extends Object> getType(String name) {
return applicationContext.getType(name);
}
}
测试调用
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("dev")
public class FutureTest {
@Test
public void test(){
String beanName = "student";
Person person = (Person)SpringContextUtils.getBean(beanName);
person.eat();
}
}
这里要注意SpringContextUtils类上的@Component
注解是不可以去掉的,去掉后Spring
就不会自动调用setApplicationContext
方法来为我们设置上下文实例