简介
一般java程序会有很多个类,类的声明赋值等都需要自己手动操作,比较繁琐。Bean
是一个规范,它也是一个普通的java类,人们希望像写出的程序松耦合,每个类实现自己的功能即可,Bean就类似于一个一个的零件,程序由许多的Bean拼装而成。
很多类,我们常重复使用到,但初始化并赋值等操作都是重复的,在业务代码中还要想办法去找个地方去做它。
通过spring框架,配置好的bean,ioc容器会自动帮你new
出来,并赋好值,自动管理bean的生命周期。我们仅仅只在需要使用的地方声明,ioc容器会自动帮你把一切的配置都做好。
Bean
创建Bean
bean就是普通的java类,由成员变量和其对应的setter和getter方法组成。
package com.yww;
public class Message {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = "this mssage is : " + msg;
}
}
Bean 生命周期
实例化 -> 填充属性 -> 调用BeanNameAware的setBean()方法 -> 调用BeanFactoryAware的setBeanFactory()方法 -> 调用ApplicationContextAware的setApplication()方法 ->
调用BeanPostProcessor的预初始化方法 -> 调用InitializingBean的afterPropertiesSet()方法 ->
调用自定义的初始化方法 ->
调用BeanPostProcessor的初始化方法 ->
使用Bean ->
(容器关闭)
调用DisposableBean的destroy()方法 ->
调用自定义的销毁方法
大概流程就是,bean的实例化,赋值,(传入实例到容器),(调用自定义方法),使用,容器关闭,(调用自定义销毁方法)。
括号中的是需要bean实现对应接口后,可以实现附加的操作。
Bean 作用域
可以在配置文件中设置bean的scope
作用范围。
可选值:singleton
(单例),prototype
(每次都新建),request
(每次全球都新建),session
(每个会话共享),global-session(用于Protlet).
Bean 定义继承
bean可以指定parent
指定另一个bean的id
后,使其继承。
尽管在java文件中没有继承,但可在配置文件中实现继承效果,子类可以或其父类的成员。但子类需要有父类的哪个成员。
Bean PostProcessor
Bean通过继承BeanPostProcessor
接口,可以让我们在Bean的初始化和销毁时做一些自定义的操作。
IoC容器
spring容器负责创建对象,装配它们,配置它们,管理它们的整个生命周期。
spring自带了多个容器的实现,分为2类。
- bean工厂(
org.springframework.beans.factory.beanFactory
)是最简单的容器,提供最基本的DI支持。 - 应用上下文(
org.springframework.context.ApplicationContext
)基于BeanFactory创建,提供应用框架级别的服务。(如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听器)
Spring BeanFactory容器
BeanFactory需要借助其它对象找到.xml
文件。
// ...
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
Message msg = (Message)factory.getBean("messge1");
// ...
ClassPath
是src/
路径下。
Spring ApplicationContext容器
spring有多种类型的应用上下文,如:
- AnnotationConfigApplicationContext:从基于java的配置类中加载spring应用上下文。
- AnnotationConfigWebApplicationContext:从基于java的配置类中加载spring web应用上下文。
- ClassPathXmlApplicationContext:从类路径下的xml配置文件中加载上下文。
- FileSystemXmlapplicationContext:从文件系统下的xml配置文件中加载上下文。
- XmlWebApplicationContext:从Web应用下的xml配置文件中加载上下文。
// ...
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("/home/yww/beans.xml");
ApplicationContext context = new AnnotationConfigApplicationContext(MessageConfig.class);
Message msg = (Message)context.getBean("messge1");
// ...
示例的这几个应用上下文,应在App中使用,而非web中。
AnnotationConfigWebApplicationContext
可以配置在web.xml
的<context-param>
中,让ContextLoaderListener
使用AnnotationConfigWebApplicationContext
代替XmlWebApplicationContext
。
原文地址:https://www.cnblogs.com/maplesnow/p/11620259.html