Spring5【三】IoC 创建对象的方式及配置说明

4、IoC 创建对象的方式

4.1 通过无参构造方法创建对象【默认方式】

实体类

public class User {
   private String name;
    
   public User() {
       System.out.println("user无参构造方法");
  }
    
   public void setName(String name) {
       this.name = name;
  }
   public void show(){
       System.out.println("name="+ name );
  }
}

Spring 的配置文件 beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

   <bean id="user" class="com.song.pojo.User">
       <property name="name" value="张三"/>
   </bean>
    
</beans>

测试类

@Test
public void test(){
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   //在执行getBean的时候,user已经创建好了,通过无参构造
   User user = (User) context.getBean("user");
   //调用对象的方法
   user.show();
}

结果可以发现,在调用show方法之前,User 对象已经通过无参构造初始化了。

4.2 通过有参构造方法创建对象

官方文档:Constructor-based Dependency Injection

java 实体类(只有一个有参构造):

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;
    }
    public void show(){
        System.out.println("name = " + name);
    }
}
  1. 下标赋值

    <!--第一种,下标赋值-->
    <bean id="user" class="com.song.pojo.User">
        <!-- index指构造方法 , 下标从0开始 -->
        <constructor-arg index="0" value="张三"/>
    </bean>
    
  2. 类型赋值【不建议使用,因为参数类型有可能一样】

    <!--第二种:通过类型创建【不建议使用】-->
    <bean id="user" class="com.song.pojo.User">
        <constructor-arg type="java.lang.String" value="李四"/>
    </bean>
    
  3. 参数名赋值

    <!--第三种,直接通过参数名设置-->
    <bean id="user" class="com.song.pojo.User">
        <!-- name指参数名 -->
        <constructor-arg name="name" value="王五"/>
    </bean>
    

扩展:

如果再创建一个实体类 UserT:

public class UserT {
    private String name;

    public UserT(){
        System.out.println("UserT 被创建了");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

对应的 bean.xml 文件为:

<bean id="user" class="com.song.pojo.User">
    <constructor-arg name="name" value="王五"/>
</bean>

<bean id="userT" class="com.song.pojo.UserT">
</bean>

测试类:

public class MyTest {
    public static void main(String[] args) {
		// Spring 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User)context.getBean("user");
        User user2 = (User)context.getBean("user");
        System.out.println(user == user2);
    }
}

输出结果:

UserT 被创建了
true

总结:在配置文件加载时,容器中管理的对象就已经初始化了。并且容器内一个类的实例对象只有一个(单例)。

5、Spring 配置说明

5.1 别名

alias 设置别名 , 为bean设置别名 , 可以设置多个别名

<!--别名,如果添加了别名,我们也可以使用别名获取到这个对象-->
<alias name="user" alias="userNew"/>

5.2 bean 的配置

<!--
    id:bean 的唯一标识符,相当于对象名
    class:bean 对象所对应的全限定名:包名 + 类名
    name:也是别名,而且可以同时取多个别名,分隔符也很多
-->
<bean id="userT" class="com.song.pojo.UserT" name="user2 u2,u3;u4">
    <property name="name" value="张三"/>
</bean>

5.3 import

import 一般用于团队开发使用,可以将多个配置文件导入合并为一个。

假设一个项目中有多个人开发,每个人负责不同的类开发,不同的类需要注册在不同的 bean 中(beans.xml、beans2.xml、beans3.xml……),可以利用 import 将所有人的 beans.xml 合并为一个总的 ,使用的时候直接使用总的配置即可。

在总配置 applicationContext.xml 中:

<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>
posted @ 2020-06-19 22:03  Song-zw  阅读(277)  评论(0编辑  收藏  举报