欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaWeb学习-Spring框架-3-Spring配置详解之Bean元素和三种对象的创建方式

程序员文章站 2022-05-23 17:53:49
...

这篇开始,我们陆续来学习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这个包下。

JavaWeb学习-Spring框架-3-Spring配置详解之Bean元素和三种对象的创建方式

为了演示走的空参构造,我们在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;
	}
	
	
}

配置文件内容不变

JavaWeb学习-Spring框架-3-Spring配置详解之Bean元素和三种对象的创建方式

测试类,改一下配置文件的路径

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容器中创建对象的三种方式,只需要掌握第一种就好,其他两种,了解就行。