正常情况下,我们使用 @Autowired 就可以自动注入 @Component 的Bean,但是如果想自己手动创建对应的 Bean 对象,类似 X = new X() 这种做法,SpringBoot中如何实现呢?因为简单直接去 new 相应的组件,如果这个组件有注入其他的内部变量等,new 之后是不会自动注入内部变量的。
如果要动态创建 Bean 对象,请利用 ApplicationContext 来实现:
@Autowired
private ApplicationContext applicationContext;
DemoComponent demoComponent = applicationContext.getBean(DemoComponent.class);
封装一下:
package com.ourlang.dataextract.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component("springContextUtil")
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) applicationContext.getBean(name);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<?> clz) throws BeansException {
return (T) applicationContext.getBean(clz);
}
}