diff --git a/MyBatis/32c47fb3f80c151ecac657c98b536113.jpg b/MyBatis/32c47fb3f80c151ecac657c98b536113.jpg
new file mode 100644
index 0000000..0f5e7c7
Binary files /dev/null and b/MyBatis/32c47fb3f80c151ecac657c98b536113.jpg differ
diff --git a/MyBatis/Executor.cld.jpg b/MyBatis/Executor.cld.jpg
new file mode 100644
index 0000000..b3c3ae5
Binary files /dev/null and b/MyBatis/Executor.cld.jpg differ
diff --git a/MyBatis/SqlSessionFactoryBean.jpg b/MyBatis/SqlSessionFactoryBean.jpg
new file mode 100644
index 0000000..a598c14
Binary files /dev/null and b/MyBatis/SqlSessionFactoryBean.jpg differ
diff --git a/MyBatis/StatementHandler.cld.jpg b/MyBatis/StatementHandler.cld.jpg
new file mode 100644
index 0000000..d11dca1
Binary files /dev/null and b/MyBatis/StatementHandler.cld.jpg differ
diff --git "a/MyBatis/mYBAtis\346\212\200\346\234\257\345\206\205\345\271\225.jpg" "b/MyBatis/mYBAtis\346\212\200\346\234\257\345\206\205\345\271\225.jpg"
new file mode 100644
index 0000000..234ed72
Binary files /dev/null and "b/MyBatis/mYBAtis\346\212\200\346\234\257\345\206\205\345\271\225.jpg" differ
diff --git a/MyBatis/mybatis-tran.png b/MyBatis/mybatis-tran.png
new file mode 100644
index 0000000..be0d96d
Binary files /dev/null and b/MyBatis/mybatis-tran.png differ
diff --git a/MyBatis/mybatis.png b/MyBatis/mybatis.png
new file mode 100644
index 0000000..6464e27
Binary files /dev/null and b/MyBatis/mybatis.png differ
diff --git a/Springer.An.Introduction.to.Network.Programming.with.Java.pdf b/Springer.An.Introduction.to.Network.Programming.with.Java.pdf
new file mode 100644
index 0000000..10b36ad
Binary files /dev/null and b/Springer.An.Introduction.to.Network.Programming.with.Java.pdf differ
diff --git a/java/ClassLoeader.jpg b/java/ClassLoeader.jpg
new file mode 100644
index 0000000..978010f
Binary files /dev/null and b/java/ClassLoeader.jpg differ
diff --git a/java/Class_Loading_Linking_Initializing.png b/java/Class_Loading_Linking_Initializing.png
new file mode 100644
index 0000000..89d57bf
Binary files /dev/null and b/java/Class_Loading_Linking_Initializing.png differ
diff --git a/java/Figure1.png b/java/Figure1.png
new file mode 100644
index 0000000..e678f9d
Binary files /dev/null and b/java/Figure1.png differ
diff --git a/java/Figure2.png b/java/Figure2.png
new file mode 100644
index 0000000..52fb8dc
Binary files /dev/null and b/java/Figure2.png differ
diff --git a/java/JDBC.png b/java/JDBC.png
new file mode 100644
index 0000000..ded2efe
Binary files /dev/null and b/java/JDBC.png differ
diff --git a/java/JEETT.pdf b/java/JEETT.pdf
new file mode 100644
index 0000000..686c8ee
Binary files /dev/null and b/java/JEETT.pdf differ
diff --git a/java/JMM-thread.png b/java/JMM-thread.png
new file mode 100644
index 0000000..55b4aa5
Binary files /dev/null and b/java/JMM-thread.png differ
diff --git a/java/JVM_Internal_Architecture.png b/java/JVM_Internal_Architecture.png
new file mode 100644
index 0000000..cc0fe3a
Binary files /dev/null and b/java/JVM_Internal_Architecture.png differ
diff --git a/java/Java-Design-Patterns.png b/java/Java-Design-Patterns.png
new file mode 100644
index 0000000..3835e22
Binary files /dev/null and b/java/Java-Design-Patterns.png differ
diff --git a/java/NIO.png b/java/NIO.png
new file mode 100644
index 0000000..7d52150
Binary files /dev/null and b/java/NIO.png differ
diff --git a/java/VM.png b/java/VM.png
new file mode 100644
index 0000000..477ab58
Binary files /dev/null and b/java/VM.png differ
diff --git a/java/aio.png b/java/aio.png
new file mode 100644
index 0000000..403ec06
Binary files /dev/null and b/java/aio.png differ
diff --git a/java/bio.png b/java/bio.png
new file mode 100644
index 0000000..6ca3b98
Binary files /dev/null and b/java/bio.png differ
diff --git a/java/concurent.jpg b/java/concurent.jpg
new file mode 100644
index 0000000..36cfbfd
Binary files /dev/null and b/java/concurent.jpg differ
diff --git "a/java/dom\346\226\207\346\241\243\350\247\243\346\236\220.png" "b/java/dom\346\226\207\346\241\243\350\247\243\346\236\220.png"
new file mode 100644
index 0000000..3901c1b
Binary files /dev/null and "b/java/dom\346\226\207\346\241\243\350\247\243\346\236\220.png" differ
diff --git a/java/factory-pattern-java.png b/java/factory-pattern-java.png
new file mode 100644
index 0000000..f8e3d5e
Binary files /dev/null and b/java/factory-pattern-java.png differ
diff --git a/java/history.png b/java/history.png
new file mode 100644
index 0000000..755e7e0
Binary files /dev/null and b/java/history.png differ
diff --git a/java/io-mul.png b/java/io-mul.png
new file mode 100644
index 0000000..ea0d0c1
Binary files /dev/null and b/java/io-mul.png differ
diff --git a/java/j2ee.png b/java/j2ee.png
new file mode 100644
index 0000000..cce3d89
Binary files /dev/null and b/java/j2ee.png differ
diff --git a/java/java-init.jpg b/java/java-init.jpg
new file mode 100644
index 0000000..266e661
Binary files /dev/null and b/java/java-init.jpg differ
diff --git a/java/java-logo.jpg b/java/java-logo.jpg
new file mode 100644
index 0000000..2b7e11c
Binary files /dev/null and b/java/java-logo.jpg differ
diff --git a/java/javax.mvc-api-1.0.0-spec.pdf b/java/javax.mvc-api-1.0.0-spec.pdf
new file mode 100644
index 0000000..85fc1ef
Binary files /dev/null and b/java/javax.mvc-api-1.0.0-spec.pdf differ
diff --git a/java/jdbc4.2-fr-spec.pdf b/java/jdbc4.2-fr-spec.pdf
new file mode 100644
index 0000000..13315db
Binary files /dev/null and b/java/jdbc4.2-fr-spec.pdf differ
diff --git a/java/jdk.jpg b/java/jdk.jpg
new file mode 100644
index 0000000..cc3daf8
Binary files /dev/null and b/java/jdk.jpg differ
diff --git a/java/jls8.pdf b/java/jls8.pdf
new file mode 100644
index 0000000..d683898
Binary files /dev/null and b/java/jls8.pdf differ
diff --git a/java/jls8.png b/java/jls8.png
new file mode 100644
index 0000000..5b6dc67
Binary files /dev/null and b/java/jls8.png differ
diff --git a/java/jmm8.png b/java/jmm8.png
new file mode 100644
index 0000000..97cc7ca
Binary files /dev/null and b/java/jmm8.png differ
diff --git a/java/jsr133.pdf b/java/jsr133.pdf
new file mode 100644
index 0000000..c07d385
Binary files /dev/null and b/java/jsr133.pdf differ
diff --git a/java/jvm-art.png b/java/jvm-art.png
new file mode 100644
index 0000000..6e0c029
Binary files /dev/null and b/java/jvm-art.png differ
diff --git a/java/jvm.png b/java/jvm.png
new file mode 100644
index 0000000..59af05e
Binary files /dev/null and b/java/jvm.png differ
diff --git a/java/jvm1.png b/java/jvm1.png
new file mode 100644
index 0000000..4ce808d
Binary files /dev/null and b/java/jvm1.png differ
diff --git a/java/jvms8.pdf b/java/jvms8.pdf
new file mode 100644
index 0000000..e0fdef7
Binary files /dev/null and b/java/jvms8.pdf differ
diff --git a/java/new io.png b/java/new io.png
new file mode 100644
index 0000000..5522fcd
Binary files /dev/null and b/java/new io.png differ
diff --git a/java/nio.pdf b/java/nio.pdf
new file mode 100644
index 0000000..43e4799
Binary files /dev/null and b/java/nio.pdf differ
diff --git a/java/o_44.png b/java/o_44.png
new file mode 100644
index 0000000..1c2083d
Binary files /dev/null and b/java/o_44.png differ
diff --git a/java/opensource.png b/java/opensource.png
new file mode 100644
index 0000000..5c479db
Binary files /dev/null and b/java/opensource.png differ
diff --git a/java/reactor-siemens.pdf b/java/reactor-siemens.pdf
new file mode 100644
index 0000000..c5d7273
Binary files /dev/null and b/java/reactor-siemens.pdf differ
diff --git a/java/reactor.pdf b/java/reactor.pdf
new file mode 100644
index 0000000..0b77d9f
Binary files /dev/null and b/java/reactor.pdf differ
diff --git a/java/reactor.png b/java/reactor.png
new file mode 100644
index 0000000..3c38a40
Binary files /dev/null and b/java/reactor.png differ
diff --git a/java/reactor0.jpg b/java/reactor0.jpg
new file mode 100644
index 0000000..11e7859
Binary files /dev/null and b/java/reactor0.jpg differ
diff --git a/java/reactor1.jpg b/java/reactor1.jpg
new file mode 100644
index 0000000..a8bb7a5
Binary files /dev/null and b/java/reactor1.jpg differ
diff --git a/java/reactor2.jpg b/java/reactor2.jpg
new file mode 100644
index 0000000..23b0c3a
Binary files /dev/null and b/java/reactor2.jpg differ
diff --git a/java/reactor3.jpg b/java/reactor3.jpg
new file mode 100644
index 0000000..91f853d
Binary files /dev/null and b/java/reactor3.jpg differ
diff --git a/java/spring-rocketmqjpg.jpg b/java/spring-rocketmqjpg.jpg
new file mode 100644
index 0000000..96d30b4
Binary files /dev/null and b/java/spring-rocketmqjpg.jpg differ
diff --git a/java/thinking in java.jpg b/java/thinking in java.jpg
new file mode 100644
index 0000000..97f14ff
Binary files /dev/null and b/java/thinking in java.jpg differ
diff --git a/java/thread/0.png b/java/thread/0.png
new file mode 100644
index 0000000..09a8138
Binary files /dev/null and b/java/thread/0.png differ
diff --git a/java/thread/1.png b/java/thread/1.png
new file mode 100644
index 0000000..5883f5c
Binary files /dev/null and b/java/thread/1.png differ
diff --git a/java/thread/10.png b/java/thread/10.png
new file mode 100644
index 0000000..1e2bee4
Binary files /dev/null and b/java/thread/10.png differ
diff --git a/java/thread/11.png b/java/thread/11.png
new file mode 100644
index 0000000..667e288
Binary files /dev/null and b/java/thread/11.png differ
diff --git a/java/thread/2.png b/java/thread/2.png
new file mode 100644
index 0000000..460e8a5
Binary files /dev/null and b/java/thread/2.png differ
diff --git a/java/thread/3.png b/java/thread/3.png
new file mode 100644
index 0000000..a6dd531
Binary files /dev/null and b/java/thread/3.png differ
diff --git a/java/thread/4.png b/java/thread/4.png
new file mode 100644
index 0000000..3f7032f
Binary files /dev/null and b/java/thread/4.png differ
diff --git a/java/thread/5.png b/java/thread/5.png
new file mode 100644
index 0000000..8e0e0e9
Binary files /dev/null and b/java/thread/5.png differ
diff --git a/java/thread/6.png b/java/thread/6.png
new file mode 100644
index 0000000..441557b
Binary files /dev/null and b/java/thread/6.png differ
diff --git a/java/thread/7.png b/java/thread/7.png
new file mode 100644
index 0000000..86f8676
Binary files /dev/null and b/java/thread/7.png differ
diff --git a/java/thread/8.png b/java/thread/8.png
new file mode 100644
index 0000000..788c4c1
Binary files /dev/null and b/java/thread/8.png differ
diff --git a/java/thread/81838ee5-ac21-3635-a8f7-4ede59b5f610.png b/java/thread/81838ee5-ac21-3635-a8f7-4ede59b5f610.png
new file mode 100644
index 0000000..8a97306
Binary files /dev/null and b/java/thread/81838ee5-ac21-3635-a8f7-4ede59b5f610.png differ
diff --git a/java/thread/9.png b/java/thread/9.png
new file mode 100644
index 0000000..5e07487
Binary files /dev/null and b/java/thread/9.png differ
diff --git "a/java/thread/QQ\345\233\276\347\211\20720200411151320.png" "b/java/thread/QQ\345\233\276\347\211\20720200411151320.png"
new file mode 100644
index 0000000..c30e701
Binary files /dev/null and "b/java/thread/QQ\345\233\276\347\211\20720200411151320.png" differ
diff --git "a/java/thread/QQ\345\233\276\347\211\20720200413000957.png" "b/java/thread/QQ\345\233\276\347\211\20720200413000957.png"
new file mode 100644
index 0000000..82483b5
Binary files /dev/null and "b/java/thread/QQ\345\233\276\347\211\20720200413000957.png" differ
diff --git a/java/thread/ScheduledThreadPoolExecutor.png b/java/thread/ScheduledThreadPoolExecutor.png
new file mode 100644
index 0000000..e3f4f9d
Binary files /dev/null and b/java/thread/ScheduledThreadPoolExecutor.png differ
diff --git a/java/thread/Thread_pool.png b/java/thread/Thread_pool.png
new file mode 100644
index 0000000..d865e1a
Binary files /dev/null and b/java/thread/Thread_pool.png differ
diff --git a/java/thread/java-7-concurrent-collections-uml-class-diagram-example.png b/java/thread/java-7-concurrent-collections-uml-class-diagram-example.png
new file mode 100644
index 0000000..b4f4957
Binary files /dev/null and b/java/thread/java-7-concurrent-collections-uml-class-diagram-example.png differ
diff --git a/java/thread/java-7-concurrent-executors-uml-class-diagram-example.png b/java/thread/java-7-concurrent-executors-uml-class-diagram-example.png
new file mode 100644
index 0000000..bbf41cd
Binary files /dev/null and b/java/thread/java-7-concurrent-executors-uml-class-diagram-example.png differ
diff --git a/java/thread/queue.png b/java/thread/queue.png
new file mode 100644
index 0000000..2933a6a
Binary files /dev/null and b/java/thread/queue.png differ
diff --git a/java/thread/t0.png b/java/thread/t0.png
new file mode 100644
index 0000000..bc8d5ea
Binary files /dev/null and b/java/thread/t0.png differ
diff --git a/java/thread/t1.png b/java/thread/t1.png
new file mode 100644
index 0000000..cf5a738
Binary files /dev/null and b/java/thread/t1.png differ
diff --git a/java/thread/t2.png b/java/thread/t2.png
new file mode 100644
index 0000000..3b88ec5
Binary files /dev/null and b/java/thread/t2.png differ
diff --git a/java/thread/t3.png b/java/thread/t3.png
new file mode 100644
index 0000000..f64dcf0
Binary files /dev/null and b/java/thread/t3.png differ
diff --git a/java/thread/t4.png b/java/thread/t4.png
new file mode 100644
index 0000000..5b8d567
Binary files /dev/null and b/java/thread/t4.png differ
diff --git a/java/thread/t5.png b/java/thread/t5.png
new file mode 100644
index 0000000..e437d73
Binary files /dev/null and b/java/thread/t5.png differ
diff --git a/java/thread/t6.png b/java/thread/t6.png
new file mode 100644
index 0000000..d0873fd
Binary files /dev/null and b/java/thread/t6.png differ
diff --git a/java/thread/t61.png b/java/thread/t61.png
new file mode 100644
index 0000000..d90d130
Binary files /dev/null and b/java/thread/t61.png differ
diff --git a/java/thread/t62.png b/java/thread/t62.png
new file mode 100644
index 0000000..23e76d4
Binary files /dev/null and b/java/thread/t62.png differ
diff --git a/java/thread/t63.png b/java/thread/t63.png
new file mode 100644
index 0000000..caee119
Binary files /dev/null and b/java/thread/t63.png differ
diff --git a/java/thread/t64.png b/java/thread/t64.png
new file mode 100644
index 0000000..e3f0e8e
Binary files /dev/null and b/java/thread/t64.png differ
diff --git a/java/thread/t7.png b/java/thread/t7.png
new file mode 100644
index 0000000..65bbe5d
Binary files /dev/null and b/java/thread/t7.png differ
diff --git a/java/thread/t8.png b/java/thread/t8.png
new file mode 100644
index 0000000..406acd1
Binary files /dev/null and b/java/thread/t8.png differ
diff --git a/java/thread/t9.png b/java/thread/t9.png
new file mode 100644
index 0000000..adf2e94
Binary files /dev/null and b/java/thread/t9.png differ
diff --git a/java/thread/tPool.jpg b/java/thread/tPool.jpg
new file mode 100644
index 0000000..a676242
Binary files /dev/null and b/java/thread/tPool.jpg differ
diff --git a/java/thread/thread-state.png b/java/thread/thread-state.png
new file mode 100644
index 0000000..1e7f268
Binary files /dev/null and b/java/thread/thread-state.png differ
diff --git a/java/thread/threadPool.jpg b/java/thread/threadPool.jpg
new file mode 100644
index 0000000..fb31072
Binary files /dev/null and b/java/thread/threadPool.jpg differ
diff --git "a/java/\343\200\212Java\345\274\200\345\217\221\346\211\213\345\206\214\343\200\213v1.5.0 \345\215\216\345\261\261\347\211\210.pdf - \345\277\253\346\215\267\346\226\271\345\274\217.lnk" "b/java/\343\200\212Java\345\274\200\345\217\221\346\211\213\345\206\214\343\200\213v1.5.0 \345\215\216\345\261\261\347\211\210.pdf - \345\277\253\346\215\267\346\226\271\345\274\217.lnk"
new file mode 100644
index 0000000..4041a10
Binary files /dev/null and "b/java/\343\200\212Java\345\274\200\345\217\221\346\211\213\345\206\214\343\200\213v1.5.0 \345\215\216\345\261\261\347\211\210.pdf - \345\277\253\346\215\267\346\226\271\345\274\217.lnk" differ
diff --git "a/java/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/java/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt"
new file mode 100644
index 0000000..5b15723
--- /dev/null
+++ "b/java/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt"
@@ -0,0 +1,3 @@
+http://www.tupwk.com.cn/downpage/search.asp
+http://ifeve.com/a-scalable-nonblocking-io-server/
+http://tutorials.jenkov.com/java-nio/selectors.html
\ No newline at end of file
diff --git "a/java/\346\241\206\346\236\266\346\250\241\345\274\217.png" "b/java/\346\241\206\346\236\266\346\250\241\345\274\217.png"
new file mode 100644
index 0000000..5705298
Binary files /dev/null and "b/java/\346\241\206\346\236\266\346\250\241\345\274\217.png" differ
diff --git "a/java/\346\250\241\345\274\217\345\214\272\345\210\253.jpg" "b/java/\346\250\241\345\274\217\345\214\272\345\210\253.jpg"
new file mode 100644
index 0000000..9c6edf1
Binary files /dev/null and "b/java/\346\250\241\345\274\217\345\214\272\345\210\253.jpg" differ
diff --git a/spring/622489-20180519092514495-1501179669.png b/spring/622489-20180519092514495-1501179669.png
new file mode 100644
index 0000000..f143132
Binary files /dev/null and b/spring/622489-20180519092514495-1501179669.png differ
diff --git a/spring/AspectJAwareAdvisorAutoProxyCreator.png b/spring/AspectJAwareAdvisorAutoProxyCreator.png
new file mode 100644
index 0000000..397b210
Binary files /dev/null and b/spring/AspectJAwareAdvisorAutoProxyCreator.png differ
diff --git a/spring/AutowiredAnnotationBeanPostProcessor.png b/spring/AutowiredAnnotationBeanPostProcessor.png
new file mode 100644
index 0000000..a60a5ef
Binary files /dev/null and b/spring/AutowiredAnnotationBeanPostProcessor.png differ
diff --git a/spring/BeanFactory.png b/spring/BeanFactory.png
new file mode 100644
index 0000000..66738cb
Binary files /dev/null and b/spring/BeanFactory.png differ
diff --git a/spring/FactoryBean.png b/spring/FactoryBean.png
new file mode 100644
index 0000000..3949288
Binary files /dev/null and b/spring/FactoryBean.png differ
diff --git "a/spring/QQ\345\233\276\347\211\20720200423014157.png" "b/spring/QQ\345\233\276\347\211\20720200423014157.png"
new file mode 100644
index 0000000..7b6200e
Binary files /dev/null and "b/spring/QQ\345\233\276\347\211\20720200423014157.png" differ
diff --git "a/spring/QQ\345\233\276\347\211\20720200423163915.png" "b/spring/QQ\345\233\276\347\211\20720200423163915.png"
new file mode 100644
index 0000000..35a830a
Binary files /dev/null and "b/spring/QQ\345\233\276\347\211\20720200423163915.png" differ
diff --git "a/spring/QQ\345\233\276\347\211\20720200424121301.png" "b/spring/QQ\345\233\276\347\211\20720200424121301.png"
new file mode 100644
index 0000000..e95d7e2
Binary files /dev/null and "b/spring/QQ\345\233\276\347\211\20720200424121301.png" differ
diff --git "a/spring/QQ\345\233\276\347\211\20720200424134451.png" "b/spring/QQ\345\233\276\347\211\20720200424134451.png"
new file mode 100644
index 0000000..6391243
Binary files /dev/null and "b/spring/QQ\345\233\276\347\211\20720200424134451.png" differ
diff --git a/spring/Screenshot_2020_0422_222322.png b/spring/Screenshot_2020_0422_222322.png
new file mode 100644
index 0000000..c6e7cbf
Binary files /dev/null and b/spring/Screenshot_2020_0422_222322.png differ
diff --git a/spring/Screenshot_2020_0422_224759.png b/spring/Screenshot_2020_0422_224759.png
new file mode 100644
index 0000000..e4b7b8f
Binary files /dev/null and b/spring/Screenshot_2020_0422_224759.png differ
diff --git a/spring/Spring-bean-life-cycle.png b/spring/Spring-bean-life-cycle.png
new file mode 100644
index 0000000..0978d5d
Binary files /dev/null and b/spring/Spring-bean-life-cycle.png differ
diff --git a/spring/Spring.png b/spring/Spring.png
new file mode 100644
index 0000000..a72eb9d
Binary files /dev/null and b/spring/Spring.png differ
diff --git a/spring/aop.png b/spring/aop.png
new file mode 100644
index 0000000..46c6f22
Binary files /dev/null and b/spring/aop.png differ
diff --git a/spring/beanLifeCycle.png b/spring/beanLifeCycle.png
new file mode 100644
index 0000000..c5a6496
Binary files /dev/null and b/spring/beanLifeCycle.png differ
diff --git a/spring/spring-aop.png b/spring/spring-aop.png
new file mode 100644
index 0000000..0567e12
Binary files /dev/null and b/spring/spring-aop.png differ
diff --git a/spring/spring.jpg b/spring/spring.jpg
new file mode 100644
index 0000000..829ac48
Binary files /dev/null and b/spring/spring.jpg differ
diff --git a/spring/spring.txt b/spring/spring.txt
new file mode 100644
index 0000000..71bc869
--- /dev/null
+++ b/spring/spring.txt
@@ -0,0 +1,868 @@
+BeanNameAware's setBeanName
+BeanClassLoaderAware's setBeanClassLoader
+BeanFactoryAware's setBeanFactory
+EnvironmentAware's setEnvironment
+EmbeddedValueResolverAware's setEmbeddedValueResolver
+ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
+ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
+MessageSourceAware's setMessageSource (only applicable when running in an application context)
+ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
+ServletContextAware's setServletContext (only applicable when running in a web application context)
+postProcessBeforeInitialization methods of BeanPostProcessors
+InitializingBean's afterPropertiesSet
+a custom init-method definition
+postProcessAfterInitialization methods of BeanPostProcessors
+On shutdown of a bean factory, the following lifecycle methods apply:
+
+
+DefaultListableBeanFactory
+-------------------------------】
+BeanPostProcessor接口是最顶层的接口
+// 初始化之前的操作
+ Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
+ // 初始化之后的操作
+ Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
+
+InstantiationAwareBeanPostProcessor接口继承自BeanPostProcessor接口
+// postProcessBeforeInstantiation方法的作用在目标对象被实例化之前调用的方法,可以返回目标实例的一个代理用来代替目标实例
+// beanClass参数表示目标对象的类型,beanName是目标实例在Spring容器中的name
+// 返回值类型是Object,如果返回的是非null对象,接下来除了postProcessAfterInitialization方法会被执行以外,其它bean构造的那些方法都不再执行。否则那些过程以及postProcessAfterInitialization方法都会执行
+Object postProcessBeforeInstantiation(Class> beanClass, String beanName) throws BeansException;
+
+// postProcessAfterInstantiation方法的作用在目标对象被实例化之后并且在属性值被populate之前调用
+// bean参数是目标实例(这个时候目标对象已经被实例化但是该实例的属性还没有被设置),beanName是目标实例在Spring容器中的name
+// 返回值是boolean类型,如果返回true,目标实例内部的返回值会被populate,否则populate这个过程会被忽视
+boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
+
+// postProcessPropertyValues方法的作用在属性中被设置到目标实例之前调用,可以修改属性的设置
+// pvs参数表示参数属性值(从BeanDefinition中获取),pds代表参数的描述信息(比如参数名,类型等描述信息),bean参数是目标实例,beanName是目标实例在Spring容器中的name
+// 返回值是PropertyValues,可以使用一个全新的PropertyValues代替原先的PropertyValues用来覆盖属性设置或者直接在参数pvs上修改。如果返回值是null,那么会忽略属性设置这个过程(所有属性不论使用什么注解,最后都是null)
+PropertyValues postProcessPropertyValues(
+ PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
+ throws BeansException;
+
+SmartInstantiationAwareBeanPostProcessor接口继承InstantiationAwareBeanPostProcessor接口
+// 预测Bean的类型,返回第一个预测成功的Class类型,如果不能预测返回null
+Class> predictBeanType(Class> beanClass, String beanName) throws BeansException;
+
+// 选择合适的构造器,比如目标对象有多个构造器,在这里可以进行一些定制化,选择合适的构造器
+// beanClass参数表示目标实例的类型,beanName是目标实例在Spring容器中的name
+// 返回值是个构造器数组,如果返回null,会执行下一个PostProcessor的determineCandidateConstructors方法;否则选取该PostProcessor选择的构造器
+Constructor>[] determineCandidateConstructors(Class> beanClass, String beanName) throws BeansException;
+
+// 获得提前暴露的bean引用。主要用于解决循环引用的问题
+// 只有单例对象才会调用此方法
+Object getEarlyBeanReference(Object bean, String beanName) throws BeansException;
+
+***********************************************
+postProcessBeforeInitialization是指bean在初始化之前需要调用的方法
+postProcessAfterInitialization是指bean在初始化之后需要调用的方法
+postProcessBeforeInitialization和postProcessAfterInitialization方法被调用的时候。这个时候bean已经被实例化,并且所有该注入的属性都已经被注入,是一个完整的bean
+这2个方法的返回值可以是原先生成的实例bean,或者使用wrapper包装这个实例
+
+SmartInstantiationAwareBeanPostProcessor接口继承InstantiationAwareBeanPostProcessor接口,它内部提供了3个方法,再加上父接口的5个方法,所以实现这个接口需要实现8个方法。SmartInstantiationAwareBeanPostProcessor接口的主要作用也是在于目标对象的实例化过程中需要处理的事情。它是InstantiationAwareBeanPostProcessor接口的一个扩展。主要在Spring框架内部使用
+predictBeanType方法用于预测Bean的类型,返回第一个预测成功的Class类型,如果不能预测返回null。主要在于BeanDefinition无法确定Bean类型的时候调用该方法来确定类型
+determineCandidateConstructors方法用于选择合适的构造器,比如类有多个构造器,可以实现这个方法选择合适的构造器并用于实例化对象。该方法在postProcessBeforeInstantiation方法和postProcessAfterInstantiation方法之间调用,如果postProcessBeforeInstantiation方法返回了一个新的实例代替了原本该生成的实例,那么该方法会被忽略
+getEarlyBeanReference主要用于解决循环引用问题。比如ReferenceA实例内部有ReferenceB的引用,ReferenceB实例内部有ReferenceA的引用。首先先实例化ReferenceA,实例化完成之后提前把这个bean暴露在ObjectFactory中,然后populate属性,这个时候发现需要ReferenceB。然后去实例化ReferenceB,在实例化ReferenceB的时候它需要ReferenceA的实例才能继续,这个时候就会去ObjectFactory中找出了ReferenceA实例,ReferenceB顺利实例化。ReferenceB实例化之后,ReferenceA的populate属性过程也成功完成,注入了ReferenceB实例。提前把这个bean暴露在ObjectFactory中,这个ObjectFactory获取的实例就是通过getEarlyBeanReference方法得到的
+
+
+InstantiationAwareBeanPostProcessor接口继承BeanPostProcessor接口,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所以实现这个接口需要实现5个方法。InstantiationAwareBeanPostProcessor接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置
+postProcessBeforeInstantiation方法是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走
+postProcessAfterInstantiation方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。如果该方法返回false,会忽略属性值的设置;如果返回true,会按照正常流程设置属性值
+postProcessPropertyValues方法对属性值进行修改(这个时候属性值还未被设置,但是我们可以修改原本该设置进去的属性值)。如果postProcessAfterInstantiation方法返回false,该方法不会被调用。可以在该方法内对属性值进行修改
+父接口BeanPostProcessor的2个方法postProcessBeforeInitialization和postProcessAfterInitialization都是在目标对象被实例化之后,并且属性也被设置之后调用的
+Instantiation表示实例化,Initialization表示初始化。实例化的意思在对象还未生成,初始化的意思在对象已经生成
+***********************************************
+
+org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
+
+
+
+
+
+
+
+
+
+
+
+#mysql.properties文件
+driver=com.mysql.jdbc.Driver
+url=jdbc:mysql://192.168.8.200:3306/bdrackdemo?useUnicode=true&characterEncoding=utf8&autoReconnect=true
+username=root
+password=cstorfs
+
+java.lang.Object
+org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor
+org.springframework.context.annotation.CommonAnnotationBeanPostProcessor
+All Implemented Interfaces:
+Serializable, Aware, BeanFactoryAware, BeanPostProcessor, DestructionAwareBeanPostProcessor, InstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, Ordered, PriorityOrdered
+ @PostConstruct and @PreDestroy @Resource
+https://docs.spring.io/spring-framework/docs/5.1.6.RELEASE/javadoc-api/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.html
+
+java.lang.Object
+org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter
+org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
+All Implemented Interfaces:
+Aware, BeanFactoryAware, BeanPostProcessor, InstantiationAwareBeanPostProcessor, SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, Ordered, PriorityOrdered
+@Required
+https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/annotation/RequiredAnnotationBeanPostProcessor.html
+
+java.lang.Object
+org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter
+org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
+All Implemented Interfaces:
+Aware, BeanFactoryAware, BeanPostProcessor, InstantiationAwareBeanPostProcessor, SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, Ordered, PriorityOrdered
+@@@Autowired and @Value
+https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.html
+
+java.lang.Object
+org.springframework.context.annotation.ConfigurationClassPostProcessor
+All Implemented Interfaces:
+Aware, BeanClassLoaderAware, BeanFactoryPostProcessor, BeanDefinitionRegistryPostProcessor, EnvironmentAware, ResourceLoaderAware, Ordered, PriorityOrdered
+@Configuration
+https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/ConfigurationClassPostProcessor.html
+
+
+
+
+ApplicationContextAwareProcessor
+
+AnnotationAwareAspectJAutoProxyCreator
+
+InstantiationAwareBeanPostProcessor
+
+AspectJAwareAdvisorAutoProxyCreator Spring启动时的beanPostProcessor,bean生命周期中经常可以看到beanPostProcessor在起作用,AOP也是基于IOC来实现的。
+例化ApplicationContext中加载配置文件过程
+
+refresh- obtainFreshBeanFactory- refreshBeanFactory- AbstractRefreshableApplicationContext.loadBeanDefinitions(beanFactory)- …- XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)- DefaultBeanDefinitionDocumentReader.parseBeanDefinitions
+
+AspectJAwareAdvisorAutoProxyCreator的postProcessAfterInitialization方法再其父类AbstractAutoProxyCreator中实现,其会对已经实例化的bean进行wrap。
+
+internalConfigurationAnnotationProcessor
+ConfigurationClassPostProcessor
+IoC容器启动流程中, refresh()
+invokeBeanFactoryPostProcessors
+BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor,#postProcessBeanDefinitionRegistry()ConfigurationClassPostProcessor
+BeanFactoryPostProcessor#postProcessBeanFactory(ConfigurableListableBeanFactory)
+
+执行逻辑总结:
+ 1、先执行BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry方法,其中BeanDefinitionRegistryPostProcessor执行优先级如下:
+ a、addBeanFactoryPostProcessor()传入到优先级最高,因为不需要实例化,直接可以获取到对象进行执行;
+ b、然后从IoC容器中获取PriorityOrdered接口的BeanDefinitionRegistryPostProcessor,实例化并排序后执行postProcessBeanDefinitionRegistry方法
+ c、然后从IoC容器中获取Ordered接口的BeanDefinitionRegistryPostProcessor,实例化并排序后执行postProcessBeanDefinitionRegistry方法
+ d、然后从IoC容器中获取剩余的BeanDefinitionRegistryPostProcessor,实例化后执行postProcessBeanDefinitionRegistry方法;注意这个处理步骤存在一个循环,主要是存在执行前面的BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry方法时,存在可能会向IoC容器中注册新的BeanDefinitionRegistryPostProcessor,通过循环保证都会被执行;
+ 2、然后执行BeanDefinitionRegistryPostProcessor#postProcessBeanFactory方法,执行顺序参照步骤1中执行顺序;
+ 3、最后才会执行BeanFactoryPostProcessor#postProcessBeanFactory,执行优先级和BeanDefinitionRegistryPostProcessor一致:
+ a、addBeanFactoryPostProcessor()传入到优先级最高,因为不需要实例化,直接可以获取到对象进行执行;
+ b、然后从IoC容器中获取PriorityOrdered接口的BeanFactoryPostProcessor,实例化并排序后执行postProcessBeanFactory方法
+ c、然后从IoC容器中获取Ordered接口的BeanFactoryPostProcessor,实例化并排序后执行postProcessBeanFactory方法
+ d、然后从IoC容器中获取剩余的BeanFactoryPostProcessor,实例化后执行postProcessBeanFactory方法
+
+总结:
+1、不同方法执行优先级:`BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry` > `BeanDefinitionRegistryPostProcessor#postProcessBeanFactory` > `BeanFactoryPostProcessor#postProcessBeanFactory`;
+2、同方法执行优先级:`addBeanFactoryPostProcessor` > `PriorityOrdered` > `Ordered` > 非排序
+Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appProperties' defined in spring.config.DatabaseConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [spring.bean.ApplicationProperties]: Factory method 'appProperties' threw exception; nested exception is java.lang.NullPointerException
+ at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656)
+ at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:484)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
+ at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
+ at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$31/1418385211.getObject(Unknown Source)
+ at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
+ at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
+ at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:879)
+ at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
+ at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
+ at org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:89)
+ at spring.test.DatabaseBeanDefinitionRegistryPostProcessorExample.main(DatabaseBeanDefinitionRegistryPostProcessorExample.java:19)
+Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [spring.bean.ApplicationProperties]: Factory method 'appProperties' threw exception; nested exception is java.lang.NullPointerException
+ at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
+ at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651)
+ ... 15 more
+Caused by: java.lang.NullPointerException
+ at spring.config.DatabaseConfiguration.appProperties(DatabaseConfiguration.java:23)
+ at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ at java.lang.reflect.Method.invoke(Method.java:483)
+ at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
+ ... 16 more
+
+ Exception in thread "main" java.lang.IllegalStateException: app.connection.port is not found
+ at spring.config.RedisDataSourceProperties.getProperty(RedisDataSourceProperties.java:101)
+ at spring.config.RedisDataSourceProperties.getProperty(RedisDataSourceProperties.java:95)
+ at spring.config.RedisDataSourceProperties.(RedisDataSourceProperties.java:28)
+ at spring.bean.RedisBeanDefinitionRegistryPostProcessor.parseProperties(RedisBeanDefinitionRegistryPostProcessor.java:100)
+ at spring.bean.RedisBeanDefinitionRegistryPostProcessor.createRedisDatabaseBeans(RedisBeanDefinitionRegistryPostProcessor.java:109)
+ at spring.bean.RedisBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(RedisBeanDefinitionRegistryPostProcessor.java:62)
+ at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
+ at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:125)
+ at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706)
+ at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
+ at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:144)
+ at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:85)
+ at spring.test.TestSpringBeanLifecycleApp.testSpringBeanLifecycle2(TestSpringBeanLifecycleApp.java:58)
+ at spring.test.TestSpringBeanLifecycleApp.main(TestSpringBeanLifecycleApp.java:18)
+
+
+ context beanFactory bean
+
+
+ int count = registry.getBeanDefinitionCount();
+ String[] beanNames = registry.getBeanDefinitionNames();
+ System.out.println("Enter BeanDefinitionRegistryPostProcessor 111111111111: "+count);
+ System.out.println("execute postProcessBeanDefinitio.Registry() 1111111111111");
+ System.out.println("BeanDefinitionRegistryPostProcessor postProcessBeanDefinitionRegistry阶段总共:"+count+" 个Beans");
+ System.out.println(Arrays.asList(beanNames));
+
+ int count = beanFactory.getBeanDefinitionCount();
+ String[] beanNames = beanFactory.getBeanDefinitionNames();
+ System.out.println("BeanDefinitionRegistryPostProcessor postProcessBeanFactory阶段总共:"+count+" 个Beans");
+ System.out.println(Arrays.asList(beanNames));
+
+
+ System.out.println("Execute BeanFactoryPostProcessor postProcessBeanFactory() 444444444444");
+ int count = beanFactory.getBeanDefinitionCount();
+ String[] beanNames = beanFactory.getBeanDefinitionNames();
+ System.out.println("BeanFactoryPostProcessor postProcessBeanFactory阶段总共:"+count+" 个Beans");
+ System.out.println(Arrays.asList(beanNames));
+
+
+ //遍历IoC中BeanDefinition
+ Arrays.stream(beanNames)
+ .forEach(x -> enhancer(beanFactory.getBeanDefinition(x)));
+
+ [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,
+ org.springframework.context.annotation.internalAutowiredAnnotationProcessor,
+ org.springframework.context.annotation.internalCommonAnnotationProcessor,
+ org.springframework.context.event.internalEventListenerProcessor,
+ org.springframework.context.event.internalEventListenerFactory,
+ redisDatabaseConfiguration,
+ dbConfigBean,
+ redisConfigBeanFactory,
+ datasource_redis,
+ repository_redis]
+
+spring的bean容器相关的注解有:@Required, @Autowired, @PostConstruct, @PreDestory。还有Spring3.0开始支持的JSR-330标准javax.inject.*中的注解(@Inject, @Named, @Qualifier, @Provider, @Scope, @Singleton).
+
+springmvc相关的注解有:@Controller,@RequestMapping,@RequestParam, @ResponseBody等等。
+
+观察者模式,命令模式
+工厂模式,责任链模式,代理模式,适配器模式,构建者模式,门面设计模式,
+装饰器模式,模板,单例模式,迭代器模式,组合模式
+
+Builder模式 : 例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
+工厂模式 : 例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
+单例模式 :例如ErrorContext和LogFactory;
+代理模式 :Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
+组合模式 :例如SqlNode和各个子类ChooseSqlNode等;
+模板方法模式 : 例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
+适配器模式 : 例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
+装饰者模式 : 例如cache包中的cache.decorators子包中等各个装饰者的实现;
+迭代器模式 : 例如迭代器模式PropertyTokenizer;
+
+一、 Spring 中常见的设计模式
+
+工厂模式 : BeanFactory
+
+装饰器模式: BeanWrapper
+
+代理模式: AopProxy
+
+单例模式: ApplicationContext
+
+委派模式: DispatcherServlet
+
+策略模式: HandlerMapping
+
+适配器模式: HandlerApdapter
+
+模板方法模式: JdbcTemplate
+
+观察者模式: ContextLoaderListener
+
+二、Spring 的四大模块及典型的设计模式
+
+ 1、Spring IOC 工厂模式、单例模式、装饰器模式
+
+ 2、Spring AOP 代理模式、观察者模式
+
+ 3、Spring MVC 委派模式、适配器模式
+
+ 4、Spring JDBC 模板方法模式
+
+
+
+org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
+org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
+
+
+org.springframework.beans.factory.config.SingletonBeanRegistry
+
+ /** Cache of singleton objects: bean name to bean instance. */
+ private final Map singletonObjects = new ConcurrentHashMap<>(256);
+
+ /** Cache of singleton factories: bean name to ObjectFactory. */
+ private final Map> singletonFactories = new HashMap<>(16);
+
+ /** Cache of early singleton objects: bean name to bean instance. */
+ private final Map earlySingletonObjects = new HashMap<>(16);
+
+ /** Set of registered singletons, containing the bean names in registration order. */
+ private final Set registeredSingletons = new LinkedHashSet<>(256);
+
+ /** Names of beans that are currently in creation. */
+ private final Set singletonsCurrentlyInCreation =
+ Collections.newSetFromMap(new ConcurrentHashMap<>(16));
+
+ /** Names of beans currently excluded from in creation checks. */
+ private final Set inCreationCheckExclusions =
+ Collections.newSetFromMap(new ConcurrentHashMap<>(16));
+
+
+
+
+ ## Bean creation process
+
+st => start: springBoot main run method
+ e => end: Bean created
+op1=>operation: SpringApplication.refreshContext(context)
+op2=>operation: SpringApplication.refresh(context)
+op3=>operation: EmbeddedWebApplicationContext.refresh()(super.refesh())
+op4=>operation: AbstractApplicationContext.refresh()
+// Instantiate all remaining (non-lazy-init) singletons.
+//finishBeanFactoryInitialization(beanFactory);
+op5=>operation: AbstractApplicationContext.finishBeanFactoryInitialization()
+// Instantiate all remaining (non-lazy-init) singletons.
+//beanFactory.preInstantiateSingletons();
+op6=>operation: DefaultListableBeanFactory.preInstantiateSingletons()
+//getBean(beanName);
+op7=>operation: AbstractBeanFactory.getBean(String name)
+//return doGetBean(name, null, null, false);
+op8=>operation: AbstractBeanFactory.doGetBean()
+//sharedInstance = getSingleton(beanName, new ObjectFactory