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的无参构造方法不会被调用