SpringBoot提供的IOC的方式
-
注解配置方式。@ComponentScan扫描指定包下的类,@Service,@Repository,@Controller,@Component注解。
-
Java Config方式:@ComponentScan扫描指定包下的类@Configuration及类下的@Bean,
-
spring.factories方式:META-INF/spring.factories文件中添加IOC的类。org.springframework.boot.autoconfigure.EnableAutoConfiguration(一般编写外部jar的时候才使用)
-
@Import方式:支持导入 Configuration配置类 ,ImportSelector选择器(获取IOC类的全限定名名单),ImportBeanDefinitionRegistrar注册器(直接注册BeanDefinition)
SpringBoot提供的自动装配方式
ByName、ByType、Constructor、autodetect、no
SpringBoot自动装配的过程
-
SpringBoot的自动装配基于@SpringBootApplication。
-
@SpringBootApplication组合注解。@@SpringBootConfiguration标识当前类是配置类,@EnableAutoConfiguration开启自动装配功能,@ComponentScan指定scan的包。
-
启动的时候会扫描指定路径下的包及子包。
-
扫描的时候,会扫描指定路径下所有的@Configuration配置类。将@Bean注解的方法的返回,@Service、@Repository、@Controller、@Component注解的类注册为BeanDefinition,注册到BeanFactory中。
-
除此之外,会将spring.factories文件中的EnableAutoConfiguration标注的类注册为BeanDefinition。还会将@Import注册为BeanDefinition。
-
@Import注解,支持导入 Configuration配置类,importselector选择器(获取ioc的类全限定名名单),importbeandefinitionregistrar注册器(直接注册beandefinition)
SpringBoot的条件加载
@Conditional : 条件注解,配合其他注解使用
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : IOC容器中存在该类型Bean时起效
@ConditionalOnMissingBean :IOC容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate :IOC容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效
SpringBoot 自定义Conditional
所有自定义条件注解其实都是基于@Conditional而来的,使用@Conditional定义新条件注解关键就是要有一个Condition实现类,该Condition实现类就负责条件注解的处理逻辑,该实现类所实现的matches()方法决定了条件注解的要求是否得到满足。 1. 实现Condition接口,重写matches()方法,返回true表示条件成立,返回false表示条件不成立。 2. 自定义条件注解,使用@Conditional注解,指定Condition实现类。
SpringBoot 自动装配的DI注解
@Autowired是Spring自带的,@Resource是JSR250规范实现的,@Inject是JSR330规范实现的
- @Autowired、@Inject用法基本一样,不同的是@Inject没有required属性
- @Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的
- @Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Named一起使用,@Resource则通过name进行指定