• 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"/>
    
  • 相关阅读:
    计算机一些常见名词解释
    [MSF]server/capture/http_javascript_keylogger键盘记录
    .net(C#)访问Oracle数据库的几种免安装组件的对比
    C# UserControl 判断是否是设计模式中
    Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)
    python 怎么启动一个外部命令程序, 并且不阻塞当前进程
    创建注记图层C# IFeatureWorkspaceAnno
    VisualSVN Server 导入已存在的库
    带您了解Oracle层次查询
    win7系统使用engine进行开发报错,“未能加载文件或程序集”
  • 原文地址:https://www.cnblogs.com/Songzw/p/13166650.html
Copyright © 2020-2023  润新知