diff --git a/50.Spring-Regist-Bean/pom.xml b/50.Spring-Regist-Bean/pom.xml
new file mode 100644
index 0000000..e0af787
--- /dev/null
+++ b/50.Spring-Regist-Bean/pom.xml
@@ -0,0 +1,43 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.0.RELEASE
+
+
+ cc.mrbird
+ demo
+ 0.0.1-SNAPSHOT
+ demo
+ Demo project for Spring Boot
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/DemoApplication.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/DemoApplication.java
new file mode 100644
index 0000000..3eb522d
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/DemoApplication.java
@@ -0,0 +1,61 @@
+package cc.mrbird;
+
+import cc.mrbird.demo.config.WebConfig;
+import cc.mrbird.demo.service.CalculateService;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.WebApplicationType;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+import java.util.Arrays;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ ConfigurableApplicationContext context1 = new SpringApplicationBuilder(DemoApplication.class)
+ .web(WebApplicationType.NONE)
+ .profiles("java7")
+ .run(args);
+
+ // 返回 IOC 容器,使用注解配置,传入配置类
+ ApplicationContext context = new AnnotationConfigApplicationContext(WebConfig.class);
+ System.out.println("容器创建完毕");
+
+ // User user = context.getBean(User.class);
+ // System.out.println(user);
+
+ // 查看 User 这个类在 Spring 容器中叫啥玩意
+ // String[] beanNames = context.getBeanNamesForType(User.class);
+ // Arrays.stream(beanNames).forEach(System.out::println);
+
+ // 查看基于注解的 IOC容器中所有组件名称
+ String[] beanNames = context.getBeanDefinitionNames();
+ Arrays.stream(beanNames).forEach(System.out::println);
+
+ // 组件的作用域
+ // Object user1 = context.getBean("user");
+ // Object user2 = context.getBean("user");
+ // System.out.println(user1 == user2);
+
+ // 测试懒加载
+ // Object user1 = context.getBean("user");
+ // Object user2 = context.getBean("user");
+
+ // 测试 Profile
+ CalculateService service = context1.getBean(CalculateService.class);
+ System.out.println("求合结果: " + service.sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
+
+ // FactoryBean测试
+ Object cherry = context.getBean("cherryFactoryBean");
+ System.out.println(cherry.getClass());
+
+ Object cherryFactoryBean = context.getBean("&cherryFactoryBean");
+ System.out.println(cherryFactoryBean.getClass());
+
+ }
+}
+
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/condition/MyCondition.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/condition/MyCondition.java
new file mode 100644
index 0000000..4b7f508
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/condition/MyCondition.java
@@ -0,0 +1,16 @@
+package cc.mrbird.demo.condition;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+/**
+ * @author MrBird
+ */
+public class MyCondition implements Condition {
+ @Override
+ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ String osName = context.getEnvironment().getProperty("os.name");
+ return osName != null && osName.contains("Windows");
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/config/WebConfig.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/config/WebConfig.java
new file mode 100644
index 0000000..e835157
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/config/WebConfig.java
@@ -0,0 +1,48 @@
+package cc.mrbird.demo.config;
+
+import cc.mrbird.demo.condition.MyCondition;
+import cc.mrbird.demo.domain.Hello;
+import cc.mrbird.demo.domain.User;
+import cc.mrbird.demo.factory.CherryFactoryBean;
+import cc.mrbird.demo.filter.MyTypeFilter;
+import cc.mrbird.demo.register.MyImportBeanDefinitionRegistrar;
+import cc.mrbird.demo.selector.MyImportSelector;
+import lombok.Builder;
+import org.springframework.context.annotation.*;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.stereotype.Controller;
+import org.springframework.stereotype.Repository;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author MrBird
+ */
+@Configuration
+// @ComponentScan(value = "cc.mrbird.demo"
+ // , excludeFilters = {
+ // @Filter(type = FilterType.ANNOTATION,
+ // classes = {Controller.class, Repository.class}),
+ // @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = User.class)
+ // @Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class)
+ // }
+ // includeFilters = {
+ // @Filter(type = FilterType.ANNOTATION, classes = Service.class)
+ // }, useDefaultFilters = false
+// )
+@Import({Hello.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
+public class WebConfig {
+
+ @Bean
+ // @Conditional(MyCondition.class)
+ // @Lazy
+ // @Scope("prototype")
+ public User user() {
+ System.out.println("往IOC容器中注册user bean");
+ return new User("mrbird", 18);
+ }
+
+ @Bean
+ public CherryFactoryBean cherryFactoryBean() {
+ return new CherryFactoryBean();
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/controller/UserController.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/controller/UserController.java
new file mode 100644
index 0000000..50f3575
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/controller/UserController.java
@@ -0,0 +1,10 @@
+package cc.mrbird.demo.controller;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * @author MrBird
+ */
+@Controller
+public class UserController {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/dao/UserMapper.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/dao/UserMapper.java
new file mode 100644
index 0000000..30e9215
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/dao/UserMapper.java
@@ -0,0 +1,10 @@
+package cc.mrbird.demo.dao;
+
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author MrBird
+ */
+@Repository
+public class UserMapper {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Apple.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Apple.java
new file mode 100644
index 0000000..830bd57
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Apple.java
@@ -0,0 +1,7 @@
+package cc.mrbird.demo.domain;
+
+/**
+ * @author MrBird
+ */
+public class Apple {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Banana.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Banana.java
new file mode 100644
index 0000000..21ccbc0
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Banana.java
@@ -0,0 +1,7 @@
+package cc.mrbird.demo.domain;
+
+/**
+ * @author MrBird
+ */
+public class Banana {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Cherry.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Cherry.java
new file mode 100644
index 0000000..80a2df7
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Cherry.java
@@ -0,0 +1,7 @@
+package cc.mrbird.demo.domain;
+
+/**
+ * @author MrBird
+ */
+public class Cherry {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Hello.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Hello.java
new file mode 100644
index 0000000..452456a
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Hello.java
@@ -0,0 +1,7 @@
+package cc.mrbird.demo.domain;
+
+/**
+ * @author MrBird
+ */
+public class Hello {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Strawberry.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Strawberry.java
new file mode 100644
index 0000000..d16e611
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Strawberry.java
@@ -0,0 +1,7 @@
+package cc.mrbird.demo.domain;
+
+/**
+ * @author MrBird
+ */
+public class Strawberry {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/User.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/User.java
new file mode 100644
index 0000000..baf235d
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/User.java
@@ -0,0 +1,17 @@
+package cc.mrbird.demo.domain;
+
+import lombok.*;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author MrBird
+ */
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+// @Component
+public class User {
+ private String name;
+ private Integer age;
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/UserDetail.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/UserDetail.java
new file mode 100644
index 0000000..88fec79
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/UserDetail.java
@@ -0,0 +1,14 @@
+package cc.mrbird.demo.domain;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @author MrBird
+ */
+// @Component
+public class UserDetail extends User {
+
+ private int sex;
+
+
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Watermelon.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Watermelon.java
new file mode 100644
index 0000000..ed1fd1e
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/domain/Watermelon.java
@@ -0,0 +1,7 @@
+package cc.mrbird.demo.domain;
+
+/**
+ * @author MrBird
+ */
+public class Watermelon {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/factory/CherryFactoryBean.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/factory/CherryFactoryBean.java
new file mode 100644
index 0000000..74b74c4
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/factory/CherryFactoryBean.java
@@ -0,0 +1,24 @@
+package cc.mrbird.demo.factory;
+
+import cc.mrbird.demo.domain.Cherry;
+import org.springframework.beans.factory.FactoryBean;
+
+/**
+ * @author MrBird
+ */
+public class CherryFactoryBean implements FactoryBean {
+ @Override
+ public Cherry getObject() {
+ return new Cherry();
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return Cherry.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return false;
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/filter/MyTypeFilter.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/filter/MyTypeFilter.java
new file mode 100644
index 0000000..a23f028
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/filter/MyTypeFilter.java
@@ -0,0 +1,29 @@
+package cc.mrbird.demo.filter;
+
+import org.springframework.core.io.Resource;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.core.type.ClassMetadata;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+
+/**
+ * @author MrBird
+ */
+public class MyTypeFilter implements TypeFilter {
+ @Override
+ public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
+ // 获取当前正在扫描的类的注解信息
+ AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
+ // 获取当前正在扫描的类的类信息
+ ClassMetadata classMetadata = metadataReader.getClassMetadata();
+ // 获取当前正在扫描的类的路径等信息
+ Resource resource = metadataReader.getResource();
+
+ String className = classMetadata.getClassName();
+ return StringUtils.hasText("er");
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/register/MyImportBeanDefinitionRegistrar.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/register/MyImportBeanDefinitionRegistrar.java
new file mode 100644
index 0000000..3a9c772
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/register/MyImportBeanDefinitionRegistrar.java
@@ -0,0 +1,22 @@
+package cc.mrbird.demo.register;
+
+import cc.mrbird.demo.domain.Strawberry;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.beans.factory.support.RootBeanDefinition;
+import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
+import org.springframework.core.type.AnnotationMetadata;
+
+/**
+ * @author MrBird
+ */
+public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
+ @Override
+ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
+ final String beanName = "strawberry";
+ boolean contain = registry.containsBeanDefinition(beanName);
+ if (!contain) {
+ RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Strawberry.class);
+ registry.registerBeanDefinition(beanName, rootBeanDefinition);
+ }
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/selector/MyImportSelector.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/selector/MyImportSelector.java
new file mode 100644
index 0000000..08712c0
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/selector/MyImportSelector.java
@@ -0,0 +1,19 @@
+package cc.mrbird.demo.selector;
+
+import org.springframework.context.annotation.ImportSelector;
+import org.springframework.core.type.AnnotationMetadata;
+
+/**
+ * @author MrBird
+ */
+public class MyImportSelector implements ImportSelector {
+
+ @Override
+ public String[] selectImports(AnnotationMetadata importingClassMetadata) {
+ return new String[]{
+ "cc.mrbird.demo.domain.Apple",
+ "cc.mrbird.demo.domain.Banana",
+ "cc.mrbird.demo.domain.Watermelon"
+ };
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/CalculateService.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/CalculateService.java
new file mode 100644
index 0000000..1fce959
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/CalculateService.java
@@ -0,0 +1,9 @@
+package cc.mrbird.demo.service;
+
+/**
+ * @author MrBird
+ */
+public interface CalculateService {
+
+ Integer sum(Integer... value);
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/UserService.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/UserService.java
new file mode 100644
index 0000000..7070e4f
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/UserService.java
@@ -0,0 +1,10 @@
+package cc.mrbird.demo.service;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * @author MrBird
+ */
+@Service
+public class UserService {
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/impl/Java7CalculateServiceImpl.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/impl/Java7CalculateServiceImpl.java
new file mode 100644
index 0000000..25c6435
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/impl/Java7CalculateServiceImpl.java
@@ -0,0 +1,23 @@
+package cc.mrbird.demo.service.impl;
+
+import cc.mrbird.demo.service.CalculateService;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author MrBird
+ */
+@Service
+@Profile("java7")
+public class Java7CalculateServiceImpl implements CalculateService {
+
+ @Override
+ public Integer sum(Integer... value) {
+ System.out.println("Java 7环境下执行");
+ int result = 0;
+ for (int i = 0; i <= value.length; i++) {
+ result += i;
+ }
+ return result;
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/impl/Java8CalculateServiceImpl.java b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/impl/Java8CalculateServiceImpl.java
new file mode 100644
index 0000000..ef8ddcf
--- /dev/null
+++ b/50.Spring-Regist-Bean/src/main/java/cc/mrbird/demo/service/impl/Java8CalculateServiceImpl.java
@@ -0,0 +1,21 @@
+package cc.mrbird.demo.service.impl;
+
+import cc.mrbird.demo.service.CalculateService;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+
+/**
+ * @author MrBird
+ */
+@Service
+@Profile("java8")
+public class Java8CalculateServiceImpl implements CalculateService {
+
+ @Override
+ public Integer sum(Integer... value) {
+ System.out.println("Java 8环境下执行");
+ return Arrays.stream(value).reduce(0, Integer::sum);
+ }
+}
diff --git a/50.Spring-Regist-Bean/src/main/resources/application.properties b/50.Spring-Regist-Bean/src/main/resources/application.properties
new file mode 100644
index 0000000..e69de29