关注 “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学习课堂” 微信公众号,获取更多学习笔记。