JavaWeb学习-Spring框架-3-Spring配置详解之Bean元素和三种对象的创建方式
这篇开始,我们陆续来学习Spring中的配置项详解,来介绍第一篇中的hello world级别程序中xml文件中的注解。Spring最麻烦的就是各种注解,包括以后Springboot也是各种注解。
1.Bean元素注解
关于Bean元素注解,我们前面使用了这个配置,在applicationContext.xml文件中
<!-- 将User对象交给Spring容器管理 -->
<bean name="user" class="com.anthony.bean.User" ></bean>
什么是Bean元素:使用该元素描述需要被Spring容器管理的对象。我们需要掌握name 和class这两个属性。
name属性:给被管理对象起一个名字,方便获取对象时候根据该名称获取。
name属性的特点是:name可以随便写,可以多个bean对象的name重名,但是建议尽量不要重复。name可以包含特殊字符,例如“/user-dd_ad”
class属性:被Spring管理对象的完整类名
这里提一下,还有一个早期设计的id属性,在软件设计行业中,id一般是不允许重复,而且不可以带特殊字符,所以id不好用,后来Spring增加了name属性,现在几乎不使用id属性。
2.三种对象的创建方式
2.1 对象创建方式1:空参构造 (默认和需要掌握的方式)
为了演示,我们新建一个create包,把前面Demo1.java这个测试类和配置文件applicationContext.xml都拷贝到create这个包下。
为了演示走的空参构造,我们在User.java这个类添加一个显示的空参构造,写一个打印语句。
package com.anthony.bean;
public class User {
public User() {
System.out.println("User类的空参构造调用!!!");
}
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
配置文件内容不变
测试类,改一下配置文件的路径
package com.anthony.create;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.anthony.bean.User;
public class Demo1 {
@Test
public void fun1() {
//1 创建容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("com/anthony/create/applicationContext.xml");
//2 向容器 要 user对象
//User u = (User) ac.getBean("user");
//3 打印user对象
//System.out.println(u);
}
}
运行一下这个单元测试
信息: Loading XML bean definitions from class path resource [com/anthony/create/applicationContext.xml]
User类的空参构造调用!!!
这个就是创建方式1的空参构造。
2.2创建方式2:静态对象工厂(了解)
在create包下新建一个UserFactory类
package com.anthony.create;
import com.anthony.bean.User;
public class UserFactory {
public static User createUser() {
System.out.println("静态工厂创建User!!!");
return new User();
}
}
修改create包下xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<!-- 对象创建方式1:空参构造 -->
<bean name="user" class="com.anthony.bean.User" ></bean>
<!-- 对象创建方式2:静态工厂 -->
<bean name="user2" class="com.anthony.create.UserFactory" factory-method="createUser" ></bean>
</beans>
注意这个属性 factory-method="createUser",指定通过这个静态方法去创建User对象。Demo1的测试代码不变,运行下
信息: Loading XML bean definitions from class path resource [com/anthony/create/applicationContext.xml]
User类的空参构造调用!!!
静态工厂创建User!!!
User类的空参构造调用!!!
首先,这个说明了前面一篇文章中特点,也就是ApplicationContext容器会一开始就把容器内全部对象创建好。第二个就是说明我们这里要举例的静态工厂创建User,在静态工厂中执行new User(),所以在此执行了User类中的空参构造。
2.3创建方式3:动态实例工厂
我们在UserFactory.java修改代码如下,增加一个方法
package com.anthony.create;
import com.anthony.bean.User;
public class UserFactory {
public static User createUser() {
System.out.println("静态工厂创建User!!!");
return new User();
}
public User createUser2() {
System.out.println("实例工厂创建User!!!");
return new User();
}
}
配置文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<!-- 对象创建方式1:空参构造 -->
<bean name="user" class="com.anthony.bean.User" ></bean>
<!-- 对象创建方式2:静态工厂 -->
<bean name="user2" class="com.anthony.create.UserFactory" factory-method="createUser" ></bean>
<!-- 对象创建方式3:实例工厂 -->
<!-- 对象创建方式2:静态工厂 -->
<bean name="userFactory" class="com.anthony.create.UserFactory" ></bean>
<bean name="user3" factory-bean="userFactory" factory-method="createUser2" ></bean>
</beans>
方式3比较麻烦一点,需要配置两个bean对象。
Demo1的测试代码不变,运行下
User类的空参构造调用!!!
静态工厂创建User!!!
User类的空参构造调用!!!
实例工厂创建User!!!
User类的空参构造调用!!!
看最后两行,调用实例工厂创建User。
本篇就三个概念,Bean属性中的name和class属性详解,以及Spring容器中创建对象的三种方式,只需要掌握第一种就好,其他两种,了解就行。