kim.zhang

风在前,无惧!


  • 首页

  • 标签42

  • 分类12

  • 归档94

  • 搜索

确定bean的运行时类型.md

发表于 2020-09-15 更新于 2021-11-21 分类于 Spring
本文字数: 2.4k 阅读时长 ≈ 2 分钟

Spring中创建bean的方式

xml配置文件

  1. 通过构造方法创建bean

如果不知道构造方法,默认使用无参构造方法:

1
<bean id="book" class="com.column.entity.Book"></bean>

class属性是必须的,如果没有指定class属性,会报以下错误:

1
Error creating bean with name 'book' defined in class path resource [spring-config.xml]: Instantiation of bean failed; nested exception is java.lang.IllegalStateException: No bean class specified on bean definition

bean的id只能指定一个且不能重复,但是name属性可以指定多个,使用,或;分隔。

name属性是对bean取别名,通过name和通过id获取的bean是同一个bean。

1
Bean name 'book' is already used in this <beans> element

若需要使用有参构造方法:

1
2
3
<bean id="book" name="b1;b2" class="com.column.entity.Book">
<constructor-arg name="name" value="Java"></constructor-arg>
</bean>
  1. 通过静态方法创建bean

    1
    2
    3
    4
    <!--    配置静态工厂,静态工厂创建对象的静态方法    -->
    <bean id="bookStaticFactory" class="com.column.factory.BookStaticFactory" factory-method="getBookInstance"></bean>
    <!-- 指定静态工厂创建bean -->
    <bean id="book" class="com.column.entity.Book" factory-bean="bookStaticFactory"></bean>

    factory-method这个属性是配置在静态工厂的bean上的。

    bean标签指定的class类型可以和静态工厂返回对象的类型不一样,在bean标签指定的class类型是通过构造方法创建对象时的实际类型,如果是通过静态工厂创建的对象,bean的实际类型是静态工厂返回对象的类型。

    静态工厂本身的对象不能通过&beanName来获取,因为它没有实现FactoryBean接口。

  1. 通过实例工厂创建bean

    1
    2
    3
    4
    <!--配置实例工厂-->
    <bean id="bookInstanceFactory" class="com.column.factory.BookInstanceFactory"></bean>
    <!--指定实例工厂创建bean-->
    <bean id="book" factory-bean="bookInstanceFactory" factory-method="getBookInstance"></bean>

    实例工厂的配置和静态工厂有一点不同,实例工厂的factory-method属性是配置在要创建的bean上的,而静态工厂是配置的工程类的bean上

    实例工厂不需要指定bean的class属性。

    实例工厂获取被创建的对象是通过对象的bean id获取,而不是通过工厂的bean id。而静态工厂获取被创建的对象是通过静态工厂的bean id获取。

    通过实例工厂bean id获取到的是实例工厂本身。

    实例工厂可以创建不同的对象,只要指定一个实例工厂,工厂里可以有多个实例方法来创建对象。

    1
    2
    3
    4
    5
    6
    <!--配置实例工厂-->
    <bean id="bookInstanceFactory" class="com.column.factory.BookInstanceFactory"></bean>
    <!--指定实例工厂的getBookInstance方法创建book实例-->
    <bean id="book" factory-bean="bookInstanceFactory" factory-method="getBookInstance"></bean>
    <!--指定实例工厂的getUserInstance方法创建user实例-->
    <bean id="user" factory-bean="bookInstanceFactory" factory-method="getUserInstance"/>

4.通过FactoryBean接口创建对象

1
2
3
<bean id="bookFactory" class="com.column.factory.BookFactory"></bean>

<bean id="book" class="com.column.entity.Book" factory-bean="bookFactory"/>

需要指定class属性,否则抛出异常。

这样配置,可以使用bean的构造方法来创建bean,也可以通过bookFactory来创建bean。使用bean的构造方法创建bean的实际类型取决于class属性,使用bookFactory创建bean的实际类型取决于bookFactory中getObjectType方法的返回值。

FactoryBean的实际类型是创建的对象的类型,如果需要获取FactoryBean的实例,需要使用&+beanName的方式。

一毛也是爱~
Kim.Zhang 微信支付

微信支付

# IOC
Resource接口.md
Spring Event.md
  • 文章目录
  • 站点概览
Kim.Zhang

Kim.Zhang

且行且珍惜
94 日志
12 分类
42 标签
E-Mail Weibo
  1. 1. Spring中创建bean的方式
    1. 1.1. xml配置文件
粵ICP备19091267号 © 2019 – 2022 Kim.Zhang | 629k | 9:32
本站总访问量 4 次 | 有 309 人看我的博客啦 |
博客全站共176.7k字
载入天数...载入时分秒...
0%