2021-08-26 Spring中的Bean, Bean的实例化方式

目标:

        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>元素的常用属性如下表所示:

属性或子元素名称描述
idBean的唯一标识符,Spring容器对Bean的配置、管理都通过该属性完成。        
nameSpring容器同样可以通过此属性对容器中的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);
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值