spring bean的作用域和生命周期
容纳bean
(1)bean工厂:最简单的容器,提供了基础的依赖注入支持,创建各种类型的bean
(2)应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务
从ApplicationContext上下文容器中获取bean和从bean工厂容器中获取bean的区别“
bean的作用域
Spring Framework支持五种作用域(其中有三种只能用在基于web的)。
在每个Spring IoC容器中一个bean定义对应一个对象实例。 |
|
一个bean定义对应多个对象实例。 |
|
在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。 |
|
在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 |
|
在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的SpringApplicationContext情形下有效。 |
BeanFactory方式(已废弃)
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
UserService userService = (UserService)factory.getBean("userService");
userService.sayHello();
UserService userService = (UserService)factory.getBean("userService");
userService.sayHello();
此种方式实例化该容器时,bean不会被创建(lazy,速度慢,省内存),只有当你去使用bean时才进行加载。
移动设备使用BeanFactory(省内存)。其他九成用ApplicationContext
使用ApplicationContext时,并且为singleton时(prototype不可!),配置的bean不管你用不用,都被实例化(early,好处就是预加载,缺点就是耗内存)
或许bean的方法:
1 ClassPathXmlApplicationContext:从类路径中加载
2 FileSystemXmlApplicationContext: 从文件系统加载
3 XmlWebApplicationContext:从web系统中加载
bean的生命周期(scope=singleton为例说明)
(1)实例化(当程序加载beans.xml文件时),把我们的bean实例化到内存中,也可用factory-method 来调用有参的构造器
(2)设置属性,前提是有setter才能成功
(3)bean实现BeanNameAware接口,则可以通过setBeanName获取id号
(4)bean实现BeanFactoryAware接口,则可以获取beanFactory
(5)bean实现ApplicationContextAware接口,则调用setApplicationContext
(6)bean如果和一个后置处理器关联,则会调用两个方法,见下面的程序示例,执行”before“
(7)实现InitializingBean接口,则会调用afterPropertiesSet()方法
(8)调用定制(只有所配置的bean有,非aop)的初始化方法,xml bean里面写init-method
(9)后置处理器的”after“
(10)使用bean
(11)容器关闭
(12)bean实现DisposableBean的destroy()方法关闭数据连接,socket,文件流等
(13)调用定制的销毁方法 xml bean里面写 destroy-method
实际开发中用(1)(2)(6)(9)(10)(11)
BeanFactory 的话少了(5)(6)(9)
MyBeanPostProcessor.java
package com.myBeanPostProcessor; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; /** * Created by balfish on 15-3-29. */
class MyBeanPostProcessor implements BeanPostProcessor { @Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("postProcessBeforeInitialization 函数被调用");
return o;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("postProcessAfterInitialization 函数被调用");
return o;
} }
applicationContext.xml的变化
<!--配置自己的后置处理器,类似过滤器-->
<bean id="myBeanPostProcessor"
class="com.myBeanPostProcessor.MyBeanPostProcessor" />
应用场景举例
1 记录每个对象实例化的时间
2过滤每个调用ip
3给所有对象添加属性,或者函数(面向切面aop)
相关推荐
Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
SPRING FRAMEWORK BEAN作用域和生命周期原理解析 Spring Framework 是一个流行的 Java Web 应用程序框架,它提供了一个强大的依赖注入机制,称为 Bean 容器。Bean 容器管理着应用程序中的所有对象,并提供了一些...
在Spring框架中,Bean的作用域是指Bean实例的生命周期和可见性域。Spring框架中定义了五种作用域,分别是singleton、prototype、request、session和global session。 1. singleton:单例模式,Spring IoC容器中只会...
Spring容器仅负责初始化和配置这些实例,但不会管理它们的生命周期。客户端(如其他Bean或代码)需要负责销毁这些实例。 - 配置Prototype Bean的例子是:`<bean id="role" class="spring.chapter2.maryGame.Role" ...
了解并熟练掌握Bean的生命周期和作用域,有助于优化应用性能,避免资源浪费,并使代码更加灵活和可维护。在实际开发中,根据业务需求选择合适的作用域,并善用生命周期回调方法,可以使Spring更好地服务于我们的应用...
在 Spring 中,Bean 的作用域是指 Bean 实例的生命周期和共享程度。Spring 提供了五种作用域:singleton、prototype、request、session 和 globalSession。每种作用域都有其特点和应用场景。 1. Singleton 作用域 ...
不同作用域的Bean,其生命周期和管理方式也不同。例如,单例Bean在整个应用中只有一个实例,而原型Bean每次请求都会创建新的实例。 6. **AOP代理** 如果Bean被声明为需要AOP代理(例如,带有切面注解),Spring会...
Spring 中 bean 的作用域是指 Spring IoC 容器中 bean 的生命周期和实例化方式。bean 的作用域决定了 bean 的实例化和生命周期的管理方式。在 Spring 中,bean 的作用域可以分为五种:singleton、prototype、...
- **作用域的影响**:不同作用域(如singleton、prototype、request、session等)的Bean,其生命周期和创建方式都有所不同,需要根据应用场景选择合适的作用域。 - **懒加载**:如果Bean配置为`lazy-init="true"`,...
总的来说,理解和掌握Spring的Bean生命周期、容器周期和工厂周期对于开发高效且可维护的应用至关重要。通过这些知识,我们可以更有效地配置Bean,管理它们的生命周期,优化性能,并且能够更好地应对复杂的应用场景。
在Spring框架中,Bean生命周期是核心概念之一,它涉及到Bean的创建、初始化、使用和销毁等阶段。了解和掌握Bean生命周期对于开发高质量的Spring应用至关重要。以下是对Spring Bean生命周期的详细解析。 首先,Bean...
Spring提供了五种不同的Bean作用域,每种都有其特定的使用场景和行为。 1. **Singleton作用域**:这是Spring的默认作用域,意味着无论何时从容器中请求一个特定的Bean,都会返回同一个实例。在配置文件中,可以使用...
6. **作用域处理**:Bean的作用域会影响其生命周期。默认情况下,Bean的scope为"singleton",表示Spring容器只创建一个实例,并将其缓存。如果scope设为"prototype",每次请求都会创建一个新的Bean实例。 7. **销毁...
综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂方法的误用、AOP代理的配置问题或是Bean作用域设置不准确导致的。通过仔细检查和修正这些问题,可以避免...
这些作用域定义了Bean的生命周期和创建行为: 1. **单例(Singleton)**:默认作用域,每个容器中只有一个实例,适合无状态的服务。 2. **原型(Prototype)**:每次请求都会创建一个新的Bean实例,适用于有状态的...
总结起来,Spring中的`singleton`和`prototype`作用域是管理Bean生命周期的重要手段。`singleton`提供了单例模式的实现,确保了全局唯一性,适合状态不随时间改变的对象;`prototype`则支持按需创建新实例,适用于...
在Spring框架中,Bean的作用域是其生命周期管理的关键部分,它决定了Bean的创建、共享以及销毁方式。本篇内容将深入探讨Spring容器中Bean的作用域编程开发技术,以帮助开发者更好地理解和利用这些特性来优化应用的...
Spring Bean作用域属性singleton和prototype的区别详解 Spring Framework中,Bean的作用域属性是指Bean实例的生命周期和作用域。Spring提供了五种作用域:singleton、prototype、request、session和global session...