聊一聊new对象与Spring对bean的初始化的差别

 更新时间:2022年02月25日 10:47:26   作者:一个非典型的程序员  
这篇文章主要介绍了聊一聊new对象与Spring对bean的初始化的差别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

new对象与Spring对bean初始化差别

这个问题是一次我将老系统代码迁移到基于Spring构建的新系统中时遇到的,老代码中有很多地方使用了new方法来初始化对象,当时也没有特别注意,最后联调的时候发现所有new出来的对象中使用Autowired自动依赖注入的属性全都抛出了NullPointerException。

什么意思呢?

@Component
Class A {
    ...
} 
@Component
Class B {
    ...
} 
@Component
Class C {
    @Autowired
    A a;
    @Autowired
    B b;
} 

当我使用C c = new C()时,c中的a和b都是null,也就是无法完成注入。

说实话,在联调的那一刻我有一瞬间是懵逼的,但现在回想起来,哦,真是太傻了。

简单来理解

Spring首先会通过new方法创建一个对象,然后去完成属性的填充,而这种填充在我们外界看来是“自动”的;而我们直接通过new方法创建对象时,是没有谁去完成属性的填充的,因而内部属性值全为null。 

Spring类的注入和new简单理解

springboot

  • main.run方法进入
  • refreshContext
  • refresh
  • finishBeanFactoryInitialization(完成beanFactory的初始化)
  • preInstantiateSingletons(初始化单例)
  • getBean(获取Bean)
  • doGetBean
  • createBean
  • doCreateBean(此方法内部会createBean,创建bean即构造方法执行)
  • populateBean(进行autowired自动注入)
  • applyPropertyValues(进行属性注入)

PS:new对象,不能导致对象依赖的注入属性自动赋值,只有对对象进行注入,对象依赖的注入属性才能赋值;

且注入的属性不能在构造函数中操作,因为bean没有创建完成,属性也没有注入,此时是为null的

问题:spring默认是单例模式,还有必要创建单例类吗?

自己理解:有必要,如果不使用autowired进行自动注入,使用new操作还是可以生成多个对象,

spring的单例是针对自动注入

例子:

     @Component
     public class CxfClient{undefined
          @Value("${address }")
          private String address;
          private CxfClient(){undefined
               System.out.println(address ); //此时为null.bean没有加载完成,属性也没有加载
          }
          public void createClient(){undefined
               System.out.println(address );//此时为配置文件中的值
          }
          private static class SingletonHolder {undefined
              private static final CxfClient INSTANCE = new CxfClient();
          }
          public static final CxfClient getInstance() {undefined
               return SingletonHolder.INSTANCE;
          }
     }
     public class Test{undefined
          @Autowired
          private CxfClient cxfClient;
          public void testClient(){undefined
               CxfClient.getInstance().createClient();//打印为null.无法注入
               cxfClient.createClient();//打印为配置文件中的值
          }
     }

      

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

相关文章

  • Spring Security如何在Servlet中执行

    Spring Security如何在Servlet中执行

    这篇文章主要介绍了Spring Security如何在Servlet中执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java使用MulticastSocket实现组播

    java使用MulticastSocket实现组播

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现组播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • spring的jdbctemplate的crud的基类dao

    spring的jdbctemplate的crud的基类dao

    本文主要介绍了使用spring的jdbctemplate进行增删改查的基类Dao的简单写法,需要的朋友可以参考下
    2014-02-02
  • Java集合继承体系详解

    Java集合继承体系详解

    这篇文章主要为大家详细介绍了Java集合继承体系,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • java8 filter方法、Predicate接口的使用方式

    java8 filter方法、Predicate接口的使用方式

    这篇文章主要介绍了java8 filter方法、Predicate接口的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • mybatis简单resultMap使用详解

    mybatis简单resultMap使用详解

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。这篇文章主要介绍了mybatis简单resultMap使用详解的相关资料,需要的朋友可以参考下
    2021-04-04
  • Java中的SuppressWarnings注解使用

    Java中的SuppressWarnings注解使用

    这篇文章主要介绍了Java中的SuppressWarnings注解使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • java多线程编程之使用Synchronized块同步方法

    java多线程编程之使用Synchronized块同步方法

    synchronized块来同步一个对象变量,也可以使用synchronized块来同步类中的静态方法和非静态方法,下面使用Synchronized块同步方法
    2014-01-01
  • Ajax实现省市区三级联动

    Ajax实现省市区三级联动

    这篇文章主要为大家详细介绍了jQuery ajax实现省市县三级联动的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到你
    2021-07-07
  • 一篇文章带你入门java模板模式

    一篇文章带你入门java模板模式

    这篇文章主要为大家详细介绍了java模板模式的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论