Spring(五):IoC创建对象的方式

打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

一、bean被创建的时间
考虑一个问题,我们都知道spring通过xml的配置创建bean,那么bean是什么时间被创建的呢?是在我们getBean()的时候创建的吗?
我们来做一个测试:
1.首先建立一个User类:
  1. package com.jms.pojo;
  2. public class User {
  3.     private String name;
  4.     public User() {
  5.         System.out.println("User被创建了");
  6.     }
  7.     public String getName() {
  8.         return name;
  9.     }
  10.     public void setName(String name) {
  11.         this.name = name;
  12.     }
  13.     @Override
  14.     public String toString() {
  15.         return "User{" +
  16. <?xml version="1.0" encoding="UTF-8"?>
  17. <beans xmlns="http://www.springframework.org/schema/beans"
  18.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  19.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  20.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  21.     <bean id="user" class="com.jms.pojo.User">
  22.         <property name="name" value="jms"/>
  23.     </bean>
  24. </beans>"name='" + name + '\'' +
  25. <?xml version="1.0" encoding="UTF-8"?>
  26. <beans xmlns="http://www.springframework.org/schema/beans"
  27.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  28.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  29.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  30.     <bean id="user" class="com.jms.pojo.User">
  31.         <property name="name" value="jms"/>
  32.     </bean>
  33. </beans>'}';
  34.     }
  35. }
复制代码
我们在User的无参构造中加入了一个打印语句,当User被创建时就会打印出“User被创建了”。
2.然后对应的一个xml配置文件:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.     <bean id="user" class="com.jms.pojo.User">
  7.         <property name="name" value="jms"/>
  8.     </bean>
  9. </beans>
复制代码
3.一个测试
  1. @Test
  2.     public void userTest() {
  3.         ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
  4.     }
复制代码
这个测试只有创建容器这一行代码。
测试结果:

 
 
 由上可以看出,即使我们没有使用bean,bean也在创建容器的时候就被创建并且存放在了容器之中;还可以看出,创建bean的方式默认是调用无参构造。
二、IoC创建对象的方式
1.默认:通过无参构造进行创建
2.通过有参构造创建
虽然默认是通过无参构造进行创建,我们能不能通过有参构造进行创建呢?答案是可以的。
我们还是先来做个测试,用一个有参构造覆盖无参构造:
  1. package com.jms.pojo;public class User {    private String name;    public User(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "User{" +<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.     <bean id="user" class="com.jms.pojo.User">
  7.         <property name="name" value="jms"/>
  8.     </bean>
  9. </beans>"name='" + name + '\'' +<?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  13.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  14.     <bean id="user" class="com.jms.pojo.User">
  15.         <property name="name" value="jms"/>
  16.     </bean>
  17. </beans>'}';    }}
复制代码
此时xml文件会报错:

 
 
 那么如何在xml中配置有参构造呢?
官方给出了三种方法:
(1)通过类型进行配置
  1.    <bean id="user" class="com.jms.pojo.User">
  2.         <constructor-arg type="java.lang.String" value="jms"/>
  3.     </bean>
复制代码
这种配置方法并不适用于有相同类型的情况,所以不建议用。
(2)通过索引进行配置
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.     <bean id="user" class="com.jms.pojo.User">
  7.         <property name="name" value="jms"/>
  8.     </bean>
  9. </beans>
复制代码
索引从0开始依次递增,由于我这里只有一个参数,所以只有一个0.
(3)通过参数名进行配置
  1.    <bean id="user" class="com.jms.pojo.User">
  2.         <constructor-arg type="java.lang.String" value="jms"/>
  3.     </bean>
复制代码
这种方法应该是最简单明了的。
还有一种特殊情况就是传入的参数也是一个bean,这种情况官方同样给出了解决的方案:
  1. package x.y;
  2. public class ThingOne {
  3.     public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
  4.         // ...
  5.     }
  6. }
复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  5.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  6.     <bean id="user" class="com.jms.pojo.User">
  7.         <property name="name" value="jms"/>
  8.     </bean>
  9. </beans><?xml version="1.0" encoding="UTF-8"?>
  10. <beans xmlns="http://www.springframework.org/schema/beans"
  11.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  12.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  13.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  14.     <bean id="user" class="com.jms.pojo.User">
  15.         <property name="name" value="jms"/>
  16.     </bean>
  17. </beans>
复制代码
 
 
(本文仅作个人学习记录用,如有纰漏敬请指正)
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表