SpringBean

前言

在Spring中,那些组成应用程序的主体以及那些由Spring IoC 容器锁管理的对象,被称之为bean

简单来讲,bean就是由IoC容器初始化、装配及管理的对象。

Spring中的bean默认是单例的,Spring的单例基于JVM,每个JVM内只有一个实例。

在大多数情况下,单例子bean都是很理想的方案,除了使用一些需要保持一些状态的bean.

bean的作用域

作用域

配置和注解

1
<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" scope="singleton">
1
2
3
4
@Service
@Scope("singleton")
public class ServiceImpl{
}

bean的生命周期

initialization and destroy

Spring 框架提供了很多方法让我们在Spring Bean生命周期中执行initialization和pre-destroy方法.

  • 使用@PostConstruct和@PreDestroy注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class GiraffeService {
    @PostConstruct
    public void initPostConstruct(){
    System.out.println("执行PostConstruct注解标注的方法");
    }
    @PreDestroy
    public void preDestroy(){
    System.out.println("执行preDestroy注解标注的方法");
    }
    }
  • 通过bean的配置文件中指定init-method和destroy-method方法

    1
    2
    3
    <bean name="giraffeService" class="com.giraffe.spring.service.GiraffeService"
    init-method="initMethod" destroy-method="destroyMethod">
    </bean>
1
2
3
4
5
6
7
8
9
10
public class GiraffeService {
//通过<bean>的destroy-method属性指定的销毁方法
public void destroyMethod() throws Exception {
System.out.println("执行配置的destroy-method");
}
//通过<bean>的init-method属性指定的初始化方法
public void initMethod() throws Exception {
System.out.println("执行配置的init-method");
}
}

Aware接口

  • ApplicationContextAware: 获得ApplicationContext对象,可以用来获取所有Bean definition的名字。
  • BeanFactoryAware:获得BeanFactory对象,可以用来检测Bean的作用域。
  • BeanNameAware:获得Bean在配置文件中定义的名字。
  • ResourceLoaderAware:获得ResourceLoader对象,可以获得classpath中某个文件。
  • ServletContextAware:在一个MVC应用中可以获取ServletContext对象,可以读取context中的参数。
  • ServletConfigAware: 在一个MVC应用中可以获取ServletConfig对象,可以读取config中的参数。

总结

  • Bean容器找到配置文件中 Spring Bean 的定义。
  • Bean容器利用Java Reflection API创建一个Bean的实例。
  • 如果涉及到一些属性值 利用set方法设置一些属性值。
  • 如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
  • 如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
  • 如果Bean实现了BeanFactoryAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
  • 与上面的类似,如果实现了其他Aware接口,就调用相应的方法。
  • 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执-行postProcessBeforeInitialization()方法
  • 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
  • 如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
  • 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执 行postProcessAfterInitialization()方法
  • 当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
  • 当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。
    SpringBean生命周期

Spring IoC(工厂模式)

IoC 是一种设计思想, 将原本在程序中手动创建对象的控制权, 交由Spring框架来管理。

IoC容器是Spring用来实现IoC的载体, IoC容器实际上就是个Map(K, V), 存放各种对象。

IoC容器就像是一个工厂一样,当我们需要创建一个对象的时候, 只需要配置好配置文件或注解即可, 完全不用考虑对象是怎么被创建出来的。

为了更好地去了解IoC, 此处我需要补充几个知识点

依赖倒置原则: 把原本的高层建筑依赖底层建筑倒置过来, 变成底层建筑依赖高层建筑, 高层建筑需要什么, 底层建筑便去实现这样的需求, 高层并不需要管底层是怎么实现的, 这样就不会出现牵一发而动全身的情况。

DI(Dependecy Inject,依赖注入)是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去

控制反转就是依赖倒置原则的一种代码设计思路, 具体方法是依赖注入。

Spring IoC有什么好处

工厂设计模式

Spring 使用工厂模式可以通过BeanFactory 和 ApplicationContext创建bean对象

  • BeanFactory: 延迟注入, 需要使用到某个Bean时才会注入, 占用较少内存, 程序启动速度更快
  • ApplicationContext: 启动是一次性创建所有的Bean

对比: BeanFactory仅仅提供了最基本的依赖注入支持, ApplicationContext扩展了BeanFactory, 所以一般会使用ApplicationContext会更多一点。

ApplicationContext三个实现类:

  • ClassPathXmlApplication: 从上下文中加载资源文件
  • FileSystemXmlApplication: 从文件系统中加载资源文件
  • XmlWebApplicationContext: 从Web系统中加载资源文件

参考

JavaGuide-Spring Bean

本文标题:SpringBean

文章作者:Enda Lin

发布时间:2019年06月08日 - 15:06

最后更新:2019年07月08日 - 09:15

原始链接:https://wt-git-repository.github.io/2019/06/08/SpringBean/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。