zoukankan      html  css  js  c++  java
  • Spring(三)之Ioc、Bean、Scope讲解

    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上扩展。

  • 相关阅读:
    python 引用和对象理解
    ABP .Net Core 部署到IIS 问题汇总
    Ionic2 cordova angular2 打包到Android apk环境搭建
    学习ABP ASP.NET Core with Angular 环境问题
    [AngularJS 2 实践 一]My First Angular App
    即时通信系统Openfire分析之一:Openfire与XMPP协议
    S3C6410启动过程分析
    使用Word发表博客园博文
    github学习笔记
    Mac环境下 配置Python数据分析环境
  • 原文地址:https://www.cnblogs.com/youcong/p/9459398.html
Copyright © 2011-2022 走看看