一:
beans.xml:定义需要实例化对象的全限定类名以及对象之间的依赖关系
beanFactory:通过反射技术来实例化对象并且维护对象之间的依赖关系
bean的定义存在三种模式:
1.纯注解模式(bean信息定义全部配置在xml中)
2.xml+注解模式
3.纯注解模式
三种定义模式对应IOC的启动方式:
1&2在JavaSE应用下通过ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“beans.xml”)或new FileSystemXmlApplicationContext(“c:/beans.xml”)
在JavaWeb应用下通过监听器去加载xml(ContextLoaderListener)
3在JavaSE应用下通过ApplicationContext applicationContext=AnnotationConfigApplicationContext (SpringConfig.class)
在JavaWeb应用下通过监听器去加载配置类(ContextLoaderListener)
二:
BeanFactory与ApplicationContext区别
BeanFactory是Spring框架中IoC容器的顶层接⼝,定义⼀些基础功能,定义⼀些基础规范
ApplicationContext是BeanFactory的⼀个⼦接⼝,具备BeanFactory提供的全部功能
通常,我们称BeanFactory为SpringIOC的基础容器,ApplicationContext是容器的⾼级接⼝,⽐BeanFactory要拥有更多的功能,⽐如说国际化⽀持和资源访问(xml,java配置类)等
三:
实例化Bean的三种⽅式:
1.使⽤⽆参构造函数
2.使⽤静态⽅法创建
3.使⽤实例化⽅法创建
四:
1.实际企业开发中,纯xml模式使⽤已经很少了,大多会用xml+注解结合模式,这样xml⽂件依然存在,所以,spring IOC容器的启动仍然从加载xml开始,至于哪些bean的定义写在xml中,哪些bean的定义使⽤注解,一般第三⽅jar中的bean定义在xml,⽐如druid数据库连接池
⾃⼰开发的bean定义使⽤注解
五:
- lazy-Init 延迟加载应用场景:
(1)开启延迟加载⼀定程度提⾼容器启动和运转性能(效果不明显)
(2)对于不常使⽤的 Bean 设置延迟加载,这样偶尔使⽤的时候再加载,不必要从⼀开始该 Bean 就占⽤资源
六:
后置处理器:
Spring提供了两种后处理bean的扩展接⼝,分别为 BeanPostProcessor 和
BeanFactoryPostProcessor,两者在使⽤上是有所区别的。
⼯⼚初始化(BeanFactory)—> Bean对象
在BeanFactory初始化之后可以使⽤BeanFactoryPostProcessor进⾏后置处理做⼀些事情
在Bean对象实例化(并不是Bean的整个⽣命周期完成)之后可以使⽤BeanPostProcessor进⾏后置处
理做⼀些事情
注意:对象不⼀定是springbean,⽽springbean⼀定是个对象
BeanPostProcessor:BeanPostProcessor是针对Bean级别的处理,可以针对某个具体的Bean
该接⼝提供了两个⽅法,分别在Bean的初始化⽅法前和初始化⽅法后执⾏,具体这个初始化⽅法指的是
什么⽅法,类似我们在定义bean时,定义了init-method所指定的⽅法
定义⼀个类实现了BeanPostProcessor,默认是会对整个Spring容器中所有的bean进⾏处理。如果要对
具体的某个bean处理,可以通过⽅法参数判断,两个类型参数分别为Object和String,第⼀个参数是每
个bean的实例,第⼆个参数是每个bean的name或者id属性的值。所以我们可以通过第⼆个参数,来判
断我们将要处理的具体的bean。
注意:处理是发⽣在Spring容器的实例化和依赖注⼊之后。
BeanFactoryPostProcessor:BeanFactory级别的处理,是针对整个Bean的⼯⼚进⾏处理,典型应⽤:PropertyPlaceholderConfigurer
注意:调⽤ BeanFactoryPostProcessor ⽅法时,这时候bean还没有实例化,此时 bean 刚被解析成
BeanDefinition对象
七:
@Component 和 @Bean 的区别:
Spring帮助我们管理Bean分为两个部分,一个是注册Bean,一个装配Bean。
完成这两个动作有三种方式,一种是使用自动配置的方式、一种是使用JavaConfig的方式,一种就是使用XML配置的方式。
1.@Compent 作用就相当于 XML配置
2.@Bean 需要在配置类中使用,即类上需要加上@Configuration注解
3.如果你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component注解的,因此就不能使用自动化装配的方案了,但是我们可以使用@Bean,当然也可以使用XML配置