详谈spring中bean注入无效和new创建对象的区别

 更新时间:2022年02月25日 10:13:33   作者:公众号:程序员与王子喵 欢迎关注  
这篇文章主要介绍了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的话 要改好几个地方~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合GitLab-CI实现持续集成的过程

    SpringBoot整合GitLab-CI实现持续集成的过程

    这篇文章主要介绍了SpringBoot整合GitLab-CI实现持续集成,本文详细讲述了 GitLab-CI 持续集成的安装、部署、以及配置,需要的朋友可以参考下
    2022-12-12
  • Java如何实现Word文档分栏效果

    Java如何实现Word文档分栏效果

    这篇文章主要介绍了Java如何实现Word文档分栏效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java自定义动态链接数据库示例

    java自定义动态链接数据库示例

    这篇文章主要介绍了java自定义动态链接数据库示例,需要的朋友可以参考下
    2014-02-02
  • MyEclipse如何将项目的开发环境与服务器的JDK 版本保持一致

    MyEclipse如何将项目的开发环境与服务器的JDK 版本保持一致

    我们使用MyEclipse开发Java项目开发中,偶尔会遇到因项目开发环境不协调,导致这样那样的问题,在这里以把所有环境调整为JDK1.6 为例,给大家详细介绍MyEclipse如何将项目的开发环境与服务器的JDK 版本保持一致,需要的朋友参考下吧
    2024-04-04
  • 分析Spring框架之设计与实现资源加载器

    分析Spring框架之设计与实现资源加载器

    Spring框架是由于软件开发的复杂性而创建的。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。今天来分析它的设计与实现资源加载器,从Spring.xml解析和注册Bean对象
    2021-06-06
  • Java编程实现A*算法完整代码

    Java编程实现A*算法完整代码

    这篇文章主要介绍了Java编程实现A*算法完整代码,简单介绍了a星算法,然后分享了完整测试代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • kotlin之闭包案例详解

    kotlin之闭包案例详解

    这篇文章主要介绍了kotlin之闭包案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java利用future及时获取多线程运行结果

    Java利用future及时获取多线程运行结果

    在Java编程中,有时候会需要及时获取线程的运行结果,本文就通过一个相关实例向大家介绍Java利用future及时获取线程运行结果的方法,需要的朋友可以参考。
    2017-10-10
  • SpringBoot项目的多文件兼多线程上传下载

    SpringBoot项目的多文件兼多线程上传下载

    本文主要介绍了SpringBoot项目的多文件兼多线程上传下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • java 中死锁问题的实例详解

    java 中死锁问题的实例详解

    这篇文章主要介绍了java 中死锁问题的实例详解的相关资料,希望通过本文大家能够理解掌握死锁的问题,需要的朋友可以参考下
    2017-09-09

最新评论