Spring 中创建 JavaBean——基于XML声明对象并获取

前言: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 来找到指定对象

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格子衫男孩boy

众筹治脱发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值