zoukankan      html  css  js  c++  java
  • Spring IOC 及 Spring 中Bean的三种创建方式

    SSM开源框架是现在市场上主流的Java开发框架,其中包含了Spring、SpringMVC以及Mybatis三大主要框架。在SSM框架中Spring是整个框架的核心,这是因为Spring有强大的资源整合能力,下面让我们一起来学习一下强大的Spring框架。

    我们首先来简单了解一下Spring框架中有哪些模块

    Spring 4.0的结构图

    其中主要有四大核心模块:

    1、IOC模块(即上图中的 CoreContainer模块)

    IOC模块是最核心、最基础的模块,又称控制反转容器:负责对象的创建,对象的存储,对象的依赖管理;

    2、WEB模块(即MVC,主要解决与表示层的通讯问题)

    3、AOP模块(实现系统功能的动态扩展)

    4、Data模块(整合JDBC、JPA、Mybatis等)


    今天主要讲一下Spring中的IOC模块,以及其创建Bean的三种方式

    我们首先了解一下什么是IOC:

    IOC是一种设计思想,我们称之为控制反转,在程序中我们通常将对象控制权进行转移的这种设计理解为IOC。例如:对象的创建和管理由第三方框架去实现;又比如在生活中我们将钱存入余额宝,由余额宝管理和使用我们的钱去投资,这也是IOC思想的一种体现。简单的来说就从“ 我要做什么就做什么 ”变为“ 你让我做什么我就做什么 ”。

    Spring中的IOC模块是IOC思想的一种完美实现。它通过反射构建对象,通过Map存储对象,通过DI机制实现对象的依赖管理,通过Context提供一个全局访问点。

    Spring有三种创建Bean的方式

    1、调用构造器创建Bean对象 (实际开发中常用的)

    通过调用构造器创建Bean对象是我们在实际开发中最常用的方式,而构造器创建Bean对象又有两种方式:

    1)利用无参构造函数 + setter方法注入值构造Bean对象实例

    其本质是 SpringContext 利用无参的构造函数创建一个对象,然后利用setter方法赋值,所以需要在pojo中提供无参数构造函数,并定义对应字段的setter方法。如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。

     <!-- setter方法注入值时bean的配置方式 -->
     <bean  id="user"  class="com.beans.user">
            <property name="id" value="666"></property>
            <property name="name" value="Leorizon"></property>
     </bean>

    setter方法注入值时,xml配置bean时使用的 <property name="属性名" value="值" ></property>标签对属性进行赋值

    Spring容器通过该方法为name属性注入参数。

    2)利用有参构造函数直接注入值构造Bean对象实例

    当利用有参构造注入值构造时,pojo中不需要setter方法;

    <!-- 构造注入值时bean的配置 -->
    <bean  id="user" class="com.beans.user" >
            <constructor-arg name="id" value="666"></constructor-arg>
            <constructor-arg name="name" value="Leorizon"></constructor-arg>
    </bean>

    在构造注入值时,xml配置bean时通过使用<constructor-arg name="属性名" value="值"></constructor-arg>标签的name属性和value属性指定了:构造方法赋值

    2、调用静态工厂方法创建Bean对象

    静态工厂方法创建bean对象的核心是: class + factory-method

    首先是封装类对象,如果需要对属性注入值,则需要定义有参构造方法或者生产setter方法;

    其次是定义静态工厂方法

    public class UserFactory {
    
        // 在这里我们定义创建方法是调用构造方法来创建对象
        
        public static User createPerson(){
            return new User();
        }
        
        public static User createPerson(Integer id,String name){
            return new User(id,name);
        }
    }

    然后在XML文件定义bean对象

    <!-- 调用静态工厂方法创建bean对象 -->
    <bean id="user"  class="com.beans.factory.UserFactory"  factory-method="createPerson">
        <constructor-arg name="id" value="666"></constructor-arg>
        <constructor-arg name="name" value="Leorizon"></constructor-arg>
    </bean>
     

    使用静态工厂方法创建Bean实例需要为<bean />元素指定出id外如下属性:

    class:指定静态工厂的实现类( 即包名.类名 )【相当于指定工厂的地址】

    factory-method:指定由静态工厂的哪个方法创建该Bean实例(方法名)【指定由工厂的哪个车间创建Bean】

    如果静态工厂方法需要参数,则使用<constructor-arg />元素传入

    3、调用实例工厂方法创建Bean对象

    调用实例工厂方法创建bean对象相比较静态工厂方法创建bean对象,就是将静态方法中的factory实现类先实例化一个factorBean对象,然后调用factorBean对象来创建bean对象;

     <!-- 先配置工厂Bean,class指定该工厂的实现类,该Bean负责产生其他Bean实例 --> 
     <bean id="userFactory" class="com.beans.factory.UserFactory"/> 
     
     <!-- 再引用工厂Bean来配置 其他Bean -->
     <bean id="user"  factory-bean="userFactory"  factory-method="createPerson">
        <constructor-arg name="id" value="666"></constructor-arg>
        <constructor-arg name="name" value="Leorizon"></constructor-arg>
     </bean>

    调用实例化工厂需要为<bean />指以下两个属性

    factory-bean :该属性指定工厂Bean的id

    factory-method:该属性指定实例工厂的工厂方法。

    如果方法需要参数,则使用<constructor-arg />元素传入


    原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

    如有侵权,请联系 yunjia_community@tencent.com 删除。

    编辑于 2018-12-24

  • 相关阅读:
    csuoj 1111: 三家人
    csu oj 1339: 最后一滴血
    csuoj 1337: 搞笑版费马大定理
    csuoj 1334: 好老师
    csu oj 1330 字符识别?
    C++动态内存分配
    变量内存分配
    codevs 2235 机票打折
    contesthunter CH Round #64
    面试分享:一年经验初探阿里巴巴前端社招
  • 原文地址:https://www.cnblogs.com/yangf428/p/12269546.html
Copyright © 2011-2022 走看看