Skip to content

Commit de3eb46

Browse files
author
zhenglin
committed
update 优化spring代码
1 parent 1a4e573 commit de3eb46

File tree

4 files changed

+66
-78
lines changed

4 files changed

+66
-78
lines changed

README.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -956,15 +956,8 @@
956956
- [超卖](商城类问题/商城类问题.md#如何解决超卖问题)
957957
- [订单延迟](商城类问题/商城类问题.md#订单延时取消怎么做)
958958

959-
# 知识点梳理[↑↑](#内容概览)
960-
961-
![](img/Java-总览.png)
962-
963-
点击查看详细大图:[知识点大图](img/Java.png)
964-
965959
# 免责声明[↑↑](#内容概览)
966960
> **:bangbang:某些知识点、观点、图片是从各种优秀博主、作者、大佬们的文章里或文献里提取的,我只是搬运工,如果觉得有侵犯到您的权益,请联系我,我将根据您的要求修改(添加您的出处链接、删除、修改....),谢谢大佬!**
967961
968-
969962
# 最后[↑↑](#内容概览)
970963
> 不积跬步无以至千里

Spring/Spring.md

Lines changed: 66 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474

7575
## 架构图
7676

77-
![](../img/spring/spring架构图.png)
77+
<img src="../img/spring/spring架构图.png" width="50%" />
7878

7979
## 模块
8080

@@ -222,7 +222,7 @@ BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProc
222222
```java
223223
public static void main(String[]args){
224224
ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationfile.xml");
225-
}
225+
}
226226
```
227227

228228
这里ApplicationContext是一个接口,主要的实现类有:
@@ -274,8 +274,8 @@ public class App {
274274
```java
275275
@Override
276276
public void refresh()throws BeansException,IllegalStateException{
277-
// 1. 首先是一个synchronized加锁,当然要加锁,不然你先调一次refresh()然后这次还没处理完又调一次,就会乱套了;
278-
synchronized (this.startupShutdownMonitor){
277+
// 1. 首先是一个synchronized加锁,当然要加锁,不然你先调一次refresh()然后这次还没处理完又调一次,就会乱套了;
278+
synchronized (this.startupShutdownMonitor){
279279
// 2. 这个方法是做准备工作的,记录容器的启动时间、标记“已启动”状态、处理配置文件中的占位符,可以点进去看看,这里就不多说了。
280280
prepareRefresh();
281281

@@ -286,60 +286,55 @@ synchronized (this.startupShutdownMonitor){
286286
prepareBeanFactory(beanFactory);
287287

288288
try{
289-
// 5. 方法是提供给子类的扩展点,到这里的时候,所有的 Bean 都加载、注册完成了,但是都还没有初始化,具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类,来完成一些其他的操作。
290-
postProcessBeanFactory(beanFactory);
291-
292-
// 6. 接下来是这个方法是调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法;
293-
invokeBeanFactoryPostProcessors(beanFactory);
294-
295-
// 7. 然后这个方法注册 BeanPostProcessor 的实现类,和上面的BeanFactoryPostProcessor 是有区别的,这个方法调用的其实是PostProcessorRegistrationDelegate类的registerBeanPostProcessors方法;
296-
// 这个类里面有个内部类BeanPostProcessorChecker,BeanPostProcessorChecker里面有两个方法postProcessBeforeInitialization和postProcessAfterInitialization,这两个方法分别在 Bean 初始化之前和初始化之后得到执行。
297-
// 然后回到refresh()方法中继续往下看
298-
registerBeanPostProcessors(beanFactory);
299-
300-
// 8. 方法是初始化当前 ApplicationContext 的 MessageSource,国际化处理,继续往下
301-
initMessageSource();
302-
303-
// 9. 方法初始化当前 ApplicationContext 的事件广播器继续往下
304-
initApplicationEventMulticaster();
305-
306-
// 10. 方法初始化一些特殊的 Bean(在初始化 singleton beans 之前);继续往下
307-
onRefresh();
308-
309-
// 11. 方法注册事件监听器,监听器需要实现 ApplicationListener 接口;继续往下
310-
registerListeners();
311-
312-
// 12. 重点到了 初始化所有的 singleton beans(单例bean),懒加载(non-lazy-init)的除外,这个方法也是等会细说
313-
finishBeanFactoryInitialization(beanFactory);
314-
315-
// 13. 方法是最后一步,广播事件,ApplicationContext 初始化完成
316-
finishRefresh();
317-
}
318-
319-
catch(BeansException ex){
320-
if(logger.isWarnEnabled()){
321-
logger.warn("Exception encountered during context initialization - "+
322-
"cancelling refresh attempt: "+ex);
323-
}
324-
325-
// Destroy already created singletons to avoid dangling resources.
326-
// 销毁已经初始化的 singleton 的 Beans,以免有些 bean 会一直占用资源
327-
destroyBeans();
328-
329-
// Reset 'active' flag.
330-
cancelRefresh(ex);
331-
332-
// Propagate exception to caller.
333-
throw ex;
334-
}
289+
// 5. 方法是提供给子类的扩展点,到这里的时候,所有的 Bean 都加载、注册完成了,但是都还没有初始化,具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类,来完成一些其他的操作。
290+
postProcessBeanFactory(beanFactory);
291+
292+
// 6. 接下来是这个方法是调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法;
293+
invokeBeanFactoryPostProcessors(beanFactory);
294+
295+
// 7. 然后这个方法注册 BeanPostProcessor 的实现类,和上面的BeanFactoryPostProcessor 是有区别的,这个方法调用的其实是PostProcessorRegistrationDelegate类的registerBeanPostProcessors方法;
296+
// 这个类里面有个内部类BeanPostProcessorChecker,BeanPostProcessorChecker里面有两个方法postProcessBeforeInitialization和postProcessAfterInitialization,这两个方法分别在 Bean 初始化之前和初始化之后得到执行。
297+
// 然后回到refresh()方法中继续往下看
298+
registerBeanPostProcessors(beanFactory);
299+
300+
// 8. 方法是初始化当前 ApplicationContext 的 MessageSource,国际化处理,继续往下
301+
initMessageSource();
302+
303+
// 9. 方法初始化当前 ApplicationContext 的事件广播器继续往下
304+
initApplicationEventMulticaster();
305+
306+
// 10. 方法初始化一些特殊的 Bean(在初始化 singleton beans 之前);继续往下
307+
onRefresh();
308+
309+
// 11. 方法注册事件监听器,监听器需要实现 ApplicationListener 接口;继续往下
310+
registerListeners();
311+
312+
// 12. 重点到了 初始化所有的 singleton beans(单例bean),懒加载(non-lazy-init)的除外,这个方法也是等会细说
313+
finishBeanFactoryInitialization(beanFactory);
314+
315+
// 13. 方法是最后一步,广播事件,ApplicationContext 初始化完成
316+
finishRefresh();
317+
} catch(BeansException ex){
318+
if(logger.isWarnEnabled()){
319+
logger.warn("Exception encountered during context initialization - "+"cancelling refresh attempt: "+ex);
320+
}
335321

336-
finally{
337-
// Reset common introspection caches in Spring's core, since we
338-
// might not ever need metadata for singleton beans anymore...
339-
resetCommonCaches();
340-
}
341-
}
322+
// Destroy already created singletons to avoid dangling resources.
323+
// 销毁已经初始化的 singleton 的 Beans,以免有些 bean 会一直占用资源
324+
destroyBeans();
325+
326+
// Reset 'active' flag.
327+
cancelRefresh(ex);
328+
329+
// Propagate exception to caller.
330+
throw ex;
331+
} finally{
332+
// Reset common introspection caches in Spring's core, since we
333+
// might not ever need metadata for singleton beans anymore...
334+
resetCommonCaches();
342335
}
336+
}
337+
}
343338
```
344339

345340
### Spring bean的生命周期
@@ -707,21 +702,21 @@ public class AccountController {
707702
- TransactionTemplate
708703

709704
```java
710-
@Autowired
705+
@Autowired
711706
private TransactionTemplate transactionTemplate;
712707

713708
public void testTransaction(){
714-
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
715-
@Override
716-
protected void doInTransactionWithoutResult(TransactionStatus status){
717-
try{
718-
//...业务代码
719-
}catch(Exception e){
720-
status.setRollbackOnly();
721-
}
722-
}
723-
});
709+
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
710+
@Override
711+
protected void doInTransactionWithoutResult(TransactionStatus status){
712+
try{
713+
//...业务代码
714+
}catch(Exception e){
715+
status.setRollbackOnly();
716+
}
724717
}
718+
});
719+
}
725720
```
726721

727722
- TransactionManager
@@ -733,12 +728,12 @@ private PlatformTransactionManager transactionManager;
733728
public void testTransaction2(){
734729
TransactionStatus status=transactionManager.getTransaction(new DefaultTransactionDefinition());
735730
try{
736-
//...业务代码
737-
transactionManager.commit(status);
731+
//...业务代码
732+
transactionManager.commit(status);
738733
}catch(Exception e){
739-
transactionManager.rollback(status);
740-
}
734+
transactionManager.rollback(status);
741735
}
736+
}
742737
```
743738

744739
注解

img/Java-总览.png

-315 KB
Binary file not shown.

img/Java.png

-6.02 MB
Binary file not shown.

0 commit comments

Comments
 (0)