目标:
1、掌握实例化Bean的三种方式,Bea奥使用n的三种装配方式
2、掌握Bean的作用域和生命周期
3、掌握Bean的常用属性及其子元素
什么是Spring中的Bean?
Spring容器中的Bean就是Spring工厂中的产品,想要使用Bean就需要在配置文件中告诉它如何装配,以及需要使用什么方式装配。
Spring容器支持两种格式的配置文件:
1、Properties文件
2、XML文件(常用)
Xml配置文件:
XML配置文件的根元素是<beans>,<beans>中包含了多个<bean>子元素
每一个<bean>子元素定义了一个Bean,并描述了该Bean如何被装配到Spring容器中。
关于<beans>元素的常用属性如下表所示:
属性或子元素名称 | 描述 |
---|---|
id | Bean的唯一标识符,Spring容器对Bean的配置、管理都通过该属性完成。 |
name | Spring容器同样可以通过此属性对容器中的Bean进行配置和管理,name属性可以为Bean指定多个名称,逗号隔开。 |
class | 指定Bean的实现类,使用类的全限定名。 |
scope | 用来设定Bean实例作用域,属性值有:singleton(单例)、prototype(原型)、request、session、global Session、applicaion和websocket。 默认值为singleton。 |
property | <bean>元素的子元素,调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。 该元素name属性,指定Bean实例的相应属性名,ref或value用于指定参数值。 |
ref | <property>、<constructor-arg>等元素的属性或子元素,指定Bean工厂里面某个实例的引用 |
value | <property>、<constructor-arg>等元素的属性或子元素 |
list | 用于封装List或数组类型的依赖注入 |
set | 用于封装Set类型属性的依赖注入 |
map | 用于封装Map类型属性的依赖注入 |
entry | <map>元素的子元素,用于设置键值。key属性指定字符串类型的键值,ref或value子元素指定其值,也可通过value-ref或value属性指定其值 |
constructor-arg | <bean>元素的子元素,传入构造参数进行实例化。 该元素index属性制定构造参数的序号(从0开始),type属性指定构造参数类型,参数值可以通过ref属性或者value属性直接指定,或其子元素指定. |
Bean的定义,示例:
<?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-4.3.xsd">
//使用id属性定义bean1,对应的实现类为com.itheima.Bean1
<bean id="bean1" class="com.itheima.Bean1"></bean>
//使用name属性定义bean2,实现类com.itheima.Bean2
<bean name="bean2" class="com.itheima.Bean2"></bean>
//注:如果bean中未定义id或者name属性,则Spring会将class当做id使用
</beans>
//注:如果bean中未定义id或者name属性,则Spring会将class当做id使用
Bean为什么实例化:
在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean。
Bean的实例化 有三种方式:
1、构造器实例化(常用)
2、静态工厂方式实例化
3、实例工厂方式实例化
1、构造器实例化(常用)
通过Bean对应类中默认的无参构造方法来实例化Bean。
第一步:创建一个class类
package com.itheima.instance.constructor;
public class Bean1 {
}
第二步:创建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-4.3.xsd">
<bean id="bean1" class="com.itheima.instance.constructor.Bean1"></bean>
</beans>
第三步:创建测试main
package com.itheima.instance.constructor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceTest1 {
public static void main(String[] args) {
/*
* 创建一个字符串类型,命名为xmlPath的变量,并将xml配置文件的路径赋值给它
*/
String xmlPath= "com/itheima/instance/constructor/beans1.xml";
//ApplicationContext在加载配置文件时,对Bean进行实例化
ApplicationContext applicationContext= new ClassPathXmlApplicationContext(xmlPath);//将xmlPath路径引入
Bean1 bean=(Bean1) applicationContext.getBean("bean1");
System.out.println(bean);
}
}
2、静态工厂实例化:
静态工厂其Bean配置中的class属性所指定的不再是Bean实例的实现类,而是静态工厂类,同时还需要factory-method属性指定创建工厂的方法。
第一步:在包中,创建一个Bean2类
package com.ithema.instance.static_factory;
/*
* 第一步:创建一个Bean2类
*/
public class Bean2 {
}
第二步:
package com.ithema.instance.static_factory;
public class MyBean2Factory {
//第二步:创建一个静态方法,类型为Bean2,命名为createBean,
public static Bean2 createBean(){
return new Bean2();
}
}
第三步:
<?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-4.3.xsd">
<!-- 第三步:配置xml,由于是静态方法,
所以需要加 factory-method,来指定MyBean2Factory中的,createBean方法-->
<bean id="bean2"
class="com.ithema.instance.static_factory.MyBean2Factory" factory-method="createBean">
</bean>
</beans>
第四步:
package com.ithema.instance.static_factory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
* 使用构造方法,获取Spring容器中的Bean
*/
String xmlPath="com/ithema/instance/static_factory/beans2.xml";
//1、初始化spring,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
System.out.println(applicationContext.getBean("bean2"));
//2、
Bean2 bean2= (Bean2) applicationContext.getBean("bean2");
//3、调用
System.out.println(bean2);
//你会发现不管是applicationContext.getBean输出,还是bean2输出,都可以显示结果
}
}
3、实例工厂方式实例化
第一步:创建实体化类
package com.ithema.instance.factory;
/*
* 第一步:创建Bean3类
*/
public class Bean3 {
}
第二步:创建工厂类
package com.ithema.instance.factory;
/*
* 第二步:创建工厂类MyBean3Factory,并输出一行字符
*/
public class MyBean3Factory {
public MyBean3Factory(){
System.out.println("bean3工厂实例化中");
}
//在工厂类中定义了一个createBean方法,类型是Bean3
public Bean3 createBean(){
System.out.println("输出createBean");
return new Bean3();
}
}
第三步:创建配置文件
<?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-4.3.xsd">
<!-- 第三步:配置工厂 -->
<!-- -->
<bean id="myBean3Factory" class="com.ithema.instance.factory.MyBean3Factory" />
<!--使用factory-bean属性指向配置的实例工厂,这里指定id为myBean3Factory为实例工厂,
使用factory-method属性确定使用工厂中的哪个方法 ,这里指定使用工厂中的createBean方法-->
<bean id="bean3" factory-bean="myBean3Factory" factory-method="createBean"></bean>
</beans>
第四步:
package com.ithema.instance.factory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InstanceTest3 {
/*
* 第四步:测试类
*/
public static void main(String[] args) {
//1、定义字符串类型,命名为xmlPath的变量,将配置文件路径写入
String xmlPath="com/ithema/instance/factory/beans3.xml";
//2、初始化Spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlPath);
//通过applicationContext.getBean输出bean3
System.out.println(applicationContext.getBean("bean3"));
Bean3 bean3= (Bean3) applicationContext.getBean("bean3");
System.out.println(bean3);
}
}