- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring实例化bean过程解析及完整代码示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
提出问题 。
Spring中Bean的实例化是Bean生命周期的一个重要环节,通常Bean初始化后将不再改变.
那么Spring实例Bean的过程到底是怎么样的呢?! 。
Spring实例化bean过程分析 。
要想获取到一个bean对象,得先通过BeanFactory的getBean()方法获取,期间会经过一系列步骤来实例化这个bean对象:
第一步:调用Bean的默认构造方法(当然也可以是指定的其它构造方法),生成bean实例:bean1.
第二步:检查Bean配置文件中是否注入了Bean的属性值,如果有注入,则在bean1实例的基础上对其属性进行注入,把原来的bean1给覆盖掉形成新的bean实例:bean2.
第三步:检查Bean是否实现了InitializingBean接口,如果实现了此接口,则调用afterPropertiesSet()方法对bean2进行相应操作后,把bean2覆盖形成新的bean实例:bean3.
第四步:检查Bean配置文件中是否指定了init-method此属性,如果已指定,则调用此属性对应方法并对bean3进行相应操作后,最终把bean3覆盖形成新的实例:bean4.
通过上面的步骤我们发现,Spring实例一个bean时,这个bean是在不断的变化的! 。
Spring实例化bean过程代码演示 。
为了更好的说明以上步骤,请看下面代码:
实体类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/**
* 实体类
*/
public
class
Employee
implements
InitializingBean, DisposableBean, BeanNameAware {
private
String id;
// 员工编号
private
String name;
// 员工姓名
private
String sex;
// 员工性别
private
String age;
// 员工年龄
private
String nativePlace;
// 员工籍贯
private
String department;
// 员工部门
private
String beanName;
// bean的名称
public
Employee() {
System.out.println(
"**********第一步:调用Bean的默认构造方法**********"
);
this
.id =
"bean1:G080405214"
;
System.out.println(
"bean1的 值:"
+
this
);
System.out.println(
"**********第二步:检查Bean配置文件中是否注入了Bean的属性值**********"
);
}
public
void
afterPropertiesSet()
throws
Exception {
System.out.println(
"bean2的值:"
+
this
);
System.out.println(
"**********第三步:检查Bean是否实现了InitializingBean接口**********"
);
this
.name =
"bean3:李晓红"
;
this
.sex =
"bean3:女"
;
this
.age =
"bean3:25"
;
System.out.println(
"bean3的值:"
+
this
);
}
public
void
init() {
System.out
.println(
"**********第四步:检查Bean配置文件中是否指定了init-method此属性**********"
);
this
.nativePlace =
"bean3:北京"
;
System.out.println(
"bean4的值:"
+
this
);
}
public
void
destroy()
throws
Exception {
System.out.println(
"**********服务停止**********"
);
}
public
void
setBeanName(String arg0) {
System.out.println(
"**********设置bean的名称**********"
);
this
.beanName =
"myBeanName"
;
}
public
String getId() {
return
id;
}
public
void
setId(String id) {
this
.id = id;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getSex() {
return
sex;
}
public
void
setSex(String sex) {
this
.sex = sex;
}
public
String getAge() {
return
age;
}
public
void
setAge(String age) {
this
.age = age;
}
public
String getNativePlace() {
return
nativePlace;
}
public
void
setNativePlace(String nativePlace) {
this
.nativePlace = nativePlace;
}
public
String getDepartment() {
return
department;
}
public
void
setDepartment(String department) {
this
.department = department;
}
public
String getBeanName() {
return
beanName;
}
@Override
public
String toString() {
return
"Employee [id="
+ id +
", name="
+ name +
", sex="
+ sex
+
", age="
+ age +
", nativePlace="
+ nativePlace
+
", department="
+ department +
", beanName="
+ beanName +
"]"
;
}
}
|
工具类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/**
* Bean上下文工具类
*/
public
class
BeanContextHelper {
private
static
ApplicationContext _instance;
static
{
if
(_instance ==
null
)
_instance = buildApplicationContext();
}
private
BeanContextHelper() {
}
/**
* 重新构建ApplicationContext对象
*/
public
static
ApplicationContext buildApplicationContext() {
return
new
ClassPathXmlApplicationContext(
"applicationContext-base.xml"
);
}
/**
* 获取一个ApplicationContext对象
*/
public
static
ApplicationContext getApplicationContext() {
return
_instance;
}
}
|
Spring的Bean配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:aop
=
"http://www.springframework.org/schema/aop"
xmlns:tx
=
"http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--==============测试Spring BeanFactory实例化Bean的过程-->
<
bean
id
=
"employee"
class
=
"bean_factory_test.Employee"
init-method
=
"init"
destroy-method
=
"destroy"
>
<!--默认部门为研发部的-->
<
property
name
=
"department"
>
<
value
>bean2:研发部</
value
>
</
property
>
</
bean
>
</
beans
>
|
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* BeanFactory实例化Bean工程测试类
*/
public
class
Test {
public
static
void
main(String args[]) {
Test test =
new
Test();
test.test();
}
public
void
test() {
ApplicationContext context = BeanContextHelper.getApplicationContext();
Employee employee = (Employee) context.getBean(
"employee"
);
System.out.println(
"**********从Spring BeanFactory获取到的最终bean实例**********"
);
System.out.println(
"最终bean的值:"
+ employee);
}
}
|
运行结果:
1
2
3
4
5
6
7
8
9
10
11
|
**********第一步:调用Bean的默认构造方法**********
bean1的 值:Employee [id=bean1:G080405214, name=null, sex=null, age=null, nativePlace=null, department=null, beanName=null]
**********第二步:检查Bean配置文件中是否注入了Bean的属性值**********
**********设置bean的名称**********
bean2的值:Employee [id=bean1:G080405214, name=null, sex=null, age=null, nativePlace=null, department=bean2:研发部, beanName=myBeanName]
**********第三步:检查Bean是否实现了InitializingBean接口**********
bean3的值:Employee [id=bean1:G080405214, name=bean3:李晓红, sex=bean3:女, age=bean3:25, nativePlace=null, department=bean2:研发部, beanName=myBeanName]
**********第四步:检查Bean配置文件中是否指定了init-method此属性**********
bean4的值:Employee [id=bean1:G080405214, name=bean3:李晓红, sex=bean3:女, age=bean3:25, nativePlace=bean3:北京, department=bean2:研发部, beanName=myBeanName]
**********从Spring BeanFactory获取到的最终bean实例**********
最终bean的值:Employee [id=bean1:G080405214, name=bean3:李晓红, sex=bean3:女, age=bean3:25, nativePlace=bean3:北京, department=bean2:研发部, beanName=myBeanName]
|
从运行结果看,我们应该很清楚Bean实例化的具体过程了.
Employee实现了3个接口:
InitializingBean:此接口提供afterPropertiesSet()方法,它的作用是为bean提供了定义初始化的功能。 DisposableBean:此接口提供destroy()方法,它的作用是在bean实例销毁前提供操作的功能。 BeanNameAware:此接口提供setBeanName()方法,它的作用是提供设置bean名称的功能,从上面的运行结果可以看出,此方法是在第二步进行的.
总结 。
以上就是本文关于Spring实例化bean的过程的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 。
原文链接:https://www.cnblogs.com/leskang/p/6411011.html 。
最后此篇关于Spring实例化bean过程解析及完整代码示例的文章就讲到这里了,如果你想了解更多关于Spring实例化bean过程解析及完整代码示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!