Spring 框架中 IOC 容器创建对象的 2 种方式

关注 JAVA学习课堂 微信公众号,获取更多学习笔记。

1、通过无参构造方法来创建

(1)在父项目中新建一个模块(Module),并在其中创建一个普通的Maven子项目,项目名称为spring-ioc2

(2)填写子项目名称和Maven项目GAV,点击Finish按钮完成子项目创建,等待Maven依赖包导入完毕。

(3)在子项目的java目录下新建一个包(用于存放我们自己编写的实体类),并在该包下新建一个User实体类。

User.java文件:

package com.zhang.pojo;
​
public class User {
    private String name;
    public User(){
        System.out.println("This is a no args method!");
    }
​
    public void show(){
        System.out.println("This is a show method!");
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}

(4)在该项目的resources目录下,创建一个beans.xml 用来配置文件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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
​
    <bean id="User" class="com.zhang.pojo.User">
        <property name="name" value="张三丰"></property>
    </bean>
​
</beans>

5)在该项目的src/test/java目录下,创建一个MyTest测试类,用来测试通过无参构造方法创建的对象。

import com.zhang.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class MyTest {
    @Test
    public void test1(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User)ac.getBean("User");
        user.show();
    }
}
​

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

原因当你创建一个 User 对象时,会调用该类的构造方法来初始化对象,在代码中 User 类中定义了一个无参构造方法Public User() ,在这个方法中 有一个输出语句,所以在执行创建对象的代码时,会先输出 This is a no args method!,然后在调用 user.show来输出 This is a show method!

2、通过有参构造方法来创建

修改User.java类

package com.zhang.pojo;
​
public class User {
    private String name;
    public User(String name){
        //System.out.println("This is a no args method!");
        this.name = name;
        System.out.println("user的有参构造方法!");
    }
​
    public void show(){
        System.out.println("This is a show method!");
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}

修改beans.xml 配置文件

beans.xml中给有参构造函数传参的方式有以下几种:

方式一:根据构造函数参数索引index)给参数赋值。

方式二:通过构造函数参数类型匹配给参数赋值。(不推荐)

方式三:通过构造函数参数名称给参数赋值。

<!--第一种:下标赋值-->
    <bean id="user" class="com.zhang.pojo.User">
        <constructor-arg index="0" value="张三"></constructor-arg>
    </bean>
​
    <!--第二种:类型赋值。
        如果两个参数都是String类型,则没有办法使用。
        所以不建议使用第二种
     -->
    <bean id="user" class="com.zhang.pojo.User">
        <constructor-arg type="java.lang.String" value="张三"/>
    </bean>
​
    <!--第三种:直接通过参数名实现-->
    <bean id="user" class="com.zhang.pojo.User">
        <constructor-arg name="name" value="张三"></constructor-arg>
    </bean>

测试。

MyTest.java文件:

import com.atangbiji.pojo.UserT;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class MyTest {
    @Test
    public void testT(){
        //解析beans.xml文件,IOC容器生成并管理相应的Bean对象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //通过Spring的上下文对象,从IOC容器中获取Bean对象
        UserT user = (UserT) context.getBean("UserT");
        //调用Bean对象的方法
        user.show();
    }
}

运行测试程序,执行结果如下图所示:

总结:在xml配置文件加载的时候,容器中配置的所有对象都已经被初始化了!

3.IOC容器创建对象过程

(1)先通过createBeanFactory创建出一个bean工厂(利用顶级接口BeanFactory下的DefaultListableBeanFactory接口)。

(2)循环创建对象,由于容器中bean默认都是单例,则优先通过getBean,doGetBean从容器中查找。

(3)如果找不到则通过createBean,doCreateBean方法,以反射形式创建对象。一般情况下使用的是无参构造方法(getDeclaredConstructor,newInscance)。

(4)进行对象的属性填充(populateBean)。

(5)进行其它初始化操作(initializingBean)。

关注 JAVA学习课堂 微信公众号,获取更多学习笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值