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
223223public 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
276276public 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
711706private TransactionTemplate transactionTemplate;
712707
713708public 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;
733728public 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注解
0 commit comments