☰
Spring-IOC创建对象的方式构造器注入
2026/10/7 22:37:01 网站建设 项目流程

IOC创建对象的方式(构造器注入)

创建无参构造

实现类中的 JavaBean

publicclassUser{privateStringname;// 无参构造默认是隐式的publicUser(){System.out.println("User的无参构造");}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicvoidshow(){System.out.println("name="+name);}}

beans.xml

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"><beanid="user"class="com.cike3.pojo.User"><propertyname="name"value="cike_y"/></bean></beans>

测试方法中实例化容器&使用

publicclassSprin_03_Test{@Testpublicvoidtest(){// User user = new User();ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");Useruser=(User)context.getBean("user");}}

创建有参构造

实现类的JavaBean

publicclassUser{privateStringname;publicUser(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicvoidshow(){System.out.println("name="+name);}}

对比无参构造的JavaBean实现类,这里变了

测试方法中需要调用JavaBean实现类中的show方法,其他则不变

publicclassSprin_03_Test{@Testpublicvoidtest(){// User user = new User();ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");Useruser=(User)context.getBean("user");user.show();// 这是多了这行罢了}}

而Spring是基于容器管理的,也可以说是基于XML配置,所以重点都是在XML中进行操作的

官方文档参考:

https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html https://docs.spring.io/spring-framework/docs/5.2.0.RELEASE/spring-framework-reference/core.html#beans-constructor-injection

下标赋值

<!--有参构造第一种,下标赋值--><beanid="user"class="com.cike3.pojo.User"><constructor-argindex="0"value="cike_y"/></bean>

参数类型匹配(不建议使用)

我们这里name的参数类型很明显是String类型

<!--有参构造第二种,参数类型匹配--><beanid="user"class="com.cike3.pojo.User"><constructor-argtype="java.lang.String"value="cike_y"/></bean>

如果我们的两个参数的类型都是String,它就冲突了

参数名匹配

<!--有参构第三种,通过参数名--><beanid="user"class="com.cike3.pojo.User"><constructor-argname="name"value="cike_y"/></bean>

实验(有参&无参)

JavaBean的User类(有参构造)

publicclassUser{privateStringname;publicUser(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicvoidshow(){System.out.println("name="+name);}}

JavaBean的User2类( 无参构造)

publicclassUser2{privateStringname;publicUser2(){System.out.println("User2无参构造");}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicvoidshow(){System.out.println("name="+name);}}

beans.xml 配置Spring容器

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"><!--有参构造,User类--><beanid="user"class="com.cike3.pojo.User"><constructor-argtype="java.lang.String"value="cike_y"/></bean><!--无参构造,User2 类--><beanid="user2"class="com.cike3.pojo.User2"/></beans>

测试方法中,实例化对象的类

publicclassSprin_03_Test{@Testpublicvoidtest(){// User user = new User();// Spring容器,就类似于婚介网站!ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");Useruser=(User)context.getBean("user");Useruser2=(User)context.getBean("user");System.out.println(user==user2);//内存中只有一个实例,这里都是User类型}}

在这里的测试方法,只是为了证明获取的对象都是User(有参构造的类),但是为什么还是调用到了 User2 类 无参构造方法进行探究!

总结:在配置文件加载的时候,容器中的对象就已经初始化了!否则User2的无参构造方法不会被调用

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询