spring 注解
spring 统一异常管理
@ControllerAdvice
@RestControllerAdvice
-
ioc 核心类定义 容器
spring 在创建 bean 的时候默认是 singleton 单例的
要想修改 就在 bean 上添加 @scope 注解 或者scope=“prototype” -
scope 在 web 环境中还可以设置为 request 和 session
request:表示每次发送新的请求都会创建一个对象
session:表示在一次会话中使用的是同一个对象
prototype: 使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例 -
defaultListableBeanFactory
private final Map<String, BeanDefinition> beanDefinitionMap ioc 容器 -
BeanDefinition 装载容器的信息 容器作用域 class 信息
-
BeanFactory bean 工厂接口 提供 get 方法 获取容器 称为低级容器 也是最顶层接口
ApplicationContext 继承了很多接口功能也就多 应用容器上下文 高级容器 -
AbstractApplicationContext 抽象类 高级容器的抽象实现类
接口定义了一个 refresh 方法刷新整个容器重新加载 bean
ApplicationContextAware 接口
spring 在容器初始化之后会调用 这个接口的实现类 重写里边的 set 方法就可以吧 当前的容器 返回 里边有所有的容器
-
实现InitializingBean接口
在将一个 bean 交给 spring 管理的时候 有时候我们的 bean 有某个属性 不支持spirng 注入 afterPropertiesSet 重写方法实现 -
InitializingBean接口,实现了InitializingBean接口的bean,在实例化bean时Spring会帮我们调用接口中的方法。
动态 注册Bean ImportBeanDefinitionRegistrar
- 定义一个ImportBeanDefinitionRegistrar的实现类,然后在有@Configuration注解的配置类上使用@Import导入
@PropertySource({“classpath:test.properties”})
- 当前类加载指定配置文件
@Value("${className}")
- 配置文件引用,若取两个配置文件中有相同属性名的值,则取值为最后一个配置文件中的值
在application.properties中的文件,直接使用@Value读取即可,applicarion的读取优先级最高
@ConfigurationProperties(prefix = “person”)
@EnableConfigurationProperties
- @EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。
- 如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
测试发现 @ConfigurationProperties 与 @EnableConfigurationProperties 关系特别大。
@Scope 作用域
- singletion: 默认作用域,在每个Spring容器中只有一个定义的bean实例
- prototype: 一个bean定义有多个实例
- request: 一个定义的bean的实例的生命周期为一次http request。仅在web下生效
- session: 一个定义的bean的实例的生命周期为一次http session。仅在web下生效
- globalSession: 一个定义的bean的实例的生命周期为一次global http request。仅在Portlet下生效
- application: 一个定义的bean的实例的生命周期为ServletContext,仅在web下生效
- websocket: 一个定义的bean的实例的生命周期为WebSocket
@Lazy 延迟加载Bean 使用时创建
@PostConstruct
- Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
@PreConstruct
- 被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
InitializingBean 和 DisposableBean 接口
- 为了与容器对bean生命周期的管理进行交互,可以实现Spring InitializingBean和DisposableBean接口。容器要求 afterPropertiesSet()前者和destroy()后者使bean在初始化和销毁bean时执行某些操作。
@Bean
@Bean不是按照写代码的顺序加载的,解决的办法也是有的使用 @Orde注解的或者@Bean的方法上标识@DependsOn注解,来指定当前Bean实例化时需要触发哪些Bean的提前实例化
ApplicationContextInitializer
- spring boot如何在所有bean初始化之前加载一个自定义类?
方案
首先创建一个class,继承ApplicationContextInitializer接口,并实现方法initialize
spring定义 start 需要使用的注解
* @ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
* @ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
* @ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean
* @ConditionalOnMissingClass // 当给定的类名在类路径上不存在,则实例化当前Bean
//在application.properties配置"mf.assert",对应的值为true
* @ConditionalOnProperty(prefix="mf",name = "assert", havingValue = "true")