Spring 实例化Bean的3种方式
创建Bean的实例有3种方式:
- 构造器方式
- 静态工厂方式
- 实例工厂方式
构造器方式
构造器方式是最简单,也是最常用的。
写一个Bean,
- 提供带参的构造器:使用带参的构造器创建bean的实例。
- 或者提供无参的构造器+setter方法:先使用无参的构造器创建对象,再调用setter方法注入依赖。
使用注解或xml文件配置bean,注入所需依赖。
此种方式是使用构造方法直接创建Bean的实例,不由工厂类负责生产Bean的实例。
静态工厂方式
需要创建一个工厂类,在工厂类中写一个静态方法,返回该Bean的一个实例。
1、写一个Bean,提供带参的构造器
public class Student {
private int no;
private String name;
private float score;
public Student(int no, String name, float score) {
this.no = no;
this.name = name;
this.score = score;
}
//......
}
2、写一个工厂类,用静态方法生产该Bean的实例
public class StudentFactory {
public static Student createStudent(int no,String name,float score) {
return new Student(no, name, score);
}
}
因为在工厂中使用的是静态方法来生产该Bean的实例,所以称为静态工厂方式。
一个工厂可以有多个静态方法,生产多个Bean的多种实例。
3、在xml文件中配置工厂类
<bean name="student" class="com.chy.utils.StudentFactory" factory-method="createStudent">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="chy"/>
<constructor-arg index="2" value="100"/>
</bean>
配置的是class="工厂类",因为是静态方法,直接通过工厂类调用,所以不需要工厂类的实例,也就不需要在xml文件中配置工厂类的实例。这个配置创建的是Student类的实例。
factory-method指定用哪个静态方法生产bean,<constructor-arg>给静态方法传入参数。
注解简化了配置,但注解只能进行简单的配置,复杂的配置还得在xml中配置。
通常注解、xml结合使用,简单的配置用注解,复杂的配置写在xml中。
4、使用
Student student = applicationContext.getBean("student", Student.class);
也可以使用空参构造器+setter方法注入,要麻烦些。只有1、2步不同:
1、提供空参构造器、setter方法
public class Student {
private int no;
private String name;
private float score;
public void setNo(int no) {
this.no = no;
}
public void setName(String name) {
this.name = name;
}
public void setScore(float score) {
this.score = score;
}
//......
}
2、先调用空参构造器创建实例,再调用setter方法赋值
public class StudentFactory {
public static Student createStudent(int no,String name,float score) {
Student student = new Student();
student.setNo(no);
student.setName(name);
student.setScore(score);
return student;
}
}
实例工厂方式
工厂中生产该Bean的方法不是静态的,在xml文件中需要同时配置工厂、该Bean。
1、写一个Bean,提供带参的构造器
2、写一个工厂类,用实例方法生产Bean(方法不用static修饰)
3、在xml文件中同时配置工厂类、该Bean
<bean name="studentFactory" class="com.chy.utils.StudentFactory" />
<bean name="student" class="com.chy.bean.Student" factory-bean="studentFactory" factory-method="createStudent">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="chy"/>
<constructor-arg index="2" value="100"/>
</bean>
因为没有使用static修饰方法,不能通过工厂类的类名来调用,只能通过工厂类的实例来调用,所以要配置工厂类的实例。
4、使用
Student student = applicationContext.getBean("student", Student.class);
同样可以使用空参构造器+setter方法的方式。
上面静态工厂、实例工厂的xml配置,都是直接生产目标类的实例。
创建实例需要传入实参,把实参写死在xml中,这显然不可取。上面的xml配置不常用。
一般只管理工厂类的实例:
<bean name="studentFactory" class="com.chy.utils.StudentFactory"/>
scope默认就是单例,不必显式配置。
在程序中通过工厂创建目标对象,实参可变化:
StudentFactory studentFactory = applicationContext.getBean("studentFactory", StudentFactory.class);
Student student = studentFactory.createStudent(1, "chy", 100);
静态工厂甚至不必进行配置,直接通过类名调用静态方法创建目标对象:
Student student = StudentFactory.createStudent(1, "chy", 100);
Spring 实例化Bean的3种方式的更多相关文章
- Spring实例化Bean的三种方式及Bean的类型
1.使用类构造器实例化 [默认的类构造器] <bean id=“orderService" class="cn.itcast.OrderServiceBean"/ ...
- Spring 实例化bean的三种方式
第一种方法:直接配置Bean <bena id="所需要实例化的一个实例名称" class="包名.类名"/> 例如: 配置文件中的bean.XML ...
- Spring实例化bean的几种方式
一,通过constructor实例化bean Spring可以实例化各种类型的类,不要求必须是JavaBean类型的类.在XML中配置类如下: <bean id="exampleBea ...
- Spring 实例化bean的三种方式:
方法一:使用构造器实例化bean java代码: package com.model; public class User { private String username; public User ...
- spring实例化bean的三种方式
公共使用的实体
- Spring学习之实例化bean的三种方式
实例化bean的三种方式 构造器实例化bean Person.java public class Person { private String name; private Integer age; ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- spring 注入bean的两种方式
我们都知道,使用spring框架时,不用再使用new来实例化对象了,直接可以通过spring容器来注入即可. 而注入bean有两种方式: 一种是通过XML来配置的,分别有属性注入.构造函数注入和工厂方 ...
- Spring获取bean的几种方式
工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean ...
随机推荐
- lightgbm GPU版本安装
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- fluid.io.load_inference_model 载入多个模型的时候会报错 -- [paddlepaddle]
将多个模型部署到同一个服务时,会出现stack错误. 原因是program为全局. 改成这样,可以解决. solved by myself. for those who need it:use a n ...
- linux删除文件的前n行
需求描述: 今天看了一个系统的临时文件,有5.6G的大小,这个文件也没有用了,想要将大部分的文件都删除掉. 在此记录下删除的过程.删除前n行的记录. 操作过程: 对于数据量比较大的情况(本例5800万 ...
- MQTT研究之EMQ:【eclipse的paho之java客户端使用注意事项】
这里,简单记录一下自己在最近项目中遇到的paho的心得,这里也涵盖EMQX的问题. 1. cleanSession 这个标识,是确保client和server之间是否持久化状态的一个标志,不管是cli ...
- 【转载】 tf.ConfigProto和tf.GPUOptions用法总结
原文地址: https://blog.csdn.net/C_chuxin/article/details/84990176 -------------------------------------- ...
- pycharm安装、首次使用及汉化
摘自:https://blog.csdn.net/qq_30463497/article/details/84992480 一.下载pycharm安装包打开PyCharm的官方下载地址:http:// ...
- docker批量删除镜像
docker rmi `docker images | grep swb | grep -v grep | awk '{print $3}'` 参考: https://blog.csdn.net/hi ...
- FastJson序列化时过滤字段(属性)的方法总结
FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法. 方法一.FastJson的注解 @JSONField(serialize ...
- rc.local添加tomcat服务启动命令,但是tomcat服务无法正常启动
遇到了一个特别坑的问题. 本来想着在rc.local文件里添加tomcat启动命令,使tomcat开机自启.之前在其他服务器上直接这样操作是没问题的,但很幸运的是,现在忽然就不行了. 开始排错: 1. ...
- [Swoole入门到进阶] [公开课] Swoole协程-Swoole4.4.4 提供 WaitGroup 功能
在 Swoole4 中可以使用 channel 实现协程间的通信.依赖管理.协程同步. 简单来说,WaitGroup 就是使用 channel 的机制,让主协程等待所有子协程结束后才退出的功能. Co ...