一、什么是Bean?
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
Bean是一个由Spring IoC容器实例化、组装和管理的对象,bean就是一个实例。
二、Bean 的完整生命周期
Bean从创建-参与计算流程-销毁,spring通过IOC控制翻转进行操作,所以bean的整个生命周期都会暴露操作实例的方法,通过这些方法,可以更加灵活的操控每个实例对象。
下面展示了一个Bean的构造过程
Bean 的生命周期
-
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化,配置文件中<bean>表示一个bean,也可以使用各种注解;
-
然后对Bean在文件或注解中设置的属性等进行注入;
-
如果Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法,此处可以重新修改beanName;
-
如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
-
如果Bean实现了ApplicationContextAware接口,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
-
如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
-
如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
-
如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
-
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
-
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
记忆方法:数猪名 工厂上下 初始化四阶段 系统自我销毁
三、生命周期中函数在开发中有什么用
我以前看到bean的生命周期的时候只是简单的记住它的顺序,感觉没什么用,真的是to yong to simple;
1.属性注入
<bean id="car1" class="com.demo.Car"> <property name="name" value="宝马"></property> <property name="price" value="100000"></property> </bean>
这样在car的类中有一个
public Car(String name,double price){ this.name=name; this.price=price; }
就可以实现一个设置好初始值得一个bean
2.BeanNameAware接口,有一个setBeanName方法
可以在类中新建一个String beanName变量,通过setBeanName进行复制,这样就可以知道这个bean的Name,
上面的id="car1" 也会通过这个setBeanName传入到实例中;
3.BeanFactoryAware接口,可以获得创建这个实例的工厂方法
BeanFactory 可以获得或者设置类
String FACTORY_BEAN_PREFIX = "&"; Object getBean(String var1) throws BeansException; <T> T getBean(String var1, Class<T> var2) throws BeansException; <T> T getBean(Class<T> var1) throws BeansException; Object getBean(String var1, Object... var2) throws BeansException; boolean containsBean(String var1); boolean isSingleton(String var1) throws NoSuchBeanDefinitionException; boolean isPrototype(String var1) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException; Class<?> getType(String var1) throws NoSuchBeanDefinitionException; String[] getAliases(String var1);
4.ApplicationContextAware 可以获得ApplicationContext 上下文,
applicationContext.getBeansOfType(RegistryConfig.class)
applicationContext可以通过getBeansOfType获得所有已经继承RegistryConfig这个配置文件的实例Map,
Map的key是beanName value是对应的实例,这样这个类需要什么配置就能很好的确定
5.BeanPostProcessor接口的postProcessBeforeInitialization 、postProcessAfterInitialization
是在系统初始化和自定义初始化之前和之后的一些处理方法,针对所有Spring上下文中所有的bean,
可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,
然后对所有的bean进行一个初始化之前和之后的代理
6.InitializingBean接口,afterPropertiesSet是系统的初始化方法,此处可以对父类做一些基本的初始化
7.调用自己定义的初始化方法
<bean id="beanA" class="classA" init-method="anotherInit">
</bean>
init-method 配置的初始化方法
8.DisposableBean 系统销毁时调用的方法
9.自定义销毁方法:
<bean class="com.demo" init-method="start" destroy-method="destroy">
</bean>
destroy-method方法