spring相关文章
Spring原理-IOC控制反转
Spring框架七大核心模块
Spring Beans原理–bean生命周期
1、Spring beans
1.1 什么是spring beans
spring beans是spring应用主干的java对象,被IOC容器初始化、装配和管理,通过容器中的元数据创建
1.2 IOC容器配置元数据的3种方式
- XML配置文件
- 基于注解的配置
- 基于Java的配置
1.3 spring配置文件
spring配置文件是个XML文件,包含了类信息,描述了如何配置它们,和如何相互调用
1.4 注入bean—6种方式
- set方法注入
- 构造器注入
- 通过index设置参数的位置
- 通过type设置参数类型
- 静态工厂注入
- 实例工厂
1.5 bean作用域
1、定义
spring通过bean 定义中的scope属性来声明作用域,默认scope属性为Singleton
2、五种bean的作用域
- Singleton (单例模式)
声明bean在每个IOC容器中只有一个实例 - prototype (原型模式)
bean在IOC容器中可以有多个实例 - request
每次http请求都会创建一个bean,该作用域仅在基于web的spring ApplicationContext情形下有效 - session
在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效 - global-session
在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
1.6 生命周期
1、java bean
在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收
2、 spring bean
- Spring对bean进行实例化
- Spring将值和bean的引用注入到bean对应的属性中
- 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法
- 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法,如果bean使用initmethod声明了初始化方法,该方法也会被调用
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法
- 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
10.如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用
3、 bean的生命周期方法
-
setup
容器加载bean的时候被调用 -
teardown
在容器卸载类的时候被调用 -
bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)
4、 内部bean
- 一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean
- 内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现
- 内部bean通常是匿名的,它们的Scope一般是prototype
5、自动装配方式
- 在spring中,对象无需自己查找或创建与其依赖的对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装载模式
5.1 xml配置中共有5种自动装配
- no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean
- byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配
- byType:通过参数的数据类型进行自动装配
- constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配
- autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用byType的方式自动装配
6、@Autowired注解自动装配过程
6.1 流程
- 使用@Autowired注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,<context:annotation-config />
- 在启动spring IOC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IOC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean
- 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
- 如果查询的结果不止一个,那么@Autowired会根据名称来查找,述查找的结果为空,那么会抛出异常。解决方法时,使用required=false
6.2 局限性
- 重写:需用配置来定义依赖,意味着总要重写自动装配
- 模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。