一、SpringBoot 作用
- 可以以jar形式独立运行
- 内置tomcat容器
- 自动配置spring
- 约定大于配置,无代码生成
二、@Conditional注解
@Configuration
public class Config {
@Bean
@Conditional(ConditionDev.class)
public PersonEntity personDepEntity(){
PersonEntity entity = new PersonEntity();
entity.setName("personDepEntity create");
return entity;
}
@Bean
@Conditional(ConditionTest.class)
public PersonEntity personTestEntity(){
PersonEntity entity = new PersonEntity();
entity.setName("personTestEntity create");
return entity;
}
}
public class ConditionDep implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String className = ((StandardMethodMetadata) metadata).getDeclaringClassName();
String methodName = ((StandardMethodMetadata) metadata).getMethodName();
MultiValueMap<String, Object> annotationAttributes =
metadata.getAllAnnotationAttributes("org.springframework.context.annotation.Bean");
System.out.println(className);
System.out.println(methodName);
System.out.println(annotationAttributes);
System.out.println(context.getBeanFactory().getClass());
return true;
}
}
public class ConditionTest implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(Config.class);
System.out.println(context.getBean(PersonEntity.class));
}
}
com.moon.condition.Config
personDepEntity
{
name=[[Ljava.lang.String;@68be2bc2], value=[[Ljava.lang.String;@68be2bc2], initMethod=[], autowire=[NO], destroyMethod=[(inferred)]}
class org.springframework.beans.factory.support.DefaultListableBeanFactory
PersonEntity{
name='personDepEntity create', age=null, workEntity=null}
------------------------------------------------------------------------
com.moon.condition.Config
personDepEntity
{
name=[[Ljava.lang.String;@68be2bc2], value=[[Ljava.lang.String;@68be2bc2], initMethod=[], autowire=[NO], destroyMethod=[(inferred)]}
class org.springframework.beans.factory.support.DefaultListableBeanFactory
PersonEntity{
name='personTestEntity create', age=null, workEntity=null}
----------------------------------------------------------------------
结论:@Conditional(类)的类,实现Condition接口的类,返回的布尔值,决定对象是否注入
三、SpringBoot工作原理
@SpringBootApplication
public class SpringbootsourceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootsourceApplication.class, args);
}
}
- @SpringBootApplication核心注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
- @EnableAutoConfiguration自动配置
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
- AutoConfigurationImportSelector自动配置选择
public class AutoConfigurationImportSelector
implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
BeanFactoryAware, EnvironmentAware, Ordered {
@Override
public void process(AnnotationMetadata annotationMetadata,
DeferredImportSelector deferredImportSelector) {
Assert.state(
deferredImportSelector instanceof AutoConfigurationImportSelector,
() -> String.format("Only %s implementations are supported, got %s",
AutoConfigurationImportSelector.class.getSimpleName(),
deferredImportSelector.getClass().getName()));
AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
.getAutoConfigurationEntry(getAutoConfigurationMetadata(),
annotationMetadata);
this.autoConfigurationEntries.add(autoConfigurationEntry);
for (String importClassName : autoConfigurationEntry.getConfigurations()) {
this.entries.putIfAbsent(importClassName, annotationMetadata);
}
}
protected AutoConfigurationEntry getAutoConfigurationEntry(
AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
if (!