前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring IOC 及 Spring 中Bean的三种创建方式

Spring IOC 及 Spring 中Bean的三种创建方式

原创
作者头像
运维搬砖
修改2018-12-24 10:53:51
4.5K0
修改2018-12-24 10:53:51
举报
文章被收录于专栏:LeorizonLeorizonLeorizon

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

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

Spring 4.0的结构图
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 />元素传入


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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring有三种创建Bean的方式
    • 1、调用构造器创建Bean对象 (实际开发中常用的)
      • 2)利用有参构造函数直接注入值构造Bean对象实例
    • 2、调用静态工厂方法创建Bean对象
      • 3、调用实例工厂方法创建Bean对象
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档