这篇文章主要介绍了spring中bean注入无效和new创建对象的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
bean注入无效和new创建对象区别
注意!如果直接new的话,类里面的autowire将不生效
项目中用到如下代码
然后 在运行的时候发现 通过 @Autowired注入的对象 capitalDetailDOMapper和 excelRecordDOMapper的值为null
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}
刚开始以为是ExcelListener没有加bean扫描注解导致的
于是加上后
@Component
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}
结果在运行的时候,两个mapper,仍然为null。
检查代码发现
在ExcelListener这个类的使用场景中,是 ExcelListener excelListener= new ExcelListener(); 创建的对象
这里就明白了, 手动通过new创建和通过spring容器创建管理对象是不一样的,手动new的对象,内部用@autowire注解是无效的。
若让该autowire生效,则需要通过容器来管理对象
改造如下,先给ExcelListener加上注解@Component
@Scope(“prototype”)
@Component(“excelListener”)
public class ExcelListener extends AnalysisEventListener<List> {
@Autowired
private CapitalDetailDOMapper capitalDetailDOMapper;
@Autowired
private ExcelRecordDOMapper excelRecordDOMapper;
…
}
这样 这个bean就会被加载到spring容器中,这里Scope表示bean的作用范围,spring默认创建的对象是单例的
prototype是非单例,这里我主要是想在不同的线程里面创建不同的ExcelListener实例。
可以通过容器获取bean,也可以直接@autowire
ExcelListener excelListener= SpringBeanUtils.getBean(“excelListener”);
其中SpringBeanUtils为实现了BeanFactoryPostProcessor接口的实现类
能够从spring容器里面获取到bean的实例,如果bean是非单例的 每次则获取到是一个新的bean
@Component
@Getter
public class SpringBeanUtils implements BeanFactoryPostProcessor {
private static ConfigurableListableBeanFactory beanFactory;
public static T getBean(String beanName) {
return (T) beanFactory.getBean(beanName);
}
public static T getBean(Class beanClz) {
return beanFactory.getBean(beanClz);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringBeanUtils.beanFactory = beanFactory;
}
}
注意!!如果A类是单例的,那么A类中的成员B类声明为非单例的,也是无效的。
因为只有A类的一个实例,里面包含的B类的实例也只有一个。 除非能再次创建A类的实例,才能创建出另一个B类的实例对象。
bean交个spring和new比较区别
在spring的配置文件中我们要使用DataSource这个对吧
这个bean将会被多个bean引用 通过ref="dateSource"这个引用 当我们要修改这个只要修改引用就好了 不需要修改很多了
主要是解耦
比如你有一个A类 在好几个类里边要调用到A的方法 new的话就要在每个类里都new A()
spring的话 只要配置一个bean进行注入就够了。
哪天你不用A类了 改成B了~ 直接把bean里边的class改成B就搞定了
如果用new的话 要改好几个地方~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程学习网。
本文标题为:详谈spring中bean注入无效和new创建对象的区别
基础教程推荐
- Java并发编程进阶之线程控制篇 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- Java实现查找文件和替换文件内容 2023-04-06
- Java实现线程插队的示例代码 2022-09-03
- Java数据结构之对象比较详解 2023-03-07
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- springboot自定义starter方法及注解实例 2023-03-31
- java实现多人聊天系统 2023-05-19
- Java文件管理操作的知识点整理 2023-05-19