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容器管理的对象称为bean。bean是一个由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上扩展。

Spring(三)之Ioc、Bean、Scope讲解的更多相关文章

  1. Spring三种实例化Bean的方法

    1.实例化bean的三种方法:(1) 构造器<!-- 体验1 --><bean id="personService" class="com.persia ...

  2. spring三种实例化bean的方式

    1构造函数实例化 2静态工厂方法实例化 3实例工厂方法实例化 service接口: package service; public interface PersonService { public v ...

  3. Spring 为啥默认把bean设计成单例的?

    熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session. 如下图是官方文档上的截图, ...

  4. 1. spring5源码 -- Spring整体脉络 IOC加载过程 Bean的生命周期

    可以学习到什么? 0. spring整体脉络 1. 描述BeanFactory 2. BeanFactory和ApplicationContext的区别 3. 简述SpringIoC的加载过程 4. ...

  5. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  6. Java Spring Boot VS .NetCore (三)Ioc容器处理

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  7. Spring IoC bean 的加载

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 容 ...

  8. Spring(三)实例化Bean以及注入对象

    使用xml实例化bean 在xml中实例化bean的三种方式 <bean id="springService" class="com.zhiyou100.crm.t ...

  9. spring学习(03)之bean实例化的三种方式

    bean实体例化的三种方式 在spring中有三中实例化bean的方式: 一.使用构造器实例化:(通常使用的一个方法,重点) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化 第一种.使用构 ...

随机推荐

  1. 九、双端队列LinkedBlockDeque

    一.简介 JDK通过BlockQueue阻塞队列实现了生产者-消费者模式,生产者向队列添加数据,消费者从队列里面消费数据. 但是在有些场景里面,我们是无法区分生产者消费者的,或者说既是生产者,也是消费 ...

  2. 撩课-Java每天5道面试题第12天

    91.如何提升数据查询的效率? 1.首先检查表的结构是否合理, 因为采用多表查询的时候, 看主外键的引用关系是否适当. 如果不适当则重新设置表结构. 如果是应用中的系统, 则不需要更改表的字段, 只更 ...

  3. 【SSH网上商城项目实战07】Struts2和Json的整合

    转自:https://blog.csdn.net/eson_15/article/details/51332758 上一节我们完成了DataGrid显示jason数据,但是没有和后台联系在一起,只是单 ...

  4. 使用NOPI读取Word、Excel文档内容

    使用NOPI读取Excel的例子很多,读取Word的例子不多. Excel的解析方式有多中,可以使用ODBC查询,把Excel作为一个数据集对待.也可以使用文档结构模型的方式进行解析,即解析Workb ...

  5. PostgreSQL Metadata

      http://www.devart.com/dotconnect/postgresql/docs/MetaData.html In this overload first parameter is ...

  6. js获取日期:昨天今天和明天、后天 [转贴记录]

    <html> <head> <meta http-equiv="Content-Type" content="textml; charset ...

  7. IoT Gateway Based on OSGi

    1. OSGi Knowleage 2. OSGi.Net on Windows 3. OSGi with JAVA 4. OSGi with Qt and C++ 5. Architecture o ...

  8. (C#) 多线程访问int, bool 等值类型变量

    参考: https://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock/154803

  9. sqlserver查询数据可编辑方法

    原文:http://www.cnblogs.com/DaphneOdera/p/6418592.html 第一步.选中表右键,点击编辑前200行. 第二步.数据展示页面点击下图中红线框中的sql按钮 ...

  10. zTree 学习笔记之(一)

    zTree 学习笔记之(一) 简介 zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 到底有哪些具体的优点,可以参见官网 ...