目录
任务描述
本关任务:按照具体要求完成配置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()
:不会在容器启动时创建对象。-
request
:web
开发中,创建了一个对象,将这个对象存入request
范围,request.setAttribute()
。-
session
:web
开发中,创建了一个对象,将这个对象存入session
范围,session.setAttribute()
。-
globalSession
:一般用于 Porlet 应用环境,指的是分布式开发;非 Porlet 环境,globalSession
等同于session
。实际开发中主要使用
singleton
,prototype
。
示例:
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;
}
}