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