前言:Spring 中并不使用 new Object() 方式创建出对象,但不方便项目的维护,Spring 框架中将创建的出来的 JavaBean 对象放入到 DI 容器中,让容器统一管理这些对象。Spring 框架中常用的两种创建 JavaBean 方式分别是:xml 声明法和 Annotation注解法。
使用 xml 声明法创建 JavaBean:xml 声明法是最原始,最有效的创建对象方法。它使用 DOM4J 和反射技术来生成对象。
实现 xml 声明,需要添加的依赖包,如图:
1.使用 xml 声明法创建对象
创建 Java 项目,创建一个User 类,添加上述的 jar 包,在 src 路径创建 applicationContext.xml 的配置文件,代码如下:
package com.aflypig.bean;
public class User {
public User() {
System.out.println("类 User 被实例化=" + this);
}
}
<?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="user1" class="com.aflypig.bean.User"></bean>
</beans>
在 Spring 框架中,对象存放在 DI 容器中,所以要在 applicationContext.xml 文件进行声明。声明作用是告诉 Spring 创建对象,使用<bean>声明对象的配置代码如下:
<bean id="user1" class="com.aflypig.bean.User"></bean>
创建测试运行 Test 类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
运行控制台结果 :由此可见 User 对象被创建
2.使用 xml 声明法创建对象并获取
修改 Test.java 类,如下:
import com.aflypig.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user1");
System.out.println(user);
}
}
运行控制台结果 :由此可见 User 对象被创建并获取:
3.使用 xml 声明法出现 NoUniqueBeanDefinitionException 异常及解决方法
在使用 getBean(class) 方法获取对象时,如果有多个对象同一个类型,则在获取对象时出现 NoUniqueBeanException 异常。
配置文件 applicationContext.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="user1" class="com.aflypig.bean.User"></bean>
<bean id="user2" class="com.aflypig.bean.User"></bean>
</beans>
修改 Test 类,如下:
import com.aflypig.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean(User.class);
System.out.println(user);
}
}
获取 User 对象时,控制台输出:
异常信息:Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.aflypig.bean.User' available: expected single matching bean but found 2: user1,user2
根据提示:Spring 找到两个对象,分别是 user1和user2,两者都属于User.class 类对象。Spring 并不知道获取哪一个,因此出现异常。
使用 getBean(class)获取对象,如果找到相同类型的对象时会出现异常,解决方法是使用重载方法getBean(String),根据对象在配置文件配置的 bean id 来指定对象。
如下代码:
import com.aflypig.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user1 = (User) context.getBean("user1");
User user2 = (User) context.getBean("user2");
System.out.println("User user1 = " + user1);
System.out.println("User user2 = " + user2);
}
}
运行结果:
通过实验结果可得:
- getBean(class):如果 DI 容器只有一个类实例时可以使用此方法。
- getBean(String):如果 DI 容器出现多个相同数据类型的对象时,要用getBean(String)写法来根据对象 id 来找到指定对象