Spring:三种实例化bean的方式、IOC 容器 BeanFactory & ApplicationContext

79 篇文章 1 订阅

使用类构造器

<!-- 使用类构造器实例化,class属性表示要使用的类的全限定名 -->

<beanid="userDao1"

    class="cn.itcast.e_createBeanInstance.UserDaoImpl">

</bean>


使用静态工厂


<!-- 使用静态工厂方法实例化

    class属性表示工厂类的全限定名

    factory-method属性表示这个工厂类中用于创建实例的静态方法名(必须是static的)

-->

<beanid="userDao2"

    class="cn.itcast.e_createBeanInstance.StaticDaoFactory"

    factory-method="createUserDaoInstance">

</bean>

publicclass StaticDaoFactory {

// 方法必须声明为static

    publicstatic Object createUserDaoInstance() {

       System.out.println("StaticDaoFactory.createUserDaoInstance()");

       returnnew UserDaoImpl();

    }

}

使用工厂方法

<!-- 使用实例化工厂对象中的方法实例化

    一、定义工厂bean

    二、定义这个bean是由工厂方法创建的,其中:

       factory-bean属性表示工厂bean的名称(idname

       factory-method属性表示这个工厂类中用于创建实例的方法名(不能是static的)

-->

<beanid="simpleDaoFactory"

class="cn.itcast.e_createBeanInstance.SimpleDaoFactory"></bean>

<beanid="userDao3"

    factory-bean="simpleDaoFactory"

    factory-method="createUserDaoInstance">

</bean>

publicclass SimpleDaoFactory {

    //方法不能声明为static

    publicstatic Object createUserDaoInstance() {

       System.out.println("SimpleDaoFactory.createUserDaoInstance()");

       returnnew UserDaoImpl();

    }

}



<!-- 通过工厂方法的方式来配置 bean -->
<!-- 1. 通过静态工厂方法: 一个类中有一个静态方法, 可以返回一个类的实例(了解) -->
<!-- 在 class 中指定静态工厂方法的全类名, 在 factory-method 中指定静态工厂方法的方法名 -->
<bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance">
<!-- 可以通过 constructor-arg 子节点为静态工厂方法指定参数 -->
<constructor-arg value="2"></constructor-arg>
</bean>

<!-- 2. 实例工厂方法: 先需要创建工厂对象, 再调用工厂的非静态方法返回实例(了解) -->
<!-- ①. 创建工厂对应的 bean -->
<bean id="simpleDateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd hh:mm:ss"></constructor-arg>
</bean>

<!-- ②. 有实例工厂方法来创建 bean 实例 -->
<!-- factory-bean 指向工厂 bean, factory-method 指定工厂方法(了解) -->
<bean id="datetime" factory-bean="simpleDateFormat" factory-method="parse">
<!-- 通过 constructor-arg 执行调用工厂方法需要传入的参数 -->
<constructor-arg value="1990-12-12 12:12:12"></constructor-arg>
</bean>

<!-- 配置通过 FactroyBean 的方式来创建 bean 的实例(了解) -->
<bean id="user" class="com.atguigu.spring.ref.UserBean"></bean>

UserBean实现FactoryBean接口,


Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean. 
工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象 

还可以添加其他的参数



在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用.
Spring 提供了两种类型的 IOC 容器实现. 
BeanFactory: IOC 容器的基本实现.
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口.
BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
无论使用何种方式, 配置文件时相同的.

ApplicationContext 的主要实现类:
ClassPathXmlApplicationContext:从 类路径下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
ConfigurableApplicationContext 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
ApplicationContext 在初始化上下文时就实例化所有单例的 Bean。

调用 ApplicationContext 的 getBean() 方法。


WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值