概念
Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean
并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例
缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。
作用域
别为 singleton(单例)、prototype(原型)、 request、session 和 global session
Spring Bean 生命周期
实例化
1. 实例化一个 Bean,也就是我们常说的 new。
IOC 依赖注入
2. 按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入。
setBeanName 实现
3. 如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanName(String) 方
法,此处传递的就是 Spring 配置文件中 Bean 的 id 值
BeanFactoryAware 实现
4. 如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory,
setBeanFactory(BeanFactory)传递的是 Spring 工厂自身(可以用这个方式来获取其它 Bean,只
需在 Spring 配置文件中配置一个普通的 Bean 就可以)。
ApplicationContextAware 实现
5. 如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用
setApplicationContext(ApplicationContext)方法,传入 Spring 上下文(同样这个方式也可以实现
步骤 4 的内容,但比 4 更好,因为 ApplicationContext 是 BeanFactory 的子接口,有更多的实现
方法)
postProcessBeforeInitialization接口实现-初始化预处理
6. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用
postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被用
作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用那个的方法,也可以被应用于内存
或缓存技术。
init-method
7. 如果 Bean 在 Spring 配置文件中配置了 init-method 属性会自动调用其配置的初始化方法。
postProcessAfterInitialization
8. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用
postProcessAfterInitialization(Object obj, String s)方法。
注:以上工作完成以后就可以应用这个 Bean 了,那这个 Bean 是一个 Singleton 的,所以一般情况下
我们调用同一个 id 的 Bean 会是在内容地址相同的实例,当然在 Spring 配置文件中也可以配置非
Singleton。
Destroy 过期自动清理阶段
9. 当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个接口,会调用那
个其实现的 destroy()方法; destroy-method 自配置清理
10. 最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁
方法。
11. bean 标签有两个重要的属性(init-method 和 destroy-method)。用它们你可以自己定制初始化
和注销方法。它们也有相应的注解(@PostConstruct 和@PreDestroy)。
Spring 依赖注入四种方式
构造器注入
/*带参数,方便利用构造器进行注入*/
public CatDaoImpl(String message){ this. message = message; }
<bean id="CatDaoImpl" class="com.CatDaoImpl"> <constructor-arg value=" message "></constructor-arg> </bean>
setter方法注入
<bean id="id" class="com.id "> <property name="id" value="123"></property> </bean>
静态工厂
//factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
<bean name="springAction" class=" SpringAction" >
<!--使用静态工厂的方法注入对象,对应下面的配置文件-->
<property name="staticFactoryDao" ref="staticFactoryDao"></property> </bean>
<!--此处获取对象的方式是从工厂类中获取静态方法-->
<bean name="staticFactoryDao" class="DaoFactory" factory- method="getStaticFactoryDaoImpl"></bean>
实例工厂
<bean name="springAction" class="SpringAction">
<!--使用实例工厂的方法注入对象,对应下面的配置文件-->
<property name="factoryDao" ref="factoryDao"></property> </bean>
<!--此处获取对象的方式是从工厂类中获取实例方法-->
<bean name="daoFactory" class="com.DaoFactory"></bean>
<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
5 种不同方式的自动装配
1. no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配。
2. byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire 属性被设置成
byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。 3. byType:通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成
byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个 bean 符合
条件,则抛出错误。
4. constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造
器参数类型,将会抛出异常。
5. autodetect:首先尝试使用constructor 来自动装配,如果无法工作,则使用byType方式。
ApplicationContext 面向开发应用
1. ClassPathXmlApplicationContext:默认从类路径加载配置文件
2. FileSystemXmlApplicationContext:默认从文件系统中装载配置文件
3. ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事
件等。
4. MessageSource:为应用提供 i18n 国际化消息访问的功能;
5. ResourcePatternResolver : 所 有 ApplicationContext 实现类都实现了类似于
PathMatchingResourcePatternResolver 的功能,可以通过带前缀的 Ant 风格的资源文件路径装
载 Spring 的配置文件。
6. LifeCycle:该接口是 Spring 2.0 加入的,该接口提供了 start()和 stop()两个方法,主要用于控制异
步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体 Bean 实现,
ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean,以达到管理
和控制 JMX、任务调度等目的。
7. ConfigurableApplicationContext 扩展于 ApplicationContext,它新增加了两个主要的方法:
refresh()和 close(),让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上
下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清
除缓存并重新装载配置信息,而调用 close()则可关闭应用上下文。
标签:ApplicationContext,调用,配置文件,Spring,接口,Bean,IOC
From: https://www.cnblogs.com/li-xiaotian/p/16602741.html