ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring创建bean的四种方式

2022-09-04 00:31:34  阅读:153  来源: 互联网

标签:容器 对象 Spring 接口 工厂 bean 创建 四种


获取bean对象代码:
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
app.getBean("userDao");----通过配置文件里bean的id值获得bean对象

1:通过反射调用构造方法创建bean对象:
--单例
无参构造:
<bean id="userDao" class="com...UserDaoImpl" scope="singleton"></bean>
有参构造(静态工厂方法和实例工厂方法同理):
<bean id="userDao" class="com...UserDaoImpl" scope="singleton">
<constructor-arg index="0" value="小明"/>
<constructor-arg index="1" value="男"/>
</bean>
--多例
<bean id="userDao" class="com...UserDaoImpl" scope="prototype"></bean>

constructor-arg:用于指定构造方法的参数值
index:构造方法中参数的位置,从0开始,依次递增
value:指定参数的值
ref:当插入的值为容器内其他bean的时候,这个值为容器中对应bean的名称
2:通过静态工厂方法创建bean对象:
<bean id="userDao" class="com...StaticFactory" factory-method="getUserDao" ></bean>

class:指定静态工厂完整的类名
factory-method:静态工厂中的静态方法,返回需要的对象

3:通过实例工厂方法创建bean对象:
<bean id="factory" class="com...DynamicFactory" ></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao" ></bean>

class:指定实例工厂完整的类名
factory-method:实例工厂中的方法,返回需要的对象
factory-bean:实例工厂bean对象,然后调用该对象中factory-method


4:通过FactoryBean来创建bean对象
前面我们学过了BeanFactory接口,BeanFactory是spring容器的顶层接口,而这里要说的是
FactoryBean,也是一个接口,这两个接口很容易搞混淆,FactoryBean可以让spring容器通过这个接口
的实现来创建我们需要的bean对象。
源码如下

public interface FactoryBean<T> {
/*** 返回创建好的对象 */
@Nullable T getObject() throws Exception;

/*** 返回需要创建的对象的类型 */
@Nullable Class<?> getObjectType();

/** * bean是否是单例的 **/
default boolean isSingleton() {
return true;
}
}

接口中有3个方法,前面2个方法需要我们去实现,getObject方法内部由开发者自己去实现对象的创
建,然后将创建好的对象返回给Spring容器,getObjectType需要指定我们创建的bean的类型;最后一
个方法isSingleton表示通过这个接口创建的对象是否是单例的,如果返回false,那么每次从容器中获取
对象的时候都会调用这个接口的getObject() 去生成bean对象。
最后一种方式因平常不怎么用,所以没有贴代码,感兴趣的可以实现接口试试。

标签:容器,对象,Spring,接口,工厂,bean,创建,四种
来源: https://www.cnblogs.com/pengshuai1014/p/16654076.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有