目录

任务描述

相关知识

创建Spring配置文件

Bean实例化的方式

编程要求

参考答案

applicationContext.xml

Task.java

运行截图


任务描述

本关任务:按照具体要求完成配置bean和获取bean对象等操作。

相关知识

Spring 的核心 IOC( Inverse of Control 反转控制 )所做的事就是将对象的创建权,交由 Spring 完成。

Peron p1 = new Person();    //自己手动完成

Person p2 = spring容器.get***();    //由spring容器创建

下面我们就一起学习 IOC 是如何将对象的创建权交给 Spring 管理的。为了完成本关任务,你需要掌握:1. Bean 标签的常用属性;2. Bean 在 Spring 配置文件中实例化的方式。

Bean标签的常用属性

  • id属性:用于指定配置对象的名称,不能包含特殊符号。

  • class属性:创建对象所在类的全路径。

  • name属性:功能同id属性一致,但是name属性值中可以包含特殊符号,若bean标签上没有id属性,那么name可以作为id使用。

  • scope属性:

    -singleton:默认值,单例,该模式下程序只有一个实例。

    -prototype:多例。每次从容器中调用bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new xxxBean():不会在容器启动时创建对象。

    -requestweb开发中,创建了一个对象,将这个对象存入request范围,request.setAttribute()

    -sessionweb开发中,创建了一个对象,将这个对象存入session范围,session.setAttribute()

    -globalSession:一般用于 Porlet 应用环境,指的是分布式开发;非 Porlet 环境,globalSession等同于session

    实际开发中主要使用singletonprototype

示例:

  • bean所在路径:

 applicationContext.xml配置文件: 

 测试文件:

public class Test {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Object bean = app.getBean("user");
        Object bean2 = app.getBean("user");
        System.out.println(bean==bean2);
    }
}

输出结果为:false

创建Spring配置文件

本实训中以eclipse开发软件为例,新建 Spring 的配置文件方式如下:

 创建成功后,项目中显示如下:

Bean实例化的方式

接下来我们就可以通过Spring的配置文件来创建对象了,即在配置文件中配置好一次bean后,我们可以在项目中任意位置通过容器的getBean方法进行访问bean的实例化有三种实现方式:

  • 无参数的构造方法(默认为创建无参构造)
package educoder;
public class Bean1 {
    public Bean1(){
    }
}
<!-- 等同于 bean1 = new educoder.Bean1(); class属性值为类的全路径-->
<bean id="bean1" class="educoder.Bean1"></bean>
  • 静态工厂实例化方法(了解)

如果一个bean不能通过new直接实例化,而是通过工厂类的某个静态方法创建的,需要把<bean>class属性配置为工厂类。

package educoder;
public class Bean2 {
}
public class Bean2Factory {
    public static Bean2 getbean2(){
        return new Bean2();
    }
}
<!-- 等同于 bean2 = educoder.Bean2Factory.getbean2(); -->
<bean id="bean2" class="educoder.Bean2Factory" factory-method="getbean2"></bean>
  • 实例工厂实例化方法(了解)

如果一个bean不能通过new直接实例化,而是通过工厂类的某个实例方法创建的,需要先配置工厂的<bean>标签,然后在需要创建的对象的bean标签的factory-bean属性配置为工厂类对象,factory-method属性配置为产生实例的方法。

package educoder;
public class Bean3 {
}
public class Bean3Factory {
    public Bean3 getbean3(){
        return new Bean3();
    }
}
<!-- 等同于 beanfactory = new educoder.Bean3Factory(); -->
<bean id="beanfactory" class="educoder.Bean3Factory"></bean>
<!-- 等同于 bean3 = beanfactory.getbean3(); -->
<bean id="bean3" factory-bean="beanfactory" factory-method="getbean3"></bean>

编程要求

根据提示,在右侧编辑器补充代码,具体要求如下:

  • 在配置文件中分别配置单例和多例的Dog类,Dog类全类名可通过右侧文件路径查看;

  • 完成Task类中getConfig()getSingle()getMultiton()三个方法:

    • getConfig()方法中实现获取Spring容器并返回,配置文件名为applicationContext.xml

    • getSingle()方法中通过ApplicationContext获取两个单例Dog类,先后两个类都调用setName()方法分别设置name属性值为大黄发菜

    • getMultiton()方法中通过ApplicationContext获取两个多例Dog类,先后两个类都调用setName()方法分别设置name属性值为大黄发菜

提示:通过容器使用getBean方法获取对象的返回值为Object类型,要使用对象中的属性或方法,需将其返回值强转为你所需对象类型。

测试说明

平台会对你编写的代码进行测试:

预期输出:


参考答案

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">

<!-- 配置单例Dog类 -->
<bean id="dog1" class="educoder.Dog" scope="singleton"></bean> 
<!-- 配置多例Dog类 --> 
<bean id="dog2" class="educoder.Dog" scope="prototype"></bean>
</beans>

Task.java

package step1;

import educoder.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;

public class Task {
	public ApplicationContext getConfig(){
		/********** Begin **********/
		ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
		return app;
		/********** End **********/
	}
	
	public List<Dog> getsingle(ApplicationContext app){
		List<Dog> list=new ArrayList<>();
		/********** Begin **********/
		Dog dog1 = app.getBean("dog1",Dog.class);
		dog1.setName("大黄");
		Dog dog2 = app.getBean("dog1",Dog.class);
		dog2.setName("发菜");
		list.add(dog1);
		list.add(dog2);
		/********** End **********/
		return list;
	}
	
	public List<Dog> getMultiton(ApplicationContext app){
		List<Dog> list=new ArrayList<>();
		/********** Begin **********/
		Dog dog1 = app.getBean("dog2",Dog.class);
		dog1.setName("大黄");
		Dog dog2 = app.getBean("dog2",Dog.class);
		dog2.setName("发菜");
		list.add(dog1);
		list.add(dog2);
		/********** End **********/
		return list;
	}
}

运行截图

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐