这些是我看springboot原理分析的相关视频时写的笔记,后续会完善,先和大家分享分享
jsr 250 @Resource
jsr 330 @Inject
初始化applicationContext的三种方式:
1.spring的注解 @Autowire
2.构造函数,将applicationContext作为唯一的构造函数参数(spring4.3的新特性)
3.implement ApplicationContextAware接口 重写方法
bean初始化回调:
实现BeanPostProcesser需要重写的两个方法:(作用:会在每个bean初始化时候调用一次)
PostProcesserBeforeInitialization() //在bean依赖装配完成之后(set属性设置完)触发,这里可以对bean处理,比如返回代理对象
PostProcesserAfterInitialization() //是在init方法执行之后触发
@Bean(iniMethod=init)这个init()方法会在上述两个方法的中间
只在容器初始化后触发执行一次,但比BeanPostProcesser触发早
BeanFactoryPostProcesser需要重写一个方法:
postProcesserBeanFactory()
BeanFactoryPostProcesser的一个子类 BeanDefinitionRegistryPostProcesser其下有一个方法:
void postProcesserBeanDefinitionRegistry( BeanDefinitionRegistry registry)
BeanDefinitionRegistry 是注册一个bean去spring容器,拿到这个东西就可以动态的注入bean
默认的配置文件名字可以用–spring.config.name来指定,只需要指定文件名字,配置文件需要指定全路径,包括目录和文件名称,文件的指定方式有两种:class path和file
配置文件可以加载多个
加载配置项方式:
@PropertySource或者@PropertySources(,)
@configurationProperties
获取配置项:
1@Autowire env
2@value
动态操作配置文件:
相关接口:EnviromentPostProcessor
@ConditionalOnProperty(name="",havingValue="",macthIfMissing=true) 表示某个属性等于某个值时装配
@ConditionalOnClass //表示classpath中存在某个class时装配---------------@ConditionalOnMissingClass
@ConditionalOnBean //根据容器中是否存在某个bean来进行装配----------@ConditionalOnMissingBean
自定义condition:
@Conditional(UTF8condition.class)基于条件的自动配置,一般配合Condition接口一起使用,只有接口的实现返回true才装配,可以用在方法和类上
@Enable注解
@EnableConfigurationProperties 是用来启用一个特性的,这个特性是,可以把配置文件的属性注入到bean里
@EnableAsync用来启用异步,和需要异步的方法上的@Async配合使用
@Import(导入一个或多个普通的类或者@Configuration)
@Import(ImportSelector的实现类/ImportBeanDefinitionRegistrar的实现类):
ImportSelector接口的实现方法selectImports的返回值,必须是一个class的string[],该class会被spring容器所托管起来
ImportBeanDefinitionRegistrar的实现方法registerBeanDefinitions方法的参数有一个BeanDefinitionRegistry,可以用来往spring容器注入bean
@EnableAutoConfiguration作用:从classpth中获取META-INF/spring-factories配置文件,然后,拿其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项
加载到spring容器
其内部实现的关键点:
1.ImportSelector 该接口的方法返回值都会被纳入到spring容器中。
2.SpringFactoriesLoader 该类可以从claspath中搜索META-INF/Spring.factories配置文件,并读取配置。
添加监听器的方式:
1.自定义事件:一般是继承ApplicatonEvent加载类
2.定义事件监听器:一般是实现ApplicationListener接口
3.配置监听器,启动的时候需要把监听器纳入到spring容器中 springApplication.addListener()/@Component/在application中配置context.listener.classes=/@EventListener/可以通过spring.factories机制
4.发布事件,使用ApplicationContext.publishEvent发布事件
ApplicationContextInitializer 接口是在spring容器执行refreshed之前的一个回调
使用步骤:
1.写一个类,实现ApplicationContextInitialize接口
2.注册ApplicationContextInitializer
注册方法:
1.SpringApplication.addInitializers
2.通过配置项context.initializer.classes 指定,可以指定多个,多个用逗号隔开
3.可以通过spring.factories机制
CommandLineRunner/ApplicationRunner接口是在容器启动成功后的最后一步回调(类似开机自启动)
使用步骤:
1.写一个类,实现CommandLineRunner接口
2.把该类纳入到spring容器的管理之中
注意:通过@Order注解或者ordered接口来控制执行顺序
CommandLineRunner ApplicationRunner区别:
区别在于方法的参数不一样
CommandLineRunner的参数是最原始的参数,没有任何处理
ApplicationRunner的参数是AppliatonArguemnts,是对原始参数进一步的封装
拦截器使用步骤:
1.写一个拦截器,实现HandlerInterceptor接口
2.在写一个类,继承WebMvcConfigurerAdapter抽象类,然后重写addInterceptors方法,并调用register.addInterceptor把上一步的拦截器加进去。
HandlerInterceptor接口,里面有三个方法
1.perhandler: controller执行之前调用
2.posthandler:controller执行之后,且页面渲染之前调用
3.aftercomplier:页面渲染之后调用,一般用于页面清理操作
异常处理:
如可去掉springboot默认的异常处理逻辑:
@SpringBootApplication(exclude=ErrorMvcAutoConfiguration.class)
使用ErrorPageRegistrar方法:
ErrorPageRegistrar抽象类 ErrorPage可以定义状态码和相应页面
全局异常处理步骤:
1.写一个类,需要加上@ControllerAdvice注解
2.写一个异常处理方法,方法上需要加上@ExceptionHandler(value=Exception.class)这个注解,在该方法里面处理异常
springboot定制和优化内嵌的tomcat
springboot内嵌了三种容器:
定制化tomcat有两种方法:
1. 实现EmbeddedServletContinaerCustomizer接口,并把实现类纳入到spring容器
2. 在spring容器中装配一个EmbeddedServletContainerCustomizer对象
相关类或者接口:
TomcatConnectorCustomizer
Connector.getPorocalHandler
EmbeddedServletContainerAutoConfiguration