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);
}
}
-
下标赋值
<!--第一种,下标赋值--> <bean id="user" class="com.song.pojo.User"> <!-- index指构造方法 , 下标从0开始 --> <constructor-arg index="0" value="张三"/> </bean>
-
类型赋值【不建议使用,因为参数类型有可能一样】
<!--第二种:通过类型创建【不建议使用】--> <bean id="user" class="com.song.pojo.User"> <constructor-arg type="java.lang.String" value="李四"/> </bean>
-
参数名赋值
<!--第三种,直接通过参数名设置--> <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"/>