From bf5b52ca85c042f0fc9660066a6c0d0505f48c18 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Mon, 19 Mar 2018 15:27:36 +0800 Subject: [PATCH 001/283] =?UTF-8?q?:sparkles:=20Introducing=20new=20featur?= =?UTF-8?q?es.=20=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F--->=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=96=B9=E6=B3=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/pattern/factorymethod/Animal.java | 26 +++++++++++++++++++ .../pattern/factorymethod/AnimalFactory.java | 13 ++++++++++ .../design/pattern/factorymethod/Cat.java | 15 +++++++++++ .../pattern/factorymethod/CatFactory.java | 15 +++++++++++ .../design/pattern/factorymethod/Fish.java | 17 ++++++++++++ .../pattern/factorymethod/FishFactory.java | 15 +++++++++++ .../design/pattern/factorymethod/Main.java | 17 ++++++++++++ 7 files changed, 118 insertions(+) create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/Animal.java create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/AnimalFactory.java create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/Cat.java create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/CatFactory.java create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/Fish.java create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/FishFactory.java create mode 100644 src/main/java/com/crossoverjie/design/pattern/factorymethod/Main.java diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/Animal.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Animal.java new file mode 100644 index 00000000..04556a40 --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Animal.java @@ -0,0 +1,26 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 14:29 + * @since JDK 1.8 + */ +public abstract class Animal { + + private String name ; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * 描述抽象方法 + */ + protected abstract void desc() ; +} diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/AnimalFactory.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/AnimalFactory.java new file mode 100644 index 00000000..fb7f571f --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/AnimalFactory.java @@ -0,0 +1,13 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function:工厂方法模式 + * + * @author crossoverJie + * Date: 19/03/2018 14:29 + * @since JDK 1.8 + */ +public interface AnimalFactory { + + Animal createAnimal() ; +} diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/Cat.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Cat.java new file mode 100644 index 00000000..7d0393cb --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Cat.java @@ -0,0 +1,15 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 14:33 + * @since JDK 1.8 + */ +public class Cat extends Animal { + @Override + protected void desc() { + System.out.println("Cat name is=" + this.getName()); + } +} diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/CatFactory.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/CatFactory.java new file mode 100644 index 00000000..a8f90d65 --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/CatFactory.java @@ -0,0 +1,15 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 15:21 + * @since JDK 1.8 + */ +public class CatFactory implements AnimalFactory { + @Override + public Animal createAnimal() { + return new Cat(); + } +} diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/Fish.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Fish.java new file mode 100644 index 00000000..9820c1a7 --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Fish.java @@ -0,0 +1,17 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 14:32 + * @since JDK 1.8 + */ +public class Fish extends Animal { + + + @Override + protected void desc() { + System.out.println("fish name is=" + this.getName()); + } +} diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/FishFactory.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/FishFactory.java new file mode 100644 index 00000000..8e59610a --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/FishFactory.java @@ -0,0 +1,15 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 15:21 + * @since JDK 1.8 + */ +public class FishFactory implements AnimalFactory { + @Override + public Animal createAnimal() { + return new Fish() ; + } +} diff --git a/src/main/java/com/crossoverjie/design/pattern/factorymethod/Main.java b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Main.java new file mode 100644 index 00000000..440aaa43 --- /dev/null +++ b/src/main/java/com/crossoverjie/design/pattern/factorymethod/Main.java @@ -0,0 +1,17 @@ +package com.crossoverjie.design.pattern.factorymethod; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 14:34 + * @since JDK 1.8 + */ +public class Main { + public static void main(String[] args) { + AnimalFactory factory = new CatFactory() ; + Animal animal = factory.createAnimal(); + animal.setName("猫咪"); + animal.desc(); + } +} From b70fd0d50ca191a2edd3bde95b970ebc64a12e5e Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 20 Mar 2018 18:55:00 +0800 Subject: [PATCH 002/283] :sparkles: Introducing new features.three method bean lifecycle --- .../crossoverjie/spring/LifeCycleConfig.java | 25 +++++++++++++++ .../crossoverjie/spring/SpringLifeCycle.java | 28 +++++++++++++++++ .../spring/annotation/AnnotationBean.java | 31 +++++++++++++++++++ .../service/SpringLifeCycleService.java | 30 ++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 src/main/java/com/crossoverjie/spring/LifeCycleConfig.java create mode 100644 src/main/java/com/crossoverjie/spring/SpringLifeCycle.java create mode 100644 src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java create mode 100644 src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java diff --git a/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java b/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java new file mode 100644 index 00000000..37723233 --- /dev/null +++ b/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java @@ -0,0 +1,25 @@ +package com.crossoverjie.spring; + +import com.crossoverjie.concurrent.Singleton; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * Function: + * + * @author crossoverJie + * Date: 19/03/2018 22:37 + * @since JDK 1.8 + */ +@Configuration +public class LifeCycleConfig { + + + @Bean(initMethod = "start", destroyMethod = "destroy") + public SpringLifeCycle create(){ + SpringLifeCycle springLifeCycle = new SpringLifeCycle() ; + + return springLifeCycle ; + } +} diff --git a/src/main/java/com/crossoverjie/spring/SpringLifeCycle.java b/src/main/java/com/crossoverjie/spring/SpringLifeCycle.java new file mode 100644 index 00000000..0a016b3a --- /dev/null +++ b/src/main/java/com/crossoverjie/spring/SpringLifeCycle.java @@ -0,0 +1,28 @@ +package com.crossoverjie.spring; + +import com.crossoverjie.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +/** + * Function: + * + * @author crossoverJie + * Date: 20/03/2018 18:23 + * @since JDK 1.8 + */ +public class SpringLifeCycle{ + + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycle.class); + public void start(){ + LOGGER.info("SpringLifeCycle start"); + } + + + public void destroy(){ + LOGGER.info("SpringLifeCycle destroy"); + } +} diff --git a/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java b/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java new file mode 100644 index 00000000..9f8423da --- /dev/null +++ b/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java @@ -0,0 +1,31 @@ +package com.crossoverjie.spring.annotation; + +import com.crossoverjie.spring.SpringLifeCycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +/** + * Function: + * + * @author crossoverJie + * Date: 20/03/2018 18:46 + * @since JDK 1.8 + */ +@Component +public class AnnotationBean { + private final static Logger LOGGER = LoggerFactory.getLogger(AnnotationBean.class); + + @PostConstruct + public void start(){ + LOGGER.info("AnnotationBean start"); + } + + @PreDestroy + public void destroy(){ + LOGGER.info("AnnotationBean destroy"); + } +} diff --git a/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java b/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java new file mode 100644 index 00000000..432e28da --- /dev/null +++ b/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java @@ -0,0 +1,30 @@ +package com.crossoverjie.spring.service; + +import com.crossoverjie.spring.SpringLifeCycle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +/** + * Function:首先执行 + * + * @author crossoverJie + * Date: 20/03/2018 18:38 + * @since JDK 1.8 + */ +@Service +public class SpringLifeCycleService implements InitializingBean,DisposableBean{ + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleService.class); + @Override + public void destroy() throws Exception { + LOGGER.info("SpringLifeCycleService destroy"); + } + + @Override + public void afterPropertiesSet() throws Exception { + LOGGER.info("SpringLifeCycleService start"); + } +} From 10f06bb5b58a09827a36f8768b4e1b976587e25d Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 20 Mar 2018 19:00:11 +0800 Subject: [PATCH 003/283] :bulb: moment --- src/main/java/com/crossoverjie/spring/LifeCycleConfig.java | 2 +- .../java/com/crossoverjie/spring/annotation/AnnotationBean.java | 2 +- .../com/crossoverjie/spring/service/SpringLifeCycleService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java b/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java index 37723233..fd44aa6d 100644 --- a/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java +++ b/src/main/java/com/crossoverjie/spring/LifeCycleConfig.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration; /** - * Function: + * Function:使用 initMethod 和 destroyMethod 的方式 * * @author crossoverJie * Date: 19/03/2018 22:37 diff --git a/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java b/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java index 9f8423da..e848581b 100644 --- a/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java +++ b/src/main/java/com/crossoverjie/spring/annotation/AnnotationBean.java @@ -9,7 +9,7 @@ import javax.annotation.PreDestroy; /** - * Function: + * Function:用注解的方法 * * @author crossoverJie * Date: 20/03/2018 18:46 diff --git a/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java b/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java index 432e28da..7918553d 100644 --- a/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java +++ b/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; /** - * Function:首先执行 + * Function:实现 InitializingBean DisposableBean 接口 * * @author crossoverJie * Date: 20/03/2018 18:38 From 75fbc43a727830790c2ac0980f592491f647be72 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 20 Mar 2018 23:38:57 +0800 Subject: [PATCH 004/283] :bulb: moment --- .../spring/aware/SpringLifeCycleAware.java | 29 +++++++++++++++++++ .../processor/SpringLifeCycleProcessor.java | 29 +++++++++++++++++++ .../service/SpringLifeCycleService.java | 8 ++--- 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/crossoverjie/spring/aware/SpringLifeCycleAware.java create mode 100644 src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java diff --git a/src/main/java/com/crossoverjie/spring/aware/SpringLifeCycleAware.java b/src/main/java/com/crossoverjie/spring/aware/SpringLifeCycleAware.java new file mode 100644 index 00000000..d3b288a1 --- /dev/null +++ b/src/main/java/com/crossoverjie/spring/aware/SpringLifeCycleAware.java @@ -0,0 +1,29 @@ +package com.crossoverjie.spring.aware; + +import com.crossoverjie.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Function: + * + * @author crossoverJie + * Date: 20/03/2018 21:54 + * @since JDK 1.8 + */ +@Component +public class SpringLifeCycleAware implements ApplicationContextAware { + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleAware.class); + + private ApplicationContext applicationContext ; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext ; + LOGGER.info("SpringLifeCycleAware start"); + } +} diff --git a/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java b/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java new file mode 100644 index 00000000..6e43a848 --- /dev/null +++ b/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java @@ -0,0 +1,29 @@ +package com.crossoverjie.spring.processor; + +import com.crossoverjie.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.stereotype.Component; + +/** + * Function: + * + * @author crossoverJie + * Date: 20/03/2018 22:11 + * @since JDK 1.8 + */ +@Component +public class SpringLifeCycleProcessor implements BeanPostProcessor { + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class); + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } +} diff --git a/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java b/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java index 7918553d..302aac1d 100644 --- a/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java +++ b/src/main/java/com/crossoverjie/spring/service/SpringLifeCycleService.java @@ -19,12 +19,12 @@ public class SpringLifeCycleService implements InitializingBean,DisposableBean{ private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleService.class); @Override - public void destroy() throws Exception { - LOGGER.info("SpringLifeCycleService destroy"); + public void afterPropertiesSet() throws Exception { + LOGGER.info("SpringLifeCycleService start"); } @Override - public void afterPropertiesSet() throws Exception { - LOGGER.info("SpringLifeCycleService start"); + public void destroy() throws Exception { + LOGGER.info("SpringLifeCycleService destroy"); } } From 7c8fb5764b0d010895265e7f77a41e479b054044 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Tue, 20 Mar 2018 23:40:39 +0800 Subject: [PATCH 005/283] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c85ee99..23261664 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -`Java` 日常开发知识点,继续完善中。 +Java 知识点,继续完善中。 -> 多数是一些 `Java` 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。 +> 多数是一些 Java 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。 如果对你有帮助请点下 `Star`,有疑问欢迎提 [Issues](https://github.com/crossoverJie/Java-Interview/issues),有好的想法请提 [PR](https://github.com/crossoverJie/Java-Interview/pulls)。 @@ -72,4 +72,4 @@ > crossoverJie#gmail.com -![](https://ws4.sinaimg.cn/large/006tKfTcly1fochm4as0sj30by0bydgh.jpg) \ No newline at end of file +![](https://ws4.sinaimg.cn/large/006tKfTcly1fochm4as0sj30by0bydgh.jpg) From 4a489dcad45a50f4713cd2f6a4f15f6957c361f4 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 00:11:18 +0800 Subject: [PATCH 006/283] Revert "Update README.md" This reverts commit 7c8fb5764b0d010895265e7f77a41e479b054044. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 23261664..0c85ee99 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -Java 知识点,继续完善中。 +`Java` 日常开发知识点,继续完善中。 -> 多数是一些 Java 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。 +> 多数是一些 `Java` 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。 如果对你有帮助请点下 `Star`,有疑问欢迎提 [Issues](https://github.com/crossoverJie/Java-Interview/issues),有好的想法请提 [PR](https://github.com/crossoverJie/Java-Interview/pulls)。 @@ -72,4 +72,4 @@ Java 知识点,继续完善中。 > crossoverJie#gmail.com -![](https://ws4.sinaimg.cn/large/006tKfTcly1fochm4as0sj30by0bydgh.jpg) +![](https://ws4.sinaimg.cn/large/006tKfTcly1fochm4as0sj30by0bydgh.jpg) \ No newline at end of file From 0a8b885dffdf26a02d8c6c020b46c794aba5b6b6 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 00:14:31 +0800 Subject: [PATCH 007/283] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c85ee99..19c6a208 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ -`Java` 日常开发知识点,继续完善中。 +Java 知识点,继续完善中。 + +> 多数是一些 Java 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。 -> 多数是一些 `Java` 基础知识、底层原理、算法详解。也有上层应用设计,其中不乏一些大厂面试真题。 如果对你有帮助请点下 `Star`,有疑问欢迎提 [Issues](https://github.com/crossoverJie/Java-Interview/issues),有好的想法请提 [PR](https://github.com/crossoverJie/Java-Interview/pulls)。 @@ -72,4 +73,4 @@ > crossoverJie#gmail.com -![](https://ws4.sinaimg.cn/large/006tKfTcly1fochm4as0sj30by0bydgh.jpg) \ No newline at end of file +![](https://ws4.sinaimg.cn/large/006tKfTcly1fochm4as0sj30by0bydgh.jpg) From ca117bfa773cedb561b15063864e98138611bf8d Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:01:22 +0800 Subject: [PATCH 008/283] :sparkles: Introducing new features.Spring lifecycle --- .../spring/processor/SpringLifeCycleProcessor.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java b/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java index 6e43a848..67d4ffb8 100644 --- a/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java +++ b/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java @@ -19,11 +19,17 @@ public class SpringLifeCycleProcessor implements BeanPostProcessor { private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class); @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if ("annotationBean".equals(beanName)){ + LOGGER.info("SpringLifeCycleProcessor start beanName={}",beanName); + } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if ("annotationBean".equals(beanName)){ + LOGGER.info("SpringLifeCycleProcessor end beanName={}",beanName); + } return bean; } } From c873be2c81d9c0036eed7addc605de1dd1176d9b Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:02:05 +0800 Subject: [PATCH 009/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 160 +++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 MD/spring/spring-bean-lifecycle.md diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md new file mode 100644 index 00000000..0486b5ad --- /dev/null +++ b/MD/spring/spring-bean-lifecycle.md @@ -0,0 +1,160 @@ +## Spring Bean 生命周期 + + +### 前言 + +Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 + +首先放一张很经典的生命周期图: + +![](https://ws2.sinaimg.cn/large/006tNc79gy1fpjqo8lkc6j30fi0eemye.jpg) + +再谈生命周期之前有一点需要先明确: + +> Spring 只帮我们管理单例模式 Bean 的**完整**生命周期,对于 prototype 的 bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。 + + +### 注解方式 + +在 bean 初始化时会经历几个阶段,首先可以使用注解 `@PostConstruct`, `@PreDestroy` 来再 bean 的创建和销毁阶段进行调用: + +```java +@Component +public class AnnotationBean { + private final static Logger LOGGER = LoggerFactory.getLogger(AnnotationBean.class); + + @PostConstruct + public void start(){ + LOGGER.info("AnnotationBean start"); + } + + @PreDestroy + public void destroy(){ + LOGGER.info("AnnotationBean destroy"); + } +} +``` + +### InitializingBean, DisposableBean 接口 + +还可以实现 `InitializingBean,DisposableBean` 这两个接口,也是在初始化已经销毁阶段调用: + +```java +@Service +public class SpringLifeCycleService implements InitializingBean,DisposableBean{ + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleService.class); + @Override + public void afterPropertiesSet() throws Exception { + LOGGER.info("SpringLifeCycleService start"); + } + + @Override + public void destroy() throws Exception { + LOGGER.info("SpringLifeCycleService destroy"); + } +} +``` + +### 自定义初始化和销毁方法 + +也可以自定义方法用于在初始化、销毁阶段进行调用: + +```java +@Configuration +public class LifeCycleConfig { + + + @Bean(initMethod = "start", destroyMethod = "destroy") + public SpringLifeCycle create(){ + SpringLifeCycle springLifeCycle = new SpringLifeCycle() ; + + return springLifeCycle ; + } +} + +public class SpringLifeCycle{ + + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycle.class); + public void start(){ + LOGGER.info("SpringLifeCycle start"); + } + + + public void destroy(){ + LOGGER.info("SpringLifeCycle destroy"); + } +} +``` + +以上是在 SpringBoot 中可以这样配置,如果是原始的基于 XML 也是可以利用: + +``` + + +``` + +来达到同样的效果。 + +### 实现 *Aware 接口 + +`*Aware` 接口可以用于在初始化 bean 时获得 Spring 中的一些对象,如获取 `Spring 上下文`等。 + +```java +@Component +public class SpringLifeCycleAware implements ApplicationContextAware { + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleAware.class); + + private ApplicationContext applicationContext ; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext ; + LOGGER.info("SpringLifeCycleAware start"); + } +} +``` + +这样在 `springLifeCycleAware` 这个 bean 初始化会就会调用 `setApplicationContext` 方法,并可以获得 applicationContext 对象。 + +### BeanPostProcessor 后处理器 + +也可以实现 BeanPostProcessor 接口,Spring 中所有 bean 在做初始化时都会调用该接口中的两个方法,可以用于对一些特殊的 bean 进行处理: + +```java +@Component +public class SpringLifeCycleProcessor implements BeanPostProcessor { + private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class); + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } +} +``` + +执行之后观察结果: + +``` +018-03-21 00:40:24.856 [restartedMain] INFO c.c.s.p.SpringLifeCycleProcessor - SpringLifeCycleProcessor start beanName=annotationBean +2018-03-21 00:40:24.860 [restartedMain] INFO c.c.spring.annotation.AnnotationBean - AnnotationBean start +2018-03-21 00:40:24.861 [restartedMain] INFO c.c.s.p.SpringLifeCycleProcessor - SpringLifeCycleProcessor end beanName=annotationBean +2018-03-21 00:40:24.864 [restartedMain] INFO c.c.s.aware.SpringLifeCycleAware - SpringLifeCycleAware start +2018-03-21 00:40:24.867 [restartedMain] INFO c.c.s.service.SpringLifeCycleService - SpringLifeCycleService start +2018-03-21 00:40:24.887 [restartedMain] INFO c.c.spring.SpringLifeCycle - SpringLifeCycle start +2018-03-21 00:40:25.062 [restartedMain] INFO o.s.b.d.a.OptionalLiveReloadServer - LiveReload server is running on port 35729 +2018-03-21 00:40:25.122 [restartedMain] INFO o.s.j.e.a.AnnotationMBeanExporter - Registering beans for JMX exposure on startup +2018-03-21 00:40:25.140 [restartedMain] INFO com.crossoverjie.Application - Started Application in 2.309 seconds (JVM running for 3.681) +2018-03-21 00:40:25.143 [restartedMain] INFO com.crossoverjie.Application - start ok! +2018-03-21 00:40:25.153 [Thread-8] INFO o.s.c.a.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@3913adad: startup date [Wed Mar 21 00:40:23 CST 2018]; root of context hierarchy +2018-03-21 00:40:25.155 [Thread-8] INFO o.s.j.e.a.AnnotationMBeanExporter - Unregistering JMX-exposed beans on shutdown +2018-03-21 00:40:25.156 [Thread-8] INFO c.c.spring.SpringLifeCycle - SpringLifeCycle destroy +2018-03-21 00:40:25.156 [Thread-8] INFO c.c.s.service.SpringLifeCycleService - SpringLifeCycleService destroy +2018-03-21 00:40:25.156 [Thread-8] INFO c.c.spring.annotation.AnnotationBean - AnnotationBean destroy +``` + + + From 0d6f2a86a93d4a81e7299777010a1abcf318629c Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:06:48 +0800 Subject: [PATCH 010/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index 0486b5ad..fa2f2fd4 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -5,7 +5,7 @@ Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 -首先放一张很经典的生命周期图: +首先放一张经典的生命周期图: ![](https://ws2.sinaimg.cn/large/006tNc79gy1fpjqo8lkc6j30fi0eemye.jpg) @@ -156,5 +156,5 @@ public class SpringLifeCycleProcessor implements BeanPostProcessor { 2018-03-21 00:40:25.156 [Thread-8] INFO c.c.spring.annotation.AnnotationBean - AnnotationBean destroy ``` - +之后则是进入 bean 的销毁阶段。 From e9ab450db034e240becd6343999f44e9ff8a0190 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:07:22 +0800 Subject: [PATCH 011/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 1 - 1 file changed, 1 deletion(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index fa2f2fd4..ec77bb80 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -1,7 +1,6 @@ ## Spring Bean 生命周期 -### 前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 From 8d99cb76ac5c193bd2e73ad96dcf1008451eecd0 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:12:06 +0800 Subject: [PATCH 012/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index ec77bb80..f40527b5 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -36,7 +36,7 @@ public class AnnotationBean { ### InitializingBean, DisposableBean 接口 -还可以实现 `InitializingBean,DisposableBean` 这两个接口,也是在初始化已经销毁阶段调用: +还可以实现 `InitializingBean,DisposableBean` 这两个接口,也是在初始化以及销毁阶段调用: ```java @Service @@ -56,7 +56,7 @@ public class SpringLifeCycleService implements InitializingBean,DisposableBean{ ### 自定义初始化和销毁方法 -也可以自定义方法用于在初始化、销毁阶段进行调用: +也可以自定义方法用于在初始化、销毁阶段调用: ```java @Configuration @@ -85,7 +85,7 @@ public class SpringLifeCycle{ } ``` -以上是在 SpringBoot 中可以这样配置,如果是原始的基于 XML 也是可以利用: +以上是在 SpringBoot 中可以这样配置,如果是原始的基于 XML 也是可以使用: ``` @@ -113,11 +113,11 @@ public class SpringLifeCycleAware implements ApplicationContextAware { } ``` -这样在 `springLifeCycleAware` 这个 bean 初始化会就会调用 `setApplicationContext` 方法,并可以获得 applicationContext 对象。 +这样在 `springLifeCycleAware` 这个 bean 初始化会就会调用 `setApplicationContext` 方法,并可以获得 `applicationContext` 对象。 ### BeanPostProcessor 后处理器 -也可以实现 BeanPostProcessor 接口,Spring 中所有 bean 在做初始化时都会调用该接口中的两个方法,可以用于对一些特殊的 bean 进行处理: +实现 BeanPostProcessor 接口,Spring 中所有 bean 在做初始化时都会调用该接口中的两个方法,可以用于对一些特殊的 bean 进行处理: ```java @Component @@ -125,11 +125,17 @@ public class SpringLifeCycleProcessor implements BeanPostProcessor { private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class); @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + if ("annotationBean".equals(beanName)){ + LOGGER.info("SpringLifeCycleProcessor start beanName={}",beanName); + } return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if ("annotationBean".equals(beanName)){ + LOGGER.info("SpringLifeCycleProcessor end beanName={}",beanName); + } return bean; } } From d30e8b951e309856e3e70f50b0320a924d2bf681 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:13:54 +0800 Subject: [PATCH 013/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index f40527b5..9a71923e 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -4,9 +4,9 @@ Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 -首先放一张经典的生命周期图: +首先看下生命周期图: -![](https://ws2.sinaimg.cn/large/006tNc79gy1fpjqo8lkc6j30fi0eemye.jpg) +![](https://ws3.sinaimg.cn/large/006tNc79gy1fpjsamy6uoj30nt0cqq4i.jpg) 再谈生命周期之前有一点需要先明确: From ebffa511170e664116c62cbeac68b1ad6e1fb949 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:21:06 +0800 Subject: [PATCH 014/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 17 ++++++++++++++++- .../processor/SpringLifeCycleProcessor.java | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index 9a71923e..903d06a6 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -115,7 +115,7 @@ public class SpringLifeCycleAware implements ApplicationContextAware { 这样在 `springLifeCycleAware` 这个 bean 初始化会就会调用 `setApplicationContext` 方法,并可以获得 `applicationContext` 对象。 -### BeanPostProcessor 后处理器 +### BeanPostProcessor 增强处理器 实现 BeanPostProcessor 接口,Spring 中所有 bean 在做初始化时都会调用该接口中的两个方法,可以用于对一些特殊的 bean 进行处理: @@ -123,6 +123,14 @@ public class SpringLifeCycleAware implements ApplicationContextAware { @Component public class SpringLifeCycleProcessor implements BeanPostProcessor { private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class); + + /** + * 预初始化 初始化之前调用 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("annotationBean".equals(beanName)){ @@ -131,6 +139,13 @@ public class SpringLifeCycleProcessor implements BeanPostProcessor { return bean; } + /** + * 后初始化 bean 初始化完成调用 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if ("annotationBean".equals(beanName)){ diff --git a/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java b/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java index 67d4ffb8..d0d664be 100644 --- a/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java +++ b/src/main/java/com/crossoverjie/spring/processor/SpringLifeCycleProcessor.java @@ -17,6 +17,14 @@ @Component public class SpringLifeCycleProcessor implements BeanPostProcessor { private final static Logger LOGGER = LoggerFactory.getLogger(SpringLifeCycleProcessor.class); + + /** + * 预初始化 初始化之前调用 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("annotationBean".equals(beanName)){ @@ -25,6 +33,13 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro return bean; } + /** + * 后初始化 bean 初始化完成调用 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if ("annotationBean".equals(beanName)){ From 76de08195cecba14e021887cfeed783372fe28a6 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:23:48 +0800 Subject: [PATCH 015/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index 903d06a6..0ef8b9ea 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -176,5 +176,5 @@ public class SpringLifeCycleProcessor implements BeanPostProcessor { 2018-03-21 00:40:25.156 [Thread-8] INFO c.c.spring.annotation.AnnotationBean - AnnotationBean destroy ``` -之后则是进入 bean 的销毁阶段。 +直到 Spring 上下文销毁时则会调用自定义的销毁方法以及实现了 `DisposableBean` 的 `destroy()` 方法。 From 438b610961add29335e6d80776fe533369132f80 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:25:43 +0800 Subject: [PATCH 016/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index 0ef8b9ea..64c0b5ae 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -15,7 +15,7 @@ Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握 ### 注解方式 -在 bean 初始化时会经历几个阶段,首先可以使用注解 `@PostConstruct`, `@PreDestroy` 来再 bean 的创建和销毁阶段进行调用: +在 bean 初始化时会经历几个阶段,首先可以使用注解 `@PostConstruct`, `@PreDestroy` 来在 bean 的创建和销毁阶段进行调用: ```java @Component @@ -87,7 +87,7 @@ public class SpringLifeCycle{ 以上是在 SpringBoot 中可以这样配置,如果是原始的基于 XML 也是可以使用: -``` +```xml ``` From 41eac20ae3fb884ac094bc72b702d087bda0e9b3 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 01:44:18 +0800 Subject: [PATCH 017/283] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 19c6a208..2b80d031 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Java 知识点,继续完善中。 ### 常用框架 -- Spring IOC 的实现原理 +- [Spring Bean 生命周期](https://github.com/crossoverJie/Java-Interview/blob/master/MD/spring/spring-bean-lifecycle.md) - [Spring AOP 的实现原理](https://github.com/crossoverJie/Java-Interview/blob/master/MD/SpringAOP.md) ### SpringBoot From 133b5e9dda90435edf740b32fa6b266ae4af1da3 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Wed, 21 Mar 2018 09:30:13 +0800 Subject: [PATCH 018/283] :sparkles: Introducing new features.Spring lifecycle --- MD/spring/spring-bean-lifecycle.md | 1 + 1 file changed, 1 insertion(+) diff --git a/MD/spring/spring-bean-lifecycle.md b/MD/spring/spring-bean-lifecycle.md index 64c0b5ae..b9693567 100644 --- a/MD/spring/spring-bean-lifecycle.md +++ b/MD/spring/spring-bean-lifecycle.md @@ -1,6 +1,7 @@ ## Spring Bean 生命周期 +### 前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 From bc283e77801086b1189b0ae0b77eadd967bcecb2 Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Fri, 23 Mar 2018 00:00:13 +0800 Subject: [PATCH 019/283] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b80d031..27780171 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Java 知识点,继续完善中。 - [多线程中的常见问题](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Thread-common-problem.md) - [synchronize 关键字原理](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Synchronize.md) - [多线程的三大核心](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Threadcore.md) -- [对锁的一些认知,有哪些锁](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Java-lock.md) +- [对锁的一些认知](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Java-lock.md) - [ReentrantLock 实现原理 ](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ReentrantLock.md) - [ConcurrentHashMap 的实现原理](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ConcurrentHashMap.md) - [线程池原理](https://github.com/crossoverJie/Java-Interview/blob/master/MD/ThreadPoolExecutor.md) From 979b0a352411663ea6ad166bcf0e1ac18e403efd Mon Sep 17 00:00:00 2001 From: crossoverJie Date: Sat, 24 Mar 2018 13:35:19 +0800 Subject: [PATCH 020/283] :sparkles: Introducing new features.ArrayList --- MD/ArrayList.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/MD/ArrayList.md b/MD/ArrayList.md index cee9a6ca..4334db04 100644 --- a/MD/ArrayList.md +++ b/MD/ArrayList.md @@ -55,6 +55,65 @@ 由此可见 `ArrayList` 的主要消耗是数组扩容以及在指定位置添加数据,在日常使用时最好是指定大小,尽量减少扩容。更要减少在指定位置插入数据的操作。 +### 序列化 + +由于 ArrayList 是基于动态数组实现的,所以并不是所有的空间都被使用,所以使用了 `transient` 修饰,可以防止被序列化。 + +```java +transient Object[] elementData; +``` + +因此 ArrayList 自定义了序列化与反序列化: + +```java + private void writeObject(java.io.ObjectOutputStream s) + throws java.io.IOException{ + // Write out element count, and any hidden stuff + int expectedModCount = modCount; + s.defaultWriteObject(); + + // Write out size as capacity for behavioural compatibility with clone() + s.writeInt(size); + + // Write out all elements in the proper order. + //只序列化了被使用的数据 + for (int i=0; i