[spring学习1] IoC容器

Posted maplesnow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[spring学习1] IoC容器相关的知识,希望对你有一定的参考价值。

简介

一般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");
// ...

ClassPathsrc/路径下。

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

以上是关于[spring学习1] IoC容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习记录1——IoC容器

Spring5学习——2IOC容器

Spring学习IOC容器配置bean:定义与实例化

[spring学习1] IoC容器

Spring学习---Spring IoC容器的核心原理

spring源码学习spring的IOC容器之BeanFactoryPostProcessor接口学习