1.@Configuration & @Bean 给容器中注册组件
配置文件 == 配置类
@Configuration 告诉Spring这是一个配置类
@Bean
给容器中注册一个Bean
类型为返回值的类型
id默认是用方法名作为id
@Bean("id") 指定Bean的id
2.@ComponentScan 自动扫描组件 & 指定扫描规则
@ComponentScan(value = "")
value: 指定要扫描的包
@ComponentScan(value = "", excludeFilters = {Filter})
excludeFilters 指定扫描时按照什么规则排除某些组件
includeFilters 指定扫描时按照什么规则包含某些组件
* 使用includeFilters时需注意:
在ComponentScan中,有定义的默认规则生效,so指定其属性为false以禁用默认规则。
@Filter(type = FilterType, classes = {Class})
FilterType
ANNOTATION 根据注解
ASPECTJ 根据aspectj表达式
ASSIGNABLE_TYPE 根据类型(给定类型: 子类、实现类)
CUSTOM 根据自定义规则
REGEX 根据正则表达式
Class 排除规则的class
@ComponentScans(value = {@ComponentScan})
value: 指定多个@ComponentScan
3.自定义 TypeFilter 指定过滤规则
实现TypeFilter接口重写match方法
返回true 匹配成功
返回false 匹配失败
metadataReader:读取到的当前正在扫描的类的信息
metadataReaderFactory:可以获取到其他任何类的信息
通过metadataReader获取类的各种信息
4.@Scope 设置组件作用域
@Bean 默认是单实例
@Scope(value)
prototype 多实例,IOC容器启动不会调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。
singleton 单实例(默认值),IOC容器启动时会调用方法创建对象放到IOC容器中。
request 同一次请求创建一个实例
session 用一个sesion创建一个实例
5.@Lazy bean懒加载
单实例Bean 默认在容器启动时创建对象
懒加载 容器启动不创建对象,第一次使用(获取)Bean创建对象,并初始化。
6.@Conditional 按照条件注册bean
类上
类中组件统一设置。满足当前条件,这个类中配置的所有bean注册才能生效。
方法上
按照条件注册bean,满足条件给容器中注册Bean。
@Conditional(value = {Condition})
value
实现Condition接口并实现matches方法
ConditionContext 判断条件能使用的上下文(环境)
通过ConditionContext可以获取到所需的各种信息
7.@import 给容器快速导入一个组件
@import(value = {Class})
id默认是组件的全类名
8.@import 使用 importSelector
importSelector 返回需要导入的组件的全类名的数组
实现importSelector接口重写selectimports方法,返回值就是要导入到容器中的组件全类名。
Annotationmetadata 当前标注@import注解的类的所有注解信息
方法不要返回null,容器在使用此值时会调用其length属性,出现NPE。
9.@import 使用 importBeanDefinitionRegistrar
importBeanDefinitionRegistrar 手动注册Bean到容器中
实现importBeanDefinitionRegistrar接口重写registerBeanDefinitions方法
Annotationmetadata 当前标注@import注解的类的所有注解信息
BeanDefinitionRegistry BeanDefinition注册类
把所有需要添加到容器中的Bean 调用BeanDefinitaionRegistry.registerBeanDefinition 手工注册进来。
指定Bean的定义信息
RootBeanDefinition beanDefinitionRegistry = new RootBeanDefinition(Class);
注册一个Bean,指定bean名
registry.registerBeanDefinition("id", beanDefinitionRegistry);
10.使用FactoryBean注册组件
FactoryBean
实现FactoryBean接口实现其中方法
getObject() 返回一个T类型对象,这个对象会添加到容器中
getObjectType() 返回对象的Class
isSingleton() 是否是单例
true 这个Bean是单实例,在容器中保存一份。
false 多实例,每次获取都会创建一个新的Bean。
@Bean装配自定义FactoryBean实现类后,通过容器获取,则会返回一个工厂内定义的泛型对象。
@Bean装配自定义FactoryBean实现类后,通过容器获取其时添加&前缀,则会返回此工厂Bean。
11.给容器中注册组件
包扫描 + 组件标注注解(@Controller、@Service、@Repository、@Component)
@Bean(导入第三方包里的组件)
@import快速的给容器中导入一个组件
@import(value = {Class}) id默认是组件的全类名
importSelector 返回需要导入的组件的全类名的数组
importBeanDefinitionRegistrar 手动注册Bean到容器中
使用Spring提供的FactoryBean(工厂Bean)
默认获取到的是工厂Bean调用getObject创建的对象
要获取工厂Bean本身,我们需要给id前面加一个 &
bean创建---初始化----销毁的过程
容器管理bean的生命周期
我们可以自定义初始化和销毁方法
容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
1.@Bean指定初始化和销毁方法
通过@Bean指定init-method和destroy-method
@Bean(initMethod="init",destroyMethod="detory")
2.InitializingBean 和 DisposableBean
通过让Bean实现并重写其中方法
InitializingBean(定义初始化逻辑) destroy()
DisposableBean(定义销毁逻辑) afterPropertiesSet()
3.@PostConstruct & @PreDestroy
标注在bean方法上
@PostConstruct
在bean创建完成并且属性赋值完成时来执行初始化方法
@PreDestroy
在容器销毁bean之前通知我们进行清理工作
4.BeanPostProcessor-后置处理器
BeanPostProcessor.postProcessBeforeInitialization
初始化
对象创建完成,并赋值好,调用初始化方法。
BeanPostProcessor.postProcessAfterInitialization
销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean,容器不会调用销毁方法。
遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization。
BeanPostProcessor【interface】:bean的后置处理器
在bean初始化前后进行一些处理工作
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
5.BeanPostProcessor原理
populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);//执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
6.BeanPostProcessor在Spring底层的使用
bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor。
三、属性赋值
1.@Value赋值
基本数值
@Value("张三")
可以写SpEL
#{}
@Value("#{20-2}")
可以写${}
取出配置文件【properties】中的值(在运行环境变量里面的值)
@Value("${person.nickName}")
@Bean标注的方法创建对象的时候,方法参数的值从容器中获取。
2.@PropertySource加载外部配置文件
使用@PropertySource读取外部配置文件中的k/v保存到运行的环境变量中
加载完外部的配置文件以后使用${}取出配置文件的值
Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值。
1.@Autowired & @Qualifier & @Primary
1)默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值。
2)如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
applicationContext.getBean("bookDao")
3)@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名。
4)自动装配默认一定要将属性赋值好,没有就会报错;可以使用@Autowired(required=false);
5)@Primary:让Spring进行自动装配的时候,默认使用首选的bean;也可以继续使用@Qualifier指定需要装配的bean的名字。
2.@Resource & @Inject
Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范的注解]
@Resource:
可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
没有能支持@Primary功能没有支持@Autowired(reqiured=false);
@Inject:
需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;
@Autowired:Spring定义的; @Resource、@Inject都是java规范
AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
3.方法、构造器位置的自动装配
默认加在IOC容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等 *** 作。
@Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值
1)[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配。
2)[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还可以自动从容器中获取。
4.Aware注入Spring底层组件&原理
自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);
自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware;
把Spring底层一些组件注入到自定义的Bean中;
xxxAware:功能使用xxxProcessor;
ApplicationContextAware==》ApplicationContextAwareProcessor;
5.@Profile环境搭建
Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
开发环境、测试环境、生产环境;
数据源:(/A)(/B)(/C);
@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件。
6.@Profile根据环境注册bean
1)加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中,默认是default环境。
2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效。
3)没有标注环境标识的bean在任何环境下都是加载的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)