容器
- 使用@Configuration来创建一个配置类
- 使用@Bean为容器中注册一个组件
- 使用@Import快速注册一个组件
- 实现ImportSelector接口,返回数组对象,里面包含了全类名
- 使用@ComponentScan来快速扫描所有包
- excludeFilters : 实现TypeFilter,过滤类型为Custom
- includeFilters
- @Conditional用于类上或是方法上,用来过滤判断是否注册该实例对象,具体规则需要自创建类实现Condition
- @Lazy : 是否进行懒加载
- @FactoryBean : 自定义一个类的工厂类,定义获取类的方法,可以定义为单例或是多例.
生命周期
initMethod
-
Bean的生命周期
- bean的创建---初始化---销毁的过程
- 容器管理bean的生命周期
- 我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们的初始化方法和销毁方法
-
构造(对象创建):
- 单实例: 在容器启动的时候创建对象
- 多实例: 在每次获取的时候创建对象
-
初始化
- 对象创建完成,并赋值好,调用初始化方法
-
销毁:
- 单实例在容器关闭的时候,进行销毁
- 多实例在容器关闭的时候,不会进行销毁
-
指定初始化方法:
- 指定init-method或是destory-method
@Value
- 使用@Value进行赋值
- 基本数值
- 可以使用#{}
- 使用${},取出配置环境变量中的值
@PropertySource
- 使用@PropertySource读取外部配置文件的kv,然后保存到运行的环境变量中
- @PropertySource(value={"classpath:/good.properties"})
自动装配
Spring利用依赖注入,DI,完成对IOC容器中各个依赖组件
-
@Autowired: 自动注入
BookService { // 1. 优先根据类型去容器中找对应的组件,如果找到相同类型的组件,2. 再将属性的名称作为组件的id去查找 @Autowired BookDao bookDao }
@Qualifier : 可以明确指定需要装配组件的ID,而不是使用属性名
使用@Autowired的属性required是否必须装配
-
@Primary : 让Spring进行自动装配的时候,默认使用首选的Bean,如果要装配其他的,就使用@Qualifier
- 常用于DataSourceTransactionManager
-
Spring还是支持@Resource和@Inject,这两个注解是Java规范注解
- @Resouce : java规范,spring也支持,但是是默认按照属性名称来装配,有个name属性,没有能支持@Primary的功能
- @Inject : 需要导入javax.inject包,和@Autowired是一样的,但是没属性
-
@Autowired可以标注在方法上和构造器上
- 标注在方法上: @Bean + 方法参数,参数从容器中获取
- 标注在构造器上,如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置组件
- 放在参数位置上,注入
自动装配Aware注入Spring底层组件原理
-
自定义组件如果想要实现Spring底层的一些组件,ApplicationContext,BeanFacotry
- 自定义组件实现xxxAware,在创建对象的时候,会自动运行实现的方法
-
把Spring底层的一些主键注入到bean中:
- XXXAware : 功能是使用xxxProcessor
- ApplicationContext ==> ApplicationContextAwareProccessor
- XXXAware : 功能是使用xxxProcessor
Profile
-
Spring为我们提供的根据当前环境,动态的激活和切换一系列的组件的功能:
- 开发环境
- 测试环境
- 生产环境
数据源:A/B/C
-
@Profile : 指定组件在哪个环境的情况下才能被注册到容器,不指定,在任何环境下,都能注册这个组件
- 如果加了环境表示的Bean,只有这个环境被激活了,才能注册到容器中来
- 如果有一个@Profile("default") : 默认是Default环境
-
激活方式
- 使用命令行动态参数: 在虚拟机参数位置加载,-Dspring.profiles.active=test
- -Dspring.profiles.active=test
-
使用代码方式
// 0. 使用无参数的构造函数 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); // 代码方式 // 1. 创建一个applicationContext // 2. 设置需要激活的环境 context.getEnvironment().setActiveProfiles("dev"); // 3. 注册主配置类 context.register(ProfileAnnoConfige.class); context.refresh(); String[] beanDefinitionNames = context.getBeanDefinitionNames(); for (String string : beanDefinitionNames) { System.out.println(string); }
如果是写到配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效.
没有标注环境表示的Bean,在任何环境下面都会加载