SpringContextUtil
public class SpringContextUtil {
private static ApplicationContext applicationContext;
//獲取上下文
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//設(shè)置上下文
public static void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
}
//通過名字獲取上下文中的bean
public static Object getBean(String name){
return applicationContext.getBean(name);
}
//通過類型獲取上下文中的bean
public static Object getBean(Class<?> requiredType){
return applicationContext.getBean(requiredType);
}
}
啟動類
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext app = SpringApplication.run(Application.class, args);
SpringContextUtil.setApplicationContext(app);
}
}
測試bean
@Component
public class TestService {
public String doService(String contxt){
System.err.printf(contxt+"hello service");
return "hello service";
}
}
//無注入
public class TestController implements InitializingBean {
@Autowired
private TestService testService;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("我是動態(tài)注冊的你,不是容器啟動的時候注冊的你");
}
public String toAction(String content){
return "-->" + testService.doService(content);
}
}
測試
@RestController
public class CallCSBController {
@GetMapping("/bean")
public String registerBean() {
//將applicationContext轉(zhuǎn)換為ConfigurableApplicationContext
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();
// 獲取bean工廠并轉(zhuǎn)換為DefaultListableBeanFactory
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
// 通過BeanDefinitionBuilder創(chuàng)建bean定義
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestController.class);
// 設(shè)置屬性userService,此屬性引用已經(jīng)定義的bean:userService,這里userService已經(jīng)被spring容器管理了.
// beanDefinitionBuilder.addPropertyReference("testService", "testService");
// 注冊bean
defaultListableBeanFactory.registerBeanDefinition("testController", beanDefinitionBuilder.getRawBeanDefinition());
TestController userController = (TestController) SpringContextUtil.getBean("testController");
return userController.toAction("動態(tài)注冊生成調(diào)用");
//刪除bean.
//defaultListableBeanFactory.removeBeanDefinition("testService");
}
}