网上有很多处理方式---(经过自己的测试,全部都是没有用的处理方式,提供一种本人测试2天的一种方式)
出现装配不进去的原因:new 出来的Bean 和 Spring Bean IOC工厂提供的Bean不是在同一个管理体系中,我们使用的Netty包中的handler是使用new的方式,导致它的子类中 不能直接装配其他组件,在handler中可以使用这种方式
处理的方案:
@EnableScheduling
@SpringBootApplication
@RestController
public class VenusApplication implements ApplicationContextAware{
public static void main(String[] args) {
SpringApplication.run(VenusApplication.class, args);
}
/***
* 动态生成bean
*/
private static ApplicationContext applicationContext;
private static DefaultListableBeanFactory defaultListableBeanFactory;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
defaultListableBeanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
}
//直接使用类名调用这个静态方法,就可以在handler中获取到我们的SpringBean对象,就可以继续浪荡不羁爱自由了
public static <T> T getBean(Class<T> clazz) {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
String className = clazz.getName();
defaultListableBeanFactory.registerBeanDefinition(className, beanDefinitionBuilder.getBeanDefinition());
return (T) applicationContext.getBean(className);
}
public static void destroy(String className){
defaultListableBeanFactory.removeBeanDefinition(className);
System.out.println("destroy " + className);
}
}
一生二,二生三,三生万物,直至道法自然。