# Spring **Repository Path**: dlr-sfs_admin/Spring ## Basic Information - **Project Name**: Spring - **Description**: spring注解版 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-07-06 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring #### 介绍 spring注解版 #### 基础注解 @Configuration //告知spring这是一个配置类 (eg:projectConfig) @Bean //注解是向容器注册组件, 组件类型为返回值类型,组件id默认为方法名(但要是在注解中配置value id就是value值) (eg:projectConfig) #### 组件注解的扫描 基于注解扫描注解 @ComponentScan:扫描包的注解(基于jdk1.8一个类可以配置多个@ComponentScan) @ComponentScans:扫描包的注解(低于jdk1.8的可以在ComponentScans配置多个@ComponentScan) includeFilters 只所描什么注解,一定要配置useDefaultFilters = false,因为默认扫描所有 excludeFilters 不扫描什么注解 FilterType.ANNOTATION:按照注解 FilterType.ASSIGNABLE_TYPE:按照给定的类型; FilterType.ASPECTJ:使用ASPECTJ表达式 FilterType.REGEX:使用正则指定 FilterType.CUSTOM:使用自定义规则(eg:MyFilterType) (eg:ScanAnnotationConfig) #### 组件的作用域 @Scope:设置组件的作用域:默认单列singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。 prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象; request:同一次请求创建一个实例 session:同一个session创建一个实例 @Lazy懒加载,只针对单列的,在使用时,在创建对象,且只创建一次(eg:ScopeConfig) #### 根据条件注册组件 @Conditional:根据条件注册组件,参数是数组,条件由自己定义必须实现Condition接口(eg:ConditionConfig) ################################### 给容器中添加组件的方法 1.通过配置文件+包扫描:如@Controller @Service @Compent 2.通过@Bean给spring容器添加第三方配置如redis douuble 等(也就是说以前使用时这些必须配置在xml文件中,现在可以通过注解写到类中) 3. 3.1通过@Import注解快速道义一个配置(eg:QuickConfig) 3.2需要导入的类名的数组结合(需要实现ImportSelector接口)(eg:QuickConfig) 3.3实现了ImportBeanDefinitionRegistrar接口通过registerBeanDefinition方法注册组件 (eg:QuickConfig) 4.通过实现FactoryBean接口注册组件(eg:ProjectConfig) #### 组件的生命周期 容器的创建 --> 初始化 --> 销毁 单实例的:随着容器启动就创建对象,并会执行初始化方法和销毁方法 多实例的:只有调用了对象才会开始初始化,但无论如何都不会销毁对象 1.通过@Bean注解的initMethod和destroyMethod来执行初始化(eg:lifeCycleConfig1) 2.InitializingBean,DisposableBean接口 3.可以使用JSR250;@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法 @PreDestroy:在容器销毁bean之前通知我们进行清理工作 4.BeanPostProcessor 接口:bean的后置处理器;在bean初始化前后进行一些处理工作;postProcessBeforeInitialization:在初始化之前工作 postProcessAfterInitialization:在初始化之后工作 Spring底层对 BeanPostProcessor 的使用:bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor; #### 赋值 @Value:1.基本数值 布尔等 2.Spel表达式 #{} 3.${} 读取配置文件的值(必须要把配置文件加载进来:通过配置文件或@PropertySource)(eg:ValueConfig) #### 自动装配 @Autowired:自动装配(Spring的注解) 默认按照类型找组件,同种类型找到多个,在根据你正在使用的组件属性(@Autowired private UserDao userDao)作为组件id在去容器中找, 也可以通过@Qualifier("userDao")指定使用多个中的那个组件(容器中没有组件要个Autowired设置false值要不报错) 使用@Primary标注在某个组件上就大概率使用当前组件(不能与@Qualifier同时使用) @Resource和@Inject:自动装配(java注解) @Resource:默认根据组件属性去找(private UserDao userDao) 也就是userDao,@Resource(name="")优先根据name找 不支持 @Primary @Inject:不常用(导入javax.inject包) 支持 @Primary