Spring(三)之Ioc、Bean、Scope讲解

简介: Spring容器是Spring Framework的核心。容器将创建对象,将它们连接在一起,配置它们,并管理从创建到销毁的整个生命周期。Spring容器使用DI来管理组成应用程序的组件。这些对象称为Spring Beans。

Spring容器是Spring Framework的核心。容器将创建对象,将它们连接在一起,配置它们,并管理从创建到销毁的整个生命周期。Spring容器使用DI来管理组成应用程序的组件。这些对象称为Spring Beans。

容器通过读取提供的配置元数据获取有关要实例化,配置和组装的对象的指令。配置元数据可以由XML,Java注释或Java代码表示。下图表示Spring的工作原理的高级视图。

 一、IOC

Spring IoC容器利用Java POJO类和配置元数据来生成完全配置和可执行的系统或应用程序

 

Spring提供以下两种不同类型的容器

 

所述的ApplicationContext容器包括所有功能的BeanFactory容器,因此,通常建议在Bean工厂BeanFactory仍可用于轻量级应用程序,如移动设备或基于applet的应用程序,其中数据量和速度都很重要.

 

二.Bean

构成应用程序主干并由Spring IoC容器管理的对象称为beanbean是一个由Spring IoC容器实例化,组装和管理的对象。这些bean是使用您提供给容器的配置元数据创建的。例如,以前面章节中已经看到的XML <bean />定义的形式。

 

Bean定义包含称为配置元数据的信息,容器需要知道以下内容 -

  • 如何创建一个bean
  • Bean的生命周期细节
  • Bean的依赖关系

 

所有上述配置元数据都转换为构成每个bean定义的以下属性集。

 

 

Spring配置元数据

Spring IoC容器与实际编写此配置元数据的格式完全分离。以下是为Spring容器提供配置元数据的三种重要方法 -

  • 基于XML的配置文件。
  • 基于注释的配置
  • 基于Java的配置

 

 

三、Bean Scope

定义<bean>时,您可以选择声明该bean的作用域。例如,要在每次需要时强制Spring生成一个新的bean实例,您应该将bean的scope属性声明为原型类似地,如果您希望Spring在每次需要时返回相同的bean实例,则应将bean的scope属性声明为singleton

Spring Framework支持以下五个范围,其中三个范围仅在您使用支持Web的ApplicationContext时才可用。

(1)SingleTon

这将bean定义范围限定为每个Spring IoC容器的单个实例(默认)。

(2)Prototype

这将单个bean定义范围限定为具有任意数量的对象实例。

(3)request

这将bean定义范围限定为HTTP请求。仅在Web感知Spring ApplicationContext的上下文中有效。

(4)session

这将bean定义范围限定为HTTP会话。仅在Web感知Spring ApplicationContext的上下文中有效。

(5)gobal session

这将bean定义范围限定为全局HTTP会话。仅在Web感知Spring ApplicationContext的上下文中有效。

 

示例讲解:

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class MainApp {
   public static void main(String[] args) {
       
       ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
          HelloWorld objA = (HelloWorld) context.getBean("helloWorld");

          objA.setMessage("I'm object A");
          objA.getMessage();

          HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
          objB.getMessage();
   }
}

 

Beans.xml

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

   <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope="singleton">
    
   </bean>

</beans>

不指定scope,默认是单例的,关于单例模式可以参考我的这篇博文:单例模式和JDBC

另外关于原型,prototype,struts2就是这样,struts每次实例都是不同的action,拿框架作为比较SpringMVC与Struts2的区别:

(1)SpringMVC是方法级别的,Struts2是类级别的;

(2)SpringMVC是单例的,全局共享一个实例,比如HttpSession,而Struts2是多例的,每一次实例都会产生不同的action;

(3)SpringMVC的入口是servlet,而Struts2的入口是filter;

可以从web.xml的配置可以看出来:

例如SpringMVC在web.xml配置

<servlet>
    <description>spring mvc servlet</description>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

 

例如Struts2在web.xm的配置

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

(4)拦截器方面,Struts2有自己的拦截器机制,而SpringMVC主要是利用AOP实现拦截;

struts2拦截机制图:

(5)SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便;

(6)SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱;

(7)Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方挺多的,与SpringMVC比较,SpringMVC几乎是零配置);

(8)设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

 

目录
相关文章
|
10天前
|
XML 安全 Java
|
8天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
23 2
|
1月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
8天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
16 1
|
2月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
75 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
3月前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
3月前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0