SpringBoot原理相关
启动原理
@SpringBootApplication整合了3个注解:SpringBootConfiguration、EnableAutoConfiguration、ComponentScan
@SpringBootConfiguration:表明这是一个IOC容器的配置类,相当于说明该bean是一个spring中的xml文件。例如下面的Shiroconfig配置类也用了这个注解
@Configurationpublic class ShiroConfig {@Beanpublic ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {}@ComponentScan:指定了Spring中的指定MVC bean的扫描包和Spring的扫描包,扫描路径就是该类所在的所有包。SpringBoot的注解扫描所有的同路径下的类,@Controller类归位MVC类,其它类为Spring的类
常规mvc配置指定包<context:component-scan base-package="com.test.Action" />Spring也要指定Spring的注解类的扫描路径<context:component-scan base-package="com.test" />@EnableAutoConfiguration:加载Spring常规相关的类,比如DataSource,核心功能有@import注解。类似的还有@EnableEurekaServer,则会自动import Eureka相关的bena
@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration {}
习惯优于配置的原理
SpringBoot的Main方法里面run的时候会引用到SpringFactoriesLoader里面的loadFactoryNames,会扫描spring-boot-autoconfigure.jar配置包里发现META-INF/spring.factories,然后加载许多默认的Configuration的全限定名,然后反射生成Configuration,类里面会引入默认的配置参数,从而实现习惯优于配置
spring.factories 文件:
示例
spring.factories中获取redisConfig的全限定名。
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\反射生成RedisAutoConfiguration,并且制定了已经默认填好的RedisProperties.class参数类
@Configuration@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })@EnableConfigurationProperties(RedisProperties.class)public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(RedisConnectionFactory.class)public JedisConnectionFactory redisConnectionFactory()throws UnknownHostException {return applyProperties(createJedisConnectionFactory());}}@ConfigurationProperties(prefix = "spring.redis")public class RedisProperties {private int database = 0;private String url;private String host = "localhost";private String password;private int port = 6379;