Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
哥特勇敢
Small Spring
提交
7795ca52
S
Small Spring
项目概览
哥特勇敢
/
Small Spring
与 Fork 源项目一致
Fork自
小傅哥 / Small Spring
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Small Spring
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
7795ca52
编写于
7月 25, 2021
作者:
小傅哥
⛹
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
第 09 章:虎行有雨,定义标记类型Aware接口,实现感知容器对象
上级
ee2cf246
变更
53
隐藏空白更改
内联
并排
Showing
53 changed file
with
2179 addition
and
0 deletion
+2179
-0
small-spring-step-08/LICENSE
small-spring-step-08/LICENSE
+201
-0
small-spring-step-08/pom.xml
small-spring-step-08/pom.xml
+110
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/BeansException.java
...ava/cn/bugstack/springframework/beans/BeansException.java
+18
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/PropertyValue.java
...java/cn/bugstack/springframework/beans/PropertyValue.java
+29
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/PropertyValues.java
...ava/cn/bugstack/springframework/beans/PropertyValues.java
+32
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/Aware.java
...java/cn/bugstack/springframework/beans/factory/Aware.java
+19
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanClassLoaderAware.java
...k/springframework/beans/factory/BeanClassLoaderAware.java
+19
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanFactory.java
...n/bugstack/springframework/beans/factory/BeanFactory.java
+18
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanFactoryAware.java
...stack/springframework/beans/factory/BeanFactoryAware.java
+19
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanNameAware.java
...bugstack/springframework/beans/factory/BeanNameAware.java
+19
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/ConfigurableListableBeanFactory.java
...mework/beans/factory/ConfigurableListableBeanFactory.java
+26
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/DisposableBean.java
...ugstack/springframework/beans/factory/DisposableBean.java
+17
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/HierarchicalBeanFactory.java
...pringframework/beans/factory/HierarchicalBeanFactory.java
+8
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/InitializingBean.java
...stack/springframework/beans/factory/InitializingBean.java
+23
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/ListableBeanFactory.java
...ck/springframework/beans/factory/ListableBeanFactory.java
+36
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/AutowireCapableBeanFactory.java
...work/beans/factory/config/AutowireCapableBeanFactory.java
+34
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanDefinition.java
.../springframework/beans/factory/config/BeanDefinition.java
+61
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanFactoryPostProcessor.java
...mework/beans/factory/config/BeanFactoryPostProcessor.java
+26
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanPostProcessor.java
...ringframework/beans/factory/config/BeanPostProcessor.java
+37
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanReference.java
...k/springframework/beans/factory/config/BeanReference.java
+22
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/ConfigurableBeanFactory.java
...amework/beans/factory/config/ConfigurableBeanFactory.java
+24
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/SingletonBeanRegistry.java
...framework/beans/factory/config/SingletonBeanRegistry.java
+15
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
...s/factory/support/AbstractAutowireCapableBeanFactory.java
+172
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/AbstractBeanDefinitionReader.java
...k/beans/factory/support/AbstractBeanDefinitionReader.java
+40
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/AbstractBeanFactory.java
...gframework/beans/factory/support/AbstractBeanFactory.java
+76
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/BeanDefinitionReader.java
...framework/beans/factory/support/BeanDefinitionReader.java
+28
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/BeanDefinitionRegistry.java
...amework/beans/factory/support/BeanDefinitionRegistry.java
+44
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
...actory/support/CglibSubclassingInstantiationStrategy.java
+26
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/DefaultListableBeanFactory.java
...ork/beans/factory/support/DefaultListableBeanFactory.java
+61
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java
...k/beans/factory/support/DefaultSingletonBeanRegistry.java
+50
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/DisposableBeanAdapter.java
...ramework/beans/factory/support/DisposableBeanAdapter.java
+48
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/InstantiationStrategy.java
...ramework/beans/factory/support/InstantiationStrategy.java
+19
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/SimpleInstantiationStrategy.java
...rk/beans/factory/support/SimpleInstantiationStrategy.java
+30
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/xml/XmlBeanDefinitionReader.java
...gframework/beans/factory/xml/XmlBeanDefinitionReader.java
+124
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/ApplicationContext.java
.../bugstack/springframework/context/ApplicationContext.java
+17
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/ApplicationContextAware.java
...tack/springframework/context/ApplicationContextAware.java
+21
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/ConfigurableApplicationContext.java
...ringframework/context/ConfigurableApplicationContext.java
+28
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/AbstractApplicationContext.java
...framework/context/support/AbstractApplicationContext.java
+100
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/AbstractRefreshableApplicationContext.java
...ontext/support/AbstractRefreshableApplicationContext.java
+40
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/AbstractXmlApplicationContext.java
...mework/context/support/AbstractXmlApplicationContext.java
+28
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/ApplicationContextAwareProcessor.java
...ork/context/support/ApplicationContextAwareProcessor.java
+34
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/ClassPathXmlApplicationContext.java
...ework/context/support/ClassPathXmlApplicationContext.java
+49
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/ClassPathResource.java
...n/bugstack/springframework/core/io/ClassPathResource.java
+35
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/DefaultResourceLoader.java
...gstack/springframework/core/io/DefaultResourceLoader.java
+26
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/FileSystemResource.java
.../bugstack/springframework/core/io/FileSystemResource.java
+33
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/Resource.java
...in/java/cn/bugstack/springframework/core/io/Resource.java
+10
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/ResourceLoader.java
...a/cn/bugstack/springframework/core/io/ResourceLoader.java
+12
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/UrlResource.java
...java/cn/bugstack/springframework/core/io/UrlResource.java
+34
-0
small-spring-step-08/src/main/java/cn/bugstack/springframework/util/ClassUtils.java
...ain/java/cn/bugstack/springframework/util/ClassUtils.java
+20
-0
small-spring-step-08/src/test/java/cn/bugstack/springframework/test/ApiTest.java
...c/test/java/cn/bugstack/springframework/test/ApiTest.java
+30
-0
small-spring-step-08/src/test/java/cn/bugstack/springframework/test/bean/UserDao.java
...t/java/cn/bugstack/springframework/test/bean/UserDao.java
+30
-0
small-spring-step-08/src/test/java/cn/bugstack/springframework/test/bean/UserService.java
...va/cn/bugstack/springframework/test/bean/UserService.java
+88
-0
small-spring-step-08/src/test/resources/spring.xml
small-spring-step-08/src/test/resources/spring.xml
+13
-0
未找到文件。
small-spring-step-08/LICENSE
0 → 100644
浏览文件 @
7795ca52
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
small-spring-step-08/pom.xml
0 → 100755
浏览文件 @
7795ca52
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<groupId>
cn.bugstack.springframework
</groupId>
<artifactId>
small-spring-step-08
</artifactId>
<version>
1.0-SNAPSHOT
</version>
<packaging>
jar
</packaging>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<project.reporting.outputEncoding>
UTF-8
</project.reporting.outputEncoding>
</properties>
<name>
small-spring-step-08
</name>
<description>
small spring is easy study Spring!
</description>
<url>
https://github.com/fuzhengwei/small-spring
</url>
<developers>
<developer>
<id>
small-spring
</id>
<name>
小傅哥
</name>
<email>
184172133@qq.com
</email>
</developer>
</developers>
<licenses>
<license>
<name>
The MIT License
</name>
<distribution>
repo
</distribution>
</license>
</licenses>
<dependencies>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>
cglib
</groupId>
<artifactId>
cglib
</artifactId>
<version>
3.3.0
</version>
</dependency>
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
<version>
5.5.0
</version>
</dependency>
<dependency>
<groupId>
junit
</groupId>
<artifactId>
junit
</artifactId>
<version>
4.7
</version>
<scope>
test
</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-compiler-plugin
</artifactId>
<version>
3.1
</version>
<configuration>
<source>
1.8
</source>
<target>
1.8
</target>
<encoding>
UTF-8
</encoding>
</configuration>
</plugin>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-resources-plugin
</artifactId>
<version>
2.6
</version>
<configuration>
<encoding>
UTF-8
</encoding>
</configuration>
</plugin>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-source-plugin
</artifactId>
<version>
2.2.1
</version>
<executions>
<execution>
<id>
attach-sources
</id>
<goals>
<goal>
jar
</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-javadoc-plugin
</artifactId>
<version>
2.9.1
</version>
<configuration>
<encoding>
UTF-8
</encoding>
</configuration>
<executions>
<execution>
<id>
attach-javadocs
</id>
<goals>
<goal>
jar
</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/BeansException.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
BeansException
extends
RuntimeException
{
public
BeansException
(
String
msg
)
{
super
(
msg
);
}
public
BeansException
(
String
msg
,
Throwable
cause
)
{
super
(
msg
,
cause
);
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/PropertyValue.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*
* bean 属性信息
*/
public
class
PropertyValue
{
private
final
String
name
;
private
final
Object
value
;
public
PropertyValue
(
String
name
,
Object
value
)
{
this
.
name
=
name
;
this
.
value
=
value
;
}
public
String
getName
()
{
return
name
;
}
public
Object
getValue
()
{
return
value
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/PropertyValues.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
PropertyValues
{
private
final
List
<
PropertyValue
>
propertyValueList
=
new
ArrayList
<>();
public
void
addPropertyValue
(
PropertyValue
pv
)
{
this
.
propertyValueList
.
add
(
pv
);
}
public
PropertyValue
[]
getPropertyValues
()
{
return
this
.
propertyValueList
.
toArray
(
new
PropertyValue
[
0
]);
}
public
PropertyValue
getPropertyValue
(
String
propertyName
)
{
for
(
PropertyValue
pv
:
this
.
propertyValueList
)
{
if
(
pv
.
getName
().
equals
(
propertyName
))
{
return
pv
;
}
}
return
null
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/Aware.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
/**
* Marker superinterface indicating that a bean is eligible to be
* notified by the Spring container of a particular framework object
* through a callback-style method. Actual method signature is
* determined by individual subinterfaces, but should typically
* consist of just one void-returning method that accepts a single
* argument.
*
* 标记类接口,实现该接口可以被Spring容器感知
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
Aware
{
}
\ No newline at end of file
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanClassLoaderAware.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
/**
* Callback that allows a bean to be aware of the bean
* {@link ClassLoader class loader}; that is, the class loader used by the
* present bean factory to load bean classes.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanClassLoaderAware
extends
Aware
{
void
setBeanClassLoader
(
ClassLoader
classLoader
);
}
\ No newline at end of file
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
import
cn.bugstack.springframework.beans.BeansException
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanFactory
{
Object
getBean
(
String
name
)
throws
BeansException
;
Object
getBean
(
String
name
,
Object
...
args
)
throws
BeansException
;
<
T
>
T
getBean
(
String
name
,
Class
<
T
>
requiredType
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanFactoryAware.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
import
cn.bugstack.springframework.beans.BeansException
;
/**
* Interface to be implemented by beans that wish to be aware of their
* owning {@link BeanFactory}.
*
* 实现此接口,既能感知到所属的 BeanFactory
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanFactoryAware
extends
Aware
{
void
setBeanFactory
(
BeanFactory
beanFactory
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/BeanNameAware.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
/**
* Interface to be implemented by beans that want to be aware of their
* bean name in a bean factory. Note that it is not usually recommended
* that an object depend on its bean name, as this represents a potentially
* brittle dependence on external configuration, as well as a possibly
* unnecessary dependence on a Spring API.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanNameAware
extends
Aware
{
void
setBeanName
(
String
name
);
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/ConfigurableListableBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.config.AutowireCapableBeanFactory
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
cn.bugstack.springframework.beans.factory.config.BeanPostProcessor
;
import
cn.bugstack.springframework.beans.factory.config.ConfigurableBeanFactory
;
/**
* Configuration interface to be implemented by most listable bean factories.
* In addition to {@link ConfigurableBeanFactory}, it provides facilities to
* analyze and modify bean definitions, and to pre-instantiate singletons.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
ConfigurableListableBeanFactory
extends
ListableBeanFactory
,
AutowireCapableBeanFactory
,
ConfigurableBeanFactory
{
BeanDefinition
getBeanDefinition
(
String
beanName
)
throws
BeansException
;
void
preInstantiateSingletons
()
throws
BeansException
;
void
addBeanPostProcessor
(
BeanPostProcessor
beanPostProcessor
);
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/DisposableBean.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
/**
* Interface to be implemented by beans that want to release resources
* on destruction. A BeanFactory is supposed to invoke the destroy
* method if it disposes a cached singleton. An application context
* is supposed to dispose all of its singletons on close.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
DisposableBean
{
void
destroy
()
throws
Exception
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/HierarchicalBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
/**
* Sub-interface implemented by bean factories that can be part
* of a hierarchy.
*/
public
interface
HierarchicalBeanFactory
extends
BeanFactory
{
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/InitializingBean.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
/**
* Interface to be implemented by beans that need to react once all their
* properties have been set by a BeanFactory: for example, to perform custom
* initialization, or merely to check that all mandatory properties have been set.
*
* 实现此接口的 Bean 对象,会在 BeanFactory 设置属性后作出相应的处理,如:执行自定义初始化,或者仅仅检查是否设置了所有强制属性。
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
InitializingBean
{
/**
* Bean 处理了属性填充后调用
*
* @throws Exception
*/
void
afterPropertiesSet
()
throws
Exception
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/ListableBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory
;
import
cn.bugstack.springframework.beans.BeansException
;
import
java.util.Map
;
/**
* Extension of the {@link BeanFactory} interface to be implemented by bean factories
* that can enumerate all their bean instances, rather than attempting bean lookup
* by name one by one as requested by clients. BeanFactory implementations that
* preload all their bean definitions (such as XML-based factories) may implement
* this interface.
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
ListableBeanFactory
extends
BeanFactory
{
/**
* 按照类型返回 Bean 实例
* @param type
* @param <T>
* @return
* @throws BeansException
*/
<
T
>
Map
<
String
,
T
>
getBeansOfType
(
Class
<
T
>
type
)
throws
BeansException
;
/**
* Return the names of all beans defined in this registry.
*
* 返回注册表中所有的Bean名称
*/
String
[]
getBeanDefinitionNames
();
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/AutowireCapableBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.BeanFactory
;
/**
* Extension of the {@link cn.bugstack.springframework.beans.factory.BeanFactory}
* interface to be implemented by bean factories that are capable of
* autowiring, provided that they want to expose this functionality for
* existing bean instances.
*/
public
interface
AutowireCapableBeanFactory
extends
BeanFactory
{
/**
* 执行 BeanPostProcessors 接口实现类的 postProcessBeforeInitialization 方法
*
* @param existingBean
* @param beanName
* @return
* @throws BeansException
*/
Object
applyBeanPostProcessorsBeforeInitialization
(
Object
existingBean
,
String
beanName
)
throws
BeansException
;
/**
* 执行 BeanPostProcessors 接口实现类的 postProcessorsAfterInitialization 方法
*
* @param existingBean
* @param beanName
* @return
* @throws BeansException
*/
Object
applyBeanPostProcessorsAfterInitialization
(
Object
existingBean
,
String
beanName
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanDefinition.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
import
cn.bugstack.springframework.beans.PropertyValues
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
BeanDefinition
{
private
Class
beanClass
;
private
PropertyValues
propertyValues
;
private
String
initMethodName
;
private
String
destroyMethodName
;
public
BeanDefinition
(
Class
beanClass
)
{
this
.
beanClass
=
beanClass
;
this
.
propertyValues
=
new
PropertyValues
();
}
public
BeanDefinition
(
Class
beanClass
,
PropertyValues
propertyValues
)
{
this
.
beanClass
=
beanClass
;
this
.
propertyValues
=
propertyValues
!=
null
?
propertyValues
:
new
PropertyValues
();
}
public
Class
getBeanClass
()
{
return
beanClass
;
}
public
void
setBeanClass
(
Class
beanClass
)
{
this
.
beanClass
=
beanClass
;
}
public
PropertyValues
getPropertyValues
()
{
return
propertyValues
;
}
public
void
setPropertyValues
(
PropertyValues
propertyValues
)
{
this
.
propertyValues
=
propertyValues
;
}
public
String
getInitMethodName
()
{
return
initMethodName
;
}
public
void
setInitMethodName
(
String
initMethodName
)
{
this
.
initMethodName
=
initMethodName
;
}
public
String
getDestroyMethodName
()
{
return
destroyMethodName
;
}
public
void
setDestroyMethodName
(
String
destroyMethodName
)
{
this
.
destroyMethodName
=
destroyMethodName
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanFactoryPostProcessor.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.ConfigurableListableBeanFactory
;
/**
* Allows for custom modification of an application context's bean definitions,
* adapting the bean property values of the context's underlying bean factory.
*
* 允许自定义修改 BeanDefinition 属性信息
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanFactoryPostProcessor
{
/**
* 在所有的 BeanDefinition 加载完成后,实例化 Bean 对象之前,提供修改 BeanDefinition 属性的机制
*
* @param beanFactory
* @throws BeansException
*/
void
postProcessBeanFactory
(
ConfigurableListableBeanFactory
beanFactory
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanPostProcessor.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
import
cn.bugstack.springframework.beans.BeansException
;
/**
* Factory hook that allows for custom modification of new bean instances,
* e.g. checking for marker interfaces or wrapping them with proxies.
*
* 用于修改新实例化 Bean 对象的扩展点
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanPostProcessor
{
/**
* 在 Bean 对象执行初始化方法之前,执行此方法
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
Object
postProcessBeforeInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
;
/**
* 在 Bean 对象执行初始化方法之后,执行此方法
*
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
Object
postProcessAfterInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/BeanReference.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*
* Bean 的引用
*/
public
class
BeanReference
{
private
final
String
beanName
;
public
BeanReference
(
String
beanName
)
{
this
.
beanName
=
beanName
;
}
public
String
getBeanName
()
{
return
beanName
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/ConfigurableBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
import
cn.bugstack.springframework.beans.factory.HierarchicalBeanFactory
;
/**
* Configuration interface to be implemented by most bean factories. Provides
* facilities to configure a bean factory, in addition to the bean factory
* client methods in the {@link cn.bugstack.springframework.beans.factory.BeanFactory}
* interface.
*/
public
interface
ConfigurableBeanFactory
extends
HierarchicalBeanFactory
,
SingletonBeanRegistry
{
String
SCOPE_SINGLETON
=
"singleton"
;
String
SCOPE_PROTOTYPE
=
"prototype"
;
void
addBeanPostProcessor
(
BeanPostProcessor
beanPostProcessor
);
/**
* 销毁单例对象
*/
void
destroySingletons
();
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/config/SingletonBeanRegistry.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.config
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*
* 单例注册表
*/
public
interface
SingletonBeanRegistry
{
Object
getSingleton
(
String
beanName
);
}
\ No newline at end of file
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.PropertyValue
;
import
cn.bugstack.springframework.beans.PropertyValues
;
import
cn.bugstack.springframework.beans.factory.*
;
import
cn.bugstack.springframework.beans.factory.config.AutowireCapableBeanFactory
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
cn.bugstack.springframework.beans.factory.config.BeanPostProcessor
;
import
cn.bugstack.springframework.beans.factory.config.BeanReference
;
import
cn.bugstack.springframework.context.ApplicationContextAware
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.util.StrUtil
;
import
java.lang.reflect.Constructor
;
import
java.lang.reflect.Method
;
/**
* Abstract bean factory superclass that implements default bean creation,
* with the full capabilities specified by the class.
* Implements the {@link cn.bugstack.springframework.beans.factory.config.AutowireCapableBeanFactory}
* interface in addition to AbstractBeanFactory's {@link #createBean} method.
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
abstract
class
AbstractAutowireCapableBeanFactory
extends
AbstractBeanFactory
implements
AutowireCapableBeanFactory
{
private
InstantiationStrategy
instantiationStrategy
=
new
CglibSubclassingInstantiationStrategy
();
@Override
protected
Object
createBean
(
String
beanName
,
BeanDefinition
beanDefinition
,
Object
[]
args
)
throws
BeansException
{
Object
bean
=
null
;
try
{
bean
=
createBeanInstance
(
beanDefinition
,
beanName
,
args
);
// 给 Bean 填充属性
applyPropertyValues
(
beanName
,
bean
,
beanDefinition
);
// 执行 Bean 的初始化方法和 BeanPostProcessor 的前置和后置处理方法
bean
=
initializeBean
(
beanName
,
bean
,
beanDefinition
);
}
catch
(
Exception
e
)
{
throw
new
BeansException
(
"Instantiation of bean failed"
,
e
);
}
// 注册实现了 DisposableBean 接口的 Bean 对象
registerDisposableBeanIfNecessary
(
beanName
,
bean
,
beanDefinition
);
addSingleton
(
beanName
,
bean
);
return
bean
;
}
protected
void
registerDisposableBeanIfNecessary
(
String
beanName
,
Object
bean
,
BeanDefinition
beanDefinition
)
{
if
(
bean
instanceof
DisposableBean
||
StrUtil
.
isNotEmpty
(
beanDefinition
.
getDestroyMethodName
()))
{
registerDisposableBean
(
beanName
,
new
DisposableBeanAdapter
(
bean
,
beanName
,
beanDefinition
));
}
}
protected
Object
createBeanInstance
(
BeanDefinition
beanDefinition
,
String
beanName
,
Object
[]
args
)
{
Constructor
constructorToUse
=
null
;
Class
<?>
beanClass
=
beanDefinition
.
getBeanClass
();
Constructor
<?>[]
declaredConstructors
=
beanClass
.
getDeclaredConstructors
();
for
(
Constructor
ctor
:
declaredConstructors
)
{
if
(
null
!=
args
&&
ctor
.
getParameterTypes
().
length
==
args
.
length
)
{
constructorToUse
=
ctor
;
break
;
}
}
return
getInstantiationStrategy
().
instantiate
(
beanDefinition
,
beanName
,
constructorToUse
,
args
);
}
/**
* Bean 属性填充
*/
protected
void
applyPropertyValues
(
String
beanName
,
Object
bean
,
BeanDefinition
beanDefinition
)
{
try
{
PropertyValues
propertyValues
=
beanDefinition
.
getPropertyValues
();
for
(
PropertyValue
propertyValue
:
propertyValues
.
getPropertyValues
())
{
String
name
=
propertyValue
.
getName
();
Object
value
=
propertyValue
.
getValue
();
if
(
value
instanceof
BeanReference
)
{
// A 依赖 B,获取 B 的实例化
BeanReference
beanReference
=
(
BeanReference
)
value
;
value
=
getBean
(
beanReference
.
getBeanName
());
}
// 属性填充
BeanUtil
.
setFieldValue
(
bean
,
name
,
value
);
}
}
catch
(
Exception
e
)
{
throw
new
BeansException
(
"Error setting property values:"
+
beanName
);
}
}
public
InstantiationStrategy
getInstantiationStrategy
()
{
return
instantiationStrategy
;
}
public
void
setInstantiationStrategy
(
InstantiationStrategy
instantiationStrategy
)
{
this
.
instantiationStrategy
=
instantiationStrategy
;
}
private
Object
initializeBean
(
String
beanName
,
Object
bean
,
BeanDefinition
beanDefinition
)
{
// invokeAwareMethods
if
(
bean
instanceof
Aware
)
{
if
(
bean
instanceof
BeanFactoryAware
)
{
((
BeanFactoryAware
)
bean
).
setBeanFactory
(
this
);
}
if
(
bean
instanceof
BeanClassLoaderAware
){
((
BeanClassLoaderAware
)
bean
).
setBeanClassLoader
(
getBeanClassLoader
());
}
if
(
bean
instanceof
BeanNameAware
)
{
((
BeanNameAware
)
bean
).
setBeanName
(
beanName
);
}
}
// 1. 执行 BeanPostProcessor Before 处理
Object
wrappedBean
=
applyBeanPostProcessorsBeforeInitialization
(
bean
,
beanName
);
// 执行 Bean 对象的初始化方法
try
{
invokeInitMethods
(
beanName
,
wrappedBean
,
beanDefinition
);
}
catch
(
Exception
e
)
{
throw
new
BeansException
(
"Invocation of init method of bean["
+
beanName
+
"] failed"
,
e
);
}
// 2. 执行 BeanPostProcessor After 处理
wrappedBean
=
applyBeanPostProcessorsAfterInitialization
(
bean
,
beanName
);
return
wrappedBean
;
}
private
void
invokeInitMethods
(
String
beanName
,
Object
bean
,
BeanDefinition
beanDefinition
)
throws
Exception
{
// 1. 实现接口 InitializingBean
if
(
bean
instanceof
InitializingBean
)
{
((
InitializingBean
)
bean
).
afterPropertiesSet
();
}
// 2. 注解配置 init-method {判断是为了避免二次执行销毁}
String
initMethodName
=
beanDefinition
.
getInitMethodName
();
if
(
StrUtil
.
isNotEmpty
(
initMethodName
))
{
Method
initMethod
=
beanDefinition
.
getBeanClass
().
getMethod
(
initMethodName
);
if
(
null
==
initMethod
)
{
throw
new
BeansException
(
"Could not find an init method named '"
+
initMethodName
+
"' on bean with name '"
+
beanName
+
"'"
);
}
initMethod
.
invoke
(
bean
);
}
}
@Override
public
Object
applyBeanPostProcessorsBeforeInitialization
(
Object
existingBean
,
String
beanName
)
throws
BeansException
{
Object
result
=
existingBean
;
for
(
BeanPostProcessor
processor
:
getBeanPostProcessors
())
{
Object
current
=
processor
.
postProcessBeforeInitialization
(
result
,
beanName
);
if
(
null
==
current
)
return
result
;
result
=
current
;
}
return
result
;
}
@Override
public
Object
applyBeanPostProcessorsAfterInitialization
(
Object
existingBean
,
String
beanName
)
throws
BeansException
{
Object
result
=
existingBean
;
for
(
BeanPostProcessor
processor
:
getBeanPostProcessors
())
{
Object
current
=
processor
.
postProcessAfterInitialization
(
result
,
beanName
);
if
(
null
==
current
)
return
result
;
result
=
current
;
}
return
result
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/AbstractBeanDefinitionReader.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.core.io.DefaultResourceLoader
;
import
cn.bugstack.springframework.core.io.ResourceLoader
;
/**
* Abstract base class for bean definition readers which implement
* the {@link BeanDefinitionReader} interface.
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
abstract
class
AbstractBeanDefinitionReader
implements
BeanDefinitionReader
{
private
final
BeanDefinitionRegistry
registry
;
private
ResourceLoader
resourceLoader
;
protected
AbstractBeanDefinitionReader
(
BeanDefinitionRegistry
registry
)
{
this
(
registry
,
new
DefaultResourceLoader
());
}
public
AbstractBeanDefinitionReader
(
BeanDefinitionRegistry
registry
,
ResourceLoader
resourceLoader
)
{
this
.
registry
=
registry
;
this
.
resourceLoader
=
resourceLoader
;
}
@Override
public
BeanDefinitionRegistry
getRegistry
()
{
return
registry
;
}
@Override
public
ResourceLoader
getResourceLoader
()
{
return
resourceLoader
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/AbstractBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.BeanFactory
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
cn.bugstack.springframework.beans.factory.config.BeanPostProcessor
;
import
cn.bugstack.springframework.beans.factory.config.ConfigurableBeanFactory
;
import
cn.bugstack.springframework.util.ClassUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
* <p>
* BeanDefinition注册表接口
*/
public
abstract
class
AbstractBeanFactory
extends
DefaultSingletonBeanRegistry
implements
ConfigurableBeanFactory
{
/** ClassLoader to resolve bean class names with, if necessary */
private
ClassLoader
beanClassLoader
=
ClassUtils
.
getDefaultClassLoader
();
/** BeanPostProcessors to apply in createBean */
private
final
List
<
BeanPostProcessor
>
beanPostProcessors
=
new
ArrayList
<
BeanPostProcessor
>();
@Override
public
Object
getBean
(
String
name
)
throws
BeansException
{
return
doGetBean
(
name
,
null
);
}
@Override
public
Object
getBean
(
String
name
,
Object
...
args
)
throws
BeansException
{
return
doGetBean
(
name
,
args
);
}
@Override
public
<
T
>
T
getBean
(
String
name
,
Class
<
T
>
requiredType
)
throws
BeansException
{
return
(
T
)
getBean
(
name
);
}
protected
<
T
>
T
doGetBean
(
final
String
name
,
final
Object
[]
args
)
{
Object
bean
=
getSingleton
(
name
);
if
(
bean
!=
null
)
{
return
(
T
)
bean
;
}
BeanDefinition
beanDefinition
=
getBeanDefinition
(
name
);
return
(
T
)
createBean
(
name
,
beanDefinition
,
args
);
}
protected
abstract
BeanDefinition
getBeanDefinition
(
String
beanName
)
throws
BeansException
;
protected
abstract
Object
createBean
(
String
beanName
,
BeanDefinition
beanDefinition
,
Object
[]
args
)
throws
BeansException
;
@Override
public
void
addBeanPostProcessor
(
BeanPostProcessor
beanPostProcessor
){
this
.
beanPostProcessors
.
remove
(
beanPostProcessor
);
this
.
beanPostProcessors
.
add
(
beanPostProcessor
);
}
/**
* Return the list of BeanPostProcessors that will get applied
* to beans created with this factory.
*/
public
List
<
BeanPostProcessor
>
getBeanPostProcessors
()
{
return
this
.
beanPostProcessors
;
}
public
ClassLoader
getBeanClassLoader
()
{
return
this
.
beanClassLoader
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/BeanDefinitionReader.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.core.io.Resource
;
import
cn.bugstack.springframework.core.io.ResourceLoader
;
/**
* Simple interface for bean definition readers.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanDefinitionReader
{
BeanDefinitionRegistry
getRegistry
();
ResourceLoader
getResourceLoader
();
void
loadBeanDefinitions
(
Resource
resource
)
throws
BeansException
;
void
loadBeanDefinitions
(
Resource
...
resources
)
throws
BeansException
;
void
loadBeanDefinitions
(
String
location
)
throws
BeansException
;
void
loadBeanDefinitions
(
String
...
locations
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/BeanDefinitionRegistry.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
BeanDefinitionRegistry
{
/**
* 向注册表中注册 BeanDefinition
*
* @param beanName
* @param beanDefinition
*/
void
registerBeanDefinition
(
String
beanName
,
BeanDefinition
beanDefinition
);
/**
* 使用Bean名称查询BeanDefinition
*
* @param beanName
* @return
* @throws BeansException
*/
BeanDefinition
getBeanDefinition
(
String
beanName
)
throws
BeansException
;
/**
* 判断是否包含指定名称的BeanDefinition
* @param beanName
* @return
*/
boolean
containsBeanDefinition
(
String
beanName
);
/**
* Return the names of all beans defined in this registry.
*
* 返回注册表中所有的Bean名称
*/
String
[]
getBeanDefinitionNames
();
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/CglibSubclassingInstantiationStrategy.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
net.sf.cglib.proxy.Enhancer
;
import
net.sf.cglib.proxy.NoOp
;
import
java.lang.reflect.Constructor
;
public
class
CglibSubclassingInstantiationStrategy
implements
InstantiationStrategy
{
@Override
public
Object
instantiate
(
BeanDefinition
beanDefinition
,
String
beanName
,
Constructor
ctor
,
Object
[]
args
)
throws
BeansException
{
Enhancer
enhancer
=
new
Enhancer
();
enhancer
.
setSuperclass
(
beanDefinition
.
getBeanClass
());
enhancer
.
setCallback
(
new
NoOp
()
{
@Override
public
int
hashCode
()
{
return
super
.
hashCode
();
}
});
if
(
null
==
ctor
)
return
enhancer
.
create
();
return
enhancer
.
create
(
ctor
.
getParameterTypes
(),
args
);
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/DefaultListableBeanFactory.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.ConfigurableListableBeanFactory
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
cn.bugstack.springframework.beans.factory.config.ConfigurableBeanFactory
;
import
java.util.Arrays
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
DefaultListableBeanFactory
extends
AbstractAutowireCapableBeanFactory
implements
BeanDefinitionRegistry
,
ConfigurableListableBeanFactory
{
private
Map
<
String
,
BeanDefinition
>
beanDefinitionMap
=
new
ConcurrentHashMap
<>();
@Override
public
void
registerBeanDefinition
(
String
beanName
,
BeanDefinition
beanDefinition
)
{
beanDefinitionMap
.
put
(
beanName
,
beanDefinition
);
}
@Override
public
boolean
containsBeanDefinition
(
String
beanName
)
{
return
beanDefinitionMap
.
containsKey
(
beanName
);
}
@Override
public
<
T
>
Map
<
String
,
T
>
getBeansOfType
(
Class
<
T
>
type
)
throws
BeansException
{
Map
<
String
,
T
>
result
=
new
HashMap
<>();
beanDefinitionMap
.
forEach
((
beanName
,
beanDefinition
)
->
{
Class
beanClass
=
beanDefinition
.
getBeanClass
();
if
(
type
.
isAssignableFrom
(
beanClass
))
{
result
.
put
(
beanName
,
(
T
)
getBean
(
beanName
));
}
});
return
result
;
}
@Override
public
String
[]
getBeanDefinitionNames
()
{
return
beanDefinitionMap
.
keySet
().
toArray
(
new
String
[
0
]);
}
@Override
public
BeanDefinition
getBeanDefinition
(
String
beanName
)
throws
BeansException
{
BeanDefinition
beanDefinition
=
beanDefinitionMap
.
get
(
beanName
);
if
(
beanDefinition
==
null
)
throw
new
BeansException
(
"No bean named '"
+
beanName
+
"' is defined"
);
return
beanDefinition
;
}
@Override
public
void
preInstantiateSingletons
()
throws
BeansException
{
beanDefinitionMap
.
keySet
().
forEach
(
this
::
getBean
);
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.DisposableBean
;
import
cn.bugstack.springframework.beans.factory.config.SingletonBeanRegistry
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Set
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
DefaultSingletonBeanRegistry
implements
SingletonBeanRegistry
{
private
Map
<
String
,
Object
>
singletonObjects
=
new
HashMap
<>();
private
final
Map
<
String
,
DisposableBean
>
disposableBeans
=
new
HashMap
<>();
@Override
public
Object
getSingleton
(
String
beanName
)
{
return
singletonObjects
.
get
(
beanName
);
}
protected
void
addSingleton
(
String
beanName
,
Object
singletonObject
)
{
singletonObjects
.
put
(
beanName
,
singletonObject
);
}
public
void
registerDisposableBean
(
String
beanName
,
DisposableBean
bean
)
{
disposableBeans
.
put
(
beanName
,
bean
);
}
public
void
destroySingletons
()
{
Set
<
String
>
keySet
=
this
.
disposableBeans
.
keySet
();
Object
[]
disposableBeanNames
=
keySet
.
toArray
();
for
(
int
i
=
disposableBeanNames
.
length
-
1
;
i
>=
0
;
i
--)
{
Object
beanName
=
disposableBeanNames
[
i
];
DisposableBean
disposableBean
=
disposableBeans
.
remove
(
beanName
);
try
{
disposableBean
.
destroy
();
}
catch
(
Exception
e
)
{
throw
new
BeansException
(
"Destroy method on bean with name '"
+
beanName
+
"' threw an exception"
,
e
);
}
}
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/DisposableBeanAdapter.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.DisposableBean
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
cn.hutool.core.util.StrUtil
;
import
java.lang.reflect.Method
;
/**
* Adapter that implements the {@link DisposableBean} and {@link Runnable} interfaces
* performing various destruction steps on a given bean instance:
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
DisposableBeanAdapter
implements
DisposableBean
{
private
final
Object
bean
;
private
final
String
beanName
;
private
String
destroyMethodName
;
public
DisposableBeanAdapter
(
Object
bean
,
String
beanName
,
BeanDefinition
beanDefinition
)
{
this
.
bean
=
bean
;
this
.
beanName
=
beanName
;
this
.
destroyMethodName
=
beanDefinition
.
getDestroyMethodName
();
}
@Override
public
void
destroy
()
throws
Exception
{
// 1. 实现接口 DisposableBean
if
(
bean
instanceof
DisposableBean
)
{
((
DisposableBean
)
bean
).
destroy
();
}
// 2. 注解配置 destroy-method {判断是为了避免二次执行销毁}
if
(
StrUtil
.
isNotEmpty
(
destroyMethodName
)
&&
!(
bean
instanceof
DisposableBean
&&
"destroy"
.
equals
(
this
.
destroyMethodName
)))
{
Method
destroyMethod
=
bean
.
getClass
().
getMethod
(
destroyMethodName
);
if
(
null
==
destroyMethod
)
{
throw
new
BeansException
(
"Couldn't find a destroy method named '"
+
destroyMethodName
+
"' on bean with name '"
+
beanName
+
"'"
);
}
destroyMethod
.
invoke
(
bean
);
}
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/InstantiationStrategy.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
java.lang.reflect.Constructor
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
* <p>
* Bean 实例化策略
*/
public
interface
InstantiationStrategy
{
Object
instantiate
(
BeanDefinition
beanDefinition
,
String
beanName
,
Constructor
ctor
,
Object
[]
args
)
throws
BeansException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/support/SimpleInstantiationStrategy.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
java.lang.reflect.Constructor
;
import
java.lang.reflect.InvocationTargetException
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
SimpleInstantiationStrategy
implements
InstantiationStrategy
{
@Override
public
Object
instantiate
(
BeanDefinition
beanDefinition
,
String
beanName
,
Constructor
ctor
,
Object
[]
args
)
throws
BeansException
{
Class
clazz
=
beanDefinition
.
getBeanClass
();
try
{
if
(
null
!=
ctor
)
{
return
clazz
.
getDeclaredConstructor
(
ctor
.
getParameterTypes
()).
newInstance
(
args
);
}
else
{
return
clazz
.
getDeclaredConstructor
().
newInstance
();
}
}
catch
(
NoSuchMethodException
|
InstantiationException
|
IllegalAccessException
|
InvocationTargetException
e
)
{
throw
new
BeansException
(
"Failed to instantiate ["
+
clazz
.
getName
()
+
"]"
,
e
);
}
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/beans/factory/xml/XmlBeanDefinitionReader.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.beans.factory.xml
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.PropertyValue
;
import
cn.bugstack.springframework.beans.factory.config.BeanDefinition
;
import
cn.bugstack.springframework.beans.factory.config.BeanReference
;
import
cn.bugstack.springframework.beans.factory.support.AbstractBeanDefinitionReader
;
import
cn.bugstack.springframework.beans.factory.support.BeanDefinitionRegistry
;
import
cn.bugstack.springframework.core.io.Resource
;
import
cn.bugstack.springframework.core.io.ResourceLoader
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.XmlUtil
;
import
org.w3c.dom.Document
;
import
org.w3c.dom.Element
;
import
org.w3c.dom.NodeList
;
import
java.io.IOException
;
import
java.io.InputStream
;
/**
* Bean definition reader for XML bean definitions.
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
XmlBeanDefinitionReader
extends
AbstractBeanDefinitionReader
{
public
XmlBeanDefinitionReader
(
BeanDefinitionRegistry
registry
)
{
super
(
registry
);
}
public
XmlBeanDefinitionReader
(
BeanDefinitionRegistry
registry
,
ResourceLoader
resourceLoader
)
{
super
(
registry
,
resourceLoader
);
}
@Override
public
void
loadBeanDefinitions
(
Resource
resource
)
throws
BeansException
{
try
{
try
(
InputStream
inputStream
=
resource
.
getInputStream
())
{
doLoadBeanDefinitions
(
inputStream
);
}
}
catch
(
IOException
|
ClassNotFoundException
e
)
{
throw
new
BeansException
(
"IOException parsing XML document from "
+
resource
,
e
);
}
}
@Override
public
void
loadBeanDefinitions
(
Resource
...
resources
)
throws
BeansException
{
for
(
Resource
resource
:
resources
)
{
loadBeanDefinitions
(
resource
);
}
}
@Override
public
void
loadBeanDefinitions
(
String
location
)
throws
BeansException
{
ResourceLoader
resourceLoader
=
getResourceLoader
();
Resource
resource
=
resourceLoader
.
getResource
(
location
);
loadBeanDefinitions
(
resource
);
}
@Override
public
void
loadBeanDefinitions
(
String
...
locations
)
throws
BeansException
{
for
(
String
location
:
locations
)
{
loadBeanDefinitions
(
location
);
}
}
protected
void
doLoadBeanDefinitions
(
InputStream
inputStream
)
throws
ClassNotFoundException
{
Document
doc
=
XmlUtil
.
readXML
(
inputStream
);
Element
root
=
doc
.
getDocumentElement
();
NodeList
childNodes
=
root
.
getChildNodes
();
for
(
int
i
=
0
;
i
<
childNodes
.
getLength
();
i
++)
{
// 判断元素
if
(!(
childNodes
.
item
(
i
)
instanceof
Element
))
continue
;
// 判断对象
if
(!
"bean"
.
equals
(
childNodes
.
item
(
i
).
getNodeName
()))
continue
;
// 解析标签
Element
bean
=
(
Element
)
childNodes
.
item
(
i
);
String
id
=
bean
.
getAttribute
(
"id"
);
String
name
=
bean
.
getAttribute
(
"name"
);
String
className
=
bean
.
getAttribute
(
"class"
);
String
initMethod
=
bean
.
getAttribute
(
"init-method"
);
String
destroyMethodName
=
bean
.
getAttribute
(
"destroy-method"
);
// 获取 Class,方便获取类中的名称
Class
<?>
clazz
=
Class
.
forName
(
className
);
// 优先级 id > name
String
beanName
=
StrUtil
.
isNotEmpty
(
id
)
?
id
:
name
;
if
(
StrUtil
.
isEmpty
(
beanName
))
{
beanName
=
StrUtil
.
lowerFirst
(
clazz
.
getSimpleName
());
}
// 定义Bean
BeanDefinition
beanDefinition
=
new
BeanDefinition
(
clazz
);
beanDefinition
.
setInitMethodName
(
initMethod
);
beanDefinition
.
setDestroyMethodName
(
destroyMethodName
);
// 读取属性并填充
for
(
int
j
=
0
;
j
<
bean
.
getChildNodes
().
getLength
();
j
++)
{
if
(!(
bean
.
getChildNodes
().
item
(
j
)
instanceof
Element
))
continue
;
if
(!
"property"
.
equals
(
bean
.
getChildNodes
().
item
(
j
).
getNodeName
()))
continue
;
// 解析标签:property
Element
property
=
(
Element
)
bean
.
getChildNodes
().
item
(
j
);
String
attrName
=
property
.
getAttribute
(
"name"
);
String
attrValue
=
property
.
getAttribute
(
"value"
);
String
attrRef
=
property
.
getAttribute
(
"ref"
);
// 获取属性值:引入对象、值对象
Object
value
=
StrUtil
.
isNotEmpty
(
attrRef
)
?
new
BeanReference
(
attrRef
)
:
attrValue
;
// 创建属性信息
PropertyValue
propertyValue
=
new
PropertyValue
(
attrName
,
value
);
beanDefinition
.
getPropertyValues
().
addPropertyValue
(
propertyValue
);
}
if
(
getRegistry
().
containsBeanDefinition
(
beanName
))
{
throw
new
BeansException
(
"Duplicate beanName["
+
beanName
+
"] is not allowed"
);
}
// 注册 BeanDefinition
getRegistry
().
registerBeanDefinition
(
beanName
,
beanDefinition
);
}
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/ApplicationContext.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context
;
import
cn.bugstack.springframework.beans.factory.ListableBeanFactory
;
/**
* Central interface to provide configuration for an application.
* This is read-only while the application is running, but may be
* reloaded if the implementation supports this.
*
* 应用上下文
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
ApplicationContext
extends
ListableBeanFactory
{
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/ApplicationContextAware.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.Aware
;
/**
* Interface to be implemented by any object that wishes to be notified
* of the {@link ApplicationContext} that it runs in.
*
* 实现此接口,既能感知到所属的 ApplicationContext
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
ApplicationContextAware
extends
Aware
{
void
setApplicationContext
(
ApplicationContext
applicationContext
)
throws
BeansException
;
}
\ No newline at end of file
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/ConfigurableApplicationContext.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context
;
import
cn.bugstack.springframework.beans.BeansException
;
/**
* SPI interface to be implemented by most if not all application contexts.
* Provides facilities to configure an application context in addition
* to the application context client methods in the
* {@link cn.bugstack.springframework.context.ApplicationContext} interface.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
interface
ConfigurableApplicationContext
extends
ApplicationContext
{
/**
* 刷新容器
*
* @throws BeansException
*/
void
refresh
()
throws
BeansException
;
void
registerShutdownHook
();
void
close
();
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/AbstractApplicationContext.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.ConfigurableListableBeanFactory
;
import
cn.bugstack.springframework.beans.factory.config.BeanFactoryPostProcessor
;
import
cn.bugstack.springframework.beans.factory.config.BeanPostProcessor
;
import
cn.bugstack.springframework.context.ConfigurableApplicationContext
;
import
cn.bugstack.springframework.core.io.DefaultResourceLoader
;
import
java.util.Map
;
/**
* Abstract implementation of the {@link cn.bugstack.springframework.context.ApplicationContext}
* interface. Doesn't mandate the type of storage used for configuration; simply
* implements common context functionality. Uses the Template Method design pattern,
* requiring concrete subclasses to implement abstract methods.
* <p>
* 抽象应用上下文
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
abstract
class
AbstractApplicationContext
extends
DefaultResourceLoader
implements
ConfigurableApplicationContext
{
@Override
public
void
refresh
()
throws
BeansException
{
// 1. 创建 BeanFactory,并加载 BeanDefinition
refreshBeanFactory
();
// 2. 获取 BeanFactory
ConfigurableListableBeanFactory
beanFactory
=
getBeanFactory
();
// 3. 添加 ApplicationContextAwareProcessor,让继承自 ApplicationContextAware 的 Bean 对象都能感知所属的 ApplicationContext
beanFactory
.
addBeanPostProcessor
(
new
ApplicationContextAwareProcessor
(
this
));
// 4. 在 Bean 实例化之前,执行 BeanFactoryPostProcessor (Invoke factory processors registered as beans in the context.)
invokeBeanFactoryPostProcessors
(
beanFactory
);
// 5. BeanPostProcessor 需要提前于其他 Bean 对象实例化之前执行注册操作
registerBeanPostProcessors
(
beanFactory
);
// 6. 提前实例化单例Bean对象
beanFactory
.
preInstantiateSingletons
();
}
protected
abstract
void
refreshBeanFactory
()
throws
BeansException
;
protected
abstract
ConfigurableListableBeanFactory
getBeanFactory
();
private
void
invokeBeanFactoryPostProcessors
(
ConfigurableListableBeanFactory
beanFactory
)
{
Map
<
String
,
BeanFactoryPostProcessor
>
beanFactoryPostProcessorMap
=
beanFactory
.
getBeansOfType
(
BeanFactoryPostProcessor
.
class
);
for
(
BeanFactoryPostProcessor
beanFactoryPostProcessor
:
beanFactoryPostProcessorMap
.
values
())
{
beanFactoryPostProcessor
.
postProcessBeanFactory
(
beanFactory
);
}
}
private
void
registerBeanPostProcessors
(
ConfigurableListableBeanFactory
beanFactory
)
{
Map
<
String
,
BeanPostProcessor
>
beanPostProcessorMap
=
beanFactory
.
getBeansOfType
(
BeanPostProcessor
.
class
);
for
(
BeanPostProcessor
beanPostProcessor
:
beanPostProcessorMap
.
values
())
{
beanFactory
.
addBeanPostProcessor
(
beanPostProcessor
);
}
}
@Override
public
<
T
>
Map
<
String
,
T
>
getBeansOfType
(
Class
<
T
>
type
)
throws
BeansException
{
return
getBeanFactory
().
getBeansOfType
(
type
);
}
@Override
public
String
[]
getBeanDefinitionNames
()
{
return
getBeanFactory
().
getBeanDefinitionNames
();
}
@Override
public
Object
getBean
(
String
name
)
throws
BeansException
{
return
getBeanFactory
().
getBean
(
name
);
}
@Override
public
Object
getBean
(
String
name
,
Object
...
args
)
throws
BeansException
{
return
getBeanFactory
().
getBean
(
name
,
args
);
}
@Override
public
<
T
>
T
getBean
(
String
name
,
Class
<
T
>
requiredType
)
throws
BeansException
{
return
getBeanFactory
().
getBean
(
name
,
requiredType
);
}
@Override
public
void
registerShutdownHook
()
{
Runtime
.
getRuntime
().
addShutdownHook
(
new
Thread
(
this
::
close
));
}
@Override
public
void
close
()
{
getBeanFactory
().
destroySingletons
();
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/AbstractRefreshableApplicationContext.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.ConfigurableListableBeanFactory
;
import
cn.bugstack.springframework.beans.factory.support.DefaultListableBeanFactory
;
/**
* Base class for {@link cn.bugstack.springframework.context.ApplicationContext}
* implementations which are supposed to support multiple calls to {@link #refresh()},
* creating a new internal bean factory instance every time.
* Typically (but not necessarily), such a context will be driven by
* a set of config locations to load bean definitions from.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
abstract
class
AbstractRefreshableApplicationContext
extends
AbstractApplicationContext
{
private
DefaultListableBeanFactory
beanFactory
;
@Override
protected
void
refreshBeanFactory
()
throws
BeansException
{
DefaultListableBeanFactory
beanFactory
=
createBeanFactory
();
loadBeanDefinitions
(
beanFactory
);
this
.
beanFactory
=
beanFactory
;
}
private
DefaultListableBeanFactory
createBeanFactory
()
{
return
new
DefaultListableBeanFactory
();
}
protected
abstract
void
loadBeanDefinitions
(
DefaultListableBeanFactory
beanFactory
);
@Override
protected
ConfigurableListableBeanFactory
getBeanFactory
()
{
return
beanFactory
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/AbstractXmlApplicationContext.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context.support
;
import
cn.bugstack.springframework.beans.factory.support.DefaultListableBeanFactory
;
import
cn.bugstack.springframework.beans.factory.xml.XmlBeanDefinitionReader
;
/**
* Convenient base class for {@link cn.bugstack.springframework.context.ApplicationContext}
* implementations, drawing configuration from XML documents containing bean definitions
* understood by an {@link cn.bugstack.springframework.beans.factory.xml.XmlBeanDefinitionReader}.
*
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
abstract
class
AbstractXmlApplicationContext
extends
AbstractRefreshableApplicationContext
{
@Override
protected
void
loadBeanDefinitions
(
DefaultListableBeanFactory
beanFactory
)
{
XmlBeanDefinitionReader
beanDefinitionReader
=
new
XmlBeanDefinitionReader
(
beanFactory
,
this
);
String
[]
configLocations
=
getConfigLocations
();
if
(
null
!=
configLocations
){
beanDefinitionReader
.
loadBeanDefinitions
(
configLocations
);
}
}
protected
abstract
String
[]
getConfigLocations
();
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/ApplicationContextAwareProcessor.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context.support
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.config.BeanPostProcessor
;
import
cn.bugstack.springframework.context.ApplicationContext
;
import
cn.bugstack.springframework.context.ApplicationContextAware
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
ApplicationContextAwareProcessor
implements
BeanPostProcessor
{
private
final
ApplicationContext
applicationContext
;
public
ApplicationContextAwareProcessor
(
ApplicationContext
applicationContext
)
{
this
.
applicationContext
=
applicationContext
;
}
@Override
public
Object
postProcessBeforeInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
if
(
bean
instanceof
ApplicationContextAware
){
((
ApplicationContextAware
)
bean
).
setApplicationContext
(
applicationContext
);
}
return
bean
;
}
@Override
public
Object
postProcessAfterInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
return
bean
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/context/support/ClassPathXmlApplicationContext.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.context.support
;
import
cn.bugstack.springframework.beans.BeansException
;
/**
* Standalone XML application context, taking the context definition files
* from the class path, interpreting plain paths as class path resource names
* that include the package path (e.g. "mypackage/myresource.txt"). Useful for
* test harnesses as well as for application contexts embedded within JARs.
* <p>
* XML 文件应用上下文
* <p>
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
ClassPathXmlApplicationContext
extends
AbstractXmlApplicationContext
{
private
String
[]
configLocations
;
public
ClassPathXmlApplicationContext
()
{
}
/**
* 从 XML 中加载 BeanDefinition,并刷新上下文
*
* @param configLocations
* @throws BeansException
*/
public
ClassPathXmlApplicationContext
(
String
configLocations
)
throws
BeansException
{
this
(
new
String
[]{
configLocations
});
}
/**
* 从 XML 中加载 BeanDefinition,并刷新上下文
* @param configLocations
* @throws BeansException
*/
public
ClassPathXmlApplicationContext
(
String
[]
configLocations
)
throws
BeansException
{
this
.
configLocations
=
configLocations
;
refresh
();
}
@Override
protected
String
[]
getConfigLocations
()
{
return
configLocations
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/ClassPathResource.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.core.io
;
import
cn.bugstack.springframework.util.ClassUtils
;
import
cn.hutool.core.lang.Assert
;
import
java.io.FileNotFoundException
;
import
java.io.IOException
;
import
java.io.InputStream
;
public
class
ClassPathResource
implements
Resource
{
private
final
String
path
;
private
ClassLoader
classLoader
;
public
ClassPathResource
(
String
path
)
{
this
(
path
,
(
ClassLoader
)
null
);
}
public
ClassPathResource
(
String
path
,
ClassLoader
classLoader
)
{
Assert
.
notNull
(
path
,
"Path must not be null"
);
this
.
path
=
path
;
this
.
classLoader
=
(
classLoader
!=
null
?
classLoader
:
ClassUtils
.
getDefaultClassLoader
());
}
@Override
public
InputStream
getInputStream
()
throws
IOException
{
InputStream
is
=
classLoader
.
getResourceAsStream
(
path
);
if
(
is
==
null
)
{
throw
new
FileNotFoundException
(
this
.
path
+
" cannot be opened because it does not exist"
);
}
return
is
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/DefaultResourceLoader.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.core.io
;
import
cn.hutool.core.lang.Assert
;
import
java.net.MalformedURLException
;
import
java.net.URL
;
public
class
DefaultResourceLoader
implements
ResourceLoader
{
@Override
public
Resource
getResource
(
String
location
)
{
Assert
.
notNull
(
location
,
"Location must not be null"
);
if
(
location
.
startsWith
(
CLASSPATH_URL_PREFIX
))
{
return
new
ClassPathResource
(
location
.
substring
(
CLASSPATH_URL_PREFIX
.
length
()));
}
else
{
try
{
URL
url
=
new
URL
(
location
);
return
new
UrlResource
(
url
);
}
catch
(
MalformedURLException
e
)
{
return
new
FileSystemResource
(
location
);
}
}
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/FileSystemResource.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.core.io
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
public
class
FileSystemResource
implements
Resource
{
private
final
File
file
;
private
final
String
path
;
public
FileSystemResource
(
File
file
)
{
this
.
file
=
file
;
this
.
path
=
file
.
getPath
();
}
public
FileSystemResource
(
String
path
)
{
this
.
file
=
new
File
(
path
);
this
.
path
=
path
;
}
@Override
public
InputStream
getInputStream
()
throws
IOException
{
return
new
FileInputStream
(
this
.
file
);
}
public
final
String
getPath
()
{
return
this
.
path
;
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/Resource.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.core.io
;
import
java.io.IOException
;
import
java.io.InputStream
;
public
interface
Resource
{
InputStream
getInputStream
()
throws
IOException
;
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/ResourceLoader.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.core.io
;
public
interface
ResourceLoader
{
/**
* Pseudo URL prefix for loading from the class path: "classpath:"
*/
String
CLASSPATH_URL_PREFIX
=
"classpath:"
;
Resource
getResource
(
String
location
);
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/core/io/UrlResource.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.core.io
;
import
cn.hutool.core.lang.Assert
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.net.URLConnection
;
public
class
UrlResource
implements
Resource
{
private
final
URL
url
;
public
UrlResource
(
URL
url
)
{
Assert
.
notNull
(
url
,
"URL must not be null"
);
this
.
url
=
url
;
}
@Override
public
InputStream
getInputStream
()
throws
IOException
{
URLConnection
con
=
this
.
url
.
openConnection
();
try
{
return
con
.
getInputStream
();
}
catch
(
IOException
ex
){
if
(
con
instanceof
HttpURLConnection
){
((
HttpURLConnection
)
con
).
disconnect
();
}
throw
ex
;
}
}
}
small-spring-step-08/src/main/java/cn/bugstack/springframework/util/ClassUtils.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.util
;
public
class
ClassUtils
{
public
static
ClassLoader
getDefaultClassLoader
()
{
ClassLoader
cl
=
null
;
try
{
cl
=
Thread
.
currentThread
().
getContextClassLoader
();
}
catch
(
Throwable
ex
)
{
// Cannot access thread context ClassLoader - falling back to system class loader...
}
if
(
cl
==
null
)
{
// No thread context class loader -> use class loader of this class.
cl
=
ClassUtils
.
class
.
getClassLoader
();
}
return
cl
;
}
}
small-spring-step-08/src/test/java/cn/bugstack/springframework/test/ApiTest.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.test
;
import
cn.bugstack.springframework.context.support.ClassPathXmlApplicationContext
;
import
cn.bugstack.springframework.test.bean.UserService
;
import
org.junit.Test
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
ApiTest
{
@Test
public
void
test_xml
()
{
// 1.初始化 BeanFactory
ClassPathXmlApplicationContext
applicationContext
=
new
ClassPathXmlApplicationContext
(
"classpath:spring.xml"
);
applicationContext
.
registerShutdownHook
();
// 2. 获取Bean对象调用方法
UserService
userService
=
applicationContext
.
getBean
(
"userService"
,
UserService
.
class
);
String
result
=
userService
.
queryUserInfo
();
System
.
out
.
println
(
"测试结果:"
+
result
);
System
.
out
.
println
(
"ApplicationContextAware:"
+
userService
.
getApplicationContext
());
System
.
out
.
println
(
"BeanFactoryAware:"
+
userService
.
getBeanFactory
());
}
}
small-spring-step-08/src/test/java/cn/bugstack/springframework/test/bean/UserDao.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.test.bean
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.context.ApplicationContext
;
import
cn.bugstack.springframework.context.ApplicationContextAware
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
UserDao
{
private
static
Map
<
String
,
String
>
hashMap
=
new
HashMap
<>();
public
void
initDataMethod
(){
System
.
out
.
println
(
"执行:init-method"
);
hashMap
.
put
(
"10001"
,
"小傅哥"
);
hashMap
.
put
(
"10002"
,
"八杯水"
);
hashMap
.
put
(
"10003"
,
"阿毛"
);
}
public
void
destroyDataMethod
(){
System
.
out
.
println
(
"执行:destroy-method"
);
hashMap
.
clear
();
}
public
String
queryUserName
(
String
uId
)
{
return
hashMap
.
get
(
uId
);
}
}
small-spring-step-08/src/test/java/cn/bugstack/springframework/test/bean/UserService.java
0 → 100755
浏览文件 @
7795ca52
package
cn.bugstack.springframework.test.bean
;
import
cn.bugstack.springframework.beans.BeansException
;
import
cn.bugstack.springframework.beans.factory.*
;
import
cn.bugstack.springframework.context.ApplicationContext
;
import
cn.bugstack.springframework.context.ApplicationContextAware
;
/**
* 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
* 公众号:bugstack虫洞栈
* Create by 小傅哥(fustack)
*/
public
class
UserService
implements
BeanNameAware
,
BeanClassLoaderAware
,
ApplicationContextAware
,
BeanFactoryAware
{
private
ApplicationContext
applicationContext
;
private
BeanFactory
beanFactory
;
private
String
uId
;
private
String
company
;
private
String
location
;
private
UserDao
userDao
;
@Override
public
void
setBeanFactory
(
BeanFactory
beanFactory
)
throws
BeansException
{
this
.
beanFactory
=
beanFactory
;
}
@Override
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
throws
BeansException
{
this
.
applicationContext
=
applicationContext
;
}
@Override
public
void
setBeanName
(
String
name
)
{
System
.
out
.
println
(
"Bean Name is:"
+
name
);
}
@Override
public
void
setBeanClassLoader
(
ClassLoader
classLoader
)
{
System
.
out
.
println
(
"ClassLoader:"
+
classLoader
);
}
public
String
queryUserInfo
()
{
return
userDao
.
queryUserName
(
uId
)
+
","
+
company
+
","
+
location
;
}
public
String
getuId
()
{
return
uId
;
}
public
void
setuId
(
String
uId
)
{
this
.
uId
=
uId
;
}
public
String
getCompany
()
{
return
company
;
}
public
void
setCompany
(
String
company
)
{
this
.
company
=
company
;
}
public
String
getLocation
()
{
return
location
;
}
public
void
setLocation
(
String
location
)
{
this
.
location
=
location
;
}
public
UserDao
getUserDao
()
{
return
userDao
;
}
public
void
setUserDao
(
UserDao
userDao
)
{
this
.
userDao
=
userDao
;
}
public
ApplicationContext
getApplicationContext
()
{
return
applicationContext
;
}
public
BeanFactory
getBeanFactory
()
{
return
beanFactory
;
}
}
small-spring-step-08/src/test/resources/spring.xml
0 → 100755
浏览文件 @
7795ca52
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean
id=
"userDao"
class=
"cn.bugstack.springframework.test.bean.UserDao"
init-method=
"initDataMethod"
destroy-method=
"destroyDataMethod"
/>
<bean
id=
"userService"
class=
"cn.bugstack.springframework.test.bean.UserService"
>
<property
name=
"uId"
value=
"10001"
/>
<property
name=
"company"
value=
"腾讯"
/>
<property
name=
"location"
value=
"深圳"
/>
<property
name=
"userDao"
ref=
"userDao"
/>
</bean>
</beans>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录