Spring第二篇【Core模块之快速入门、bean创建细节、创建对象】

前言

上篇Spring博文主要引出了为啥我们需要使用Spring框架,以及大致了解了Spring是分为六大模块的….本博文主要讲解Spring的core模块!

搭建配置环境

引入jar包

本博文主要是core模块的内容,涉及到Spring core的开发jar包有五个:

  • commons-logging-1.1.3.jar 日志
  • spring-beans-3.2.5.RELEASE.jar bean节点
  • spring-context-3.2.5.RELEASE.jar spring上下文节点
  • spring-core-3.2.5.RELEASE.jar spring核心功能
  • spring-expression-3.2.5.RELEASE.jar spring表达式相关表

我主要使用的是Spring3.2版本…

配置文件

Spring核心的配置文件applicationContext.xml或者叫bean.xml

那这个配置文件怎么写呢??一般地,我们都知道框架的配置文件都是有约束的…我们可以在spring-framework-3.2.5.RELEASE\docs\spring-framework-reference\htmlsingle\index.html找到XML配置文件的约束


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

</beans>   

我是使用Intellij Idea集成开发工具的,可以选择自带的Spring配置文件,它长的是这样:


<?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.xsd">

</beans>

Core模块快速入门

前面在介绍Spring模块的时候已经说了,Core模块是:IOC容器,解决对象依赖关系。

因此Core模块主要是学习如何得到IOC容器,通过IOC容器来创建对象、解决对象之间的依赖关系、IOC细节。

得到Spring容器对象【IOC容器】

Spring容器不单单只有一个,可以归为两种类型

  • Bean工厂,BeanFactory【功能简单】
  • 应用上下文,ApplicationContext【功能强大,一般我们使用这个】

通过Resource获取BeanFactory

  • 加载Spring配置文件
  • 通过XmlBeanFactory+配置文件来创建IOC容器


        //加载Spring的资源文件
        Resource resource = new ClassPathResource("applicationContext.xml");

        //创建IOC容器对象【IOC容器=工厂类+applicationContext.xml】
        BeanFactory beanFactory = new XmlBeanFactory(resource);

类路径下XML获取ApplicationContext

  • 直接通过ClassPathXmlApplicationContext对象来获取

        // 得到IOC容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

        System.out.println(ac);


XML配置信息

在上面我们已经可以得到IOC容器对象了。接下来就是在applicationContext.xml文件中配置信息【让IOC容器根据applicationContext.xml文件来创建对象】

  • 首先我们先有个JavaBean的类

/**
 * Created by ozc on 2017/5/10.
 */
public class User {

    private String id;
    private String username;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
  • 以前我们是通过new User的方法创建对象的….

    User user = new User();
  • 现在我们有了IOC容器,可以让IOC容器帮我们创建对象了。在applicationContext.xml文件中配置对应的信息就行了

       <!--
        使用bean节点来创建对象
            id属性标识着对象
            name属性代表着要创建对象的类全名
        -->
    <bean id="user" class="User"/>

通过IOC容器获取对象

  • 在外界通过IOC容器对象得到User对象


        // 得到IOC容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

        User user = (User) ac.getBean("user");

        System.out.println(user);

这里写图片描述


bean对象创建细节

在Spring第一篇中,我们为什么要引入Spring提出了这么一些问题:

这里写图片描述

既然我们现在已经初步了解IOC容器了,那么这些问题我们都是可以解决的。并且是十分简单【对象写死问题已经解决了,IOC容器就是控制反转创建对象】

scope属性

指定scope属性,IOC容器就知道创建对象的时候是单例还是多例的了。

属性的值就只有两个:单例/多例

这里写图片描述

  • 当我们使用singleton【单例】的时候,从IOC容器获取的对象都是同一个:

这里写图片描述

  • 当我们使用prototype【多例】的时候,从IOC容器获取的对象都是不同的:

这里写图片描述

scope属性除了控制对象是单例还是多例的,还控制着对象创建的时间!

  • 我们在User的构造函数中打印出一句话,就知道User对象是什么时候创建了。
    public User() {

        System.out.println("我是User,我被创建了");
    }
  • 当使用singleton的时候,对象在IOC容器之前就已经创建了
    • 这里写图片描述
  • 当使用prototype的时候,对象在使用的时候才创建
    • 这里写图片描述

lazy-init属性

lazy-init属性只对singleton【单例】的对象有效…..lazy-init默认为false….

有的时候,可能我们想要对象在使用的时候才创建,那么将lazy-init设置为ture就行了

这里写图片描述


init-method和destroy-method

如果我们想要对象在创建后,执行某个方法,我们指定为init-method属性就行了。。

如果我们想要IOC容器销毁后,执行某个方法,我们指定destroy-method属性就行了。


    <bean id="user" class="User" scope="singleton" lazy-init="true" init-method="" destroy-method=""/>

Bean创建细节总结


    /**
     * 1) 对象创建: 单例/多例
     *  scope="singleton", 默认值, 即 默认是单例 【service/dao/工具类】
     *  scope="prototype", 多例;              【Action对象】
     * 
     * 2) 什么时候创建?
     *    scope="prototype"  在用到对象的时候,才创建对象。
     *    scope="singleton"  在启动(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
     * 3)是否延迟创建
     *    lazy-init="false"  默认为false,  不延迟创建,即在启动时候就创建对象
     *    lazy-init="true"   延迟初始化, 在用到对象的时候才创建对象
     *    (只对单例有效)
     * 4) 创建对象之后,初始化/销毁
     *    init-method="init_user"       【对应对象的init_user方法,在对象创建之后执行 】
     *    destroy-method="destroy_user"  【在调用容器对象的destroy方法时候执行,(容器用实现类)】
     */

IOC创建对象

上面我们使用的是IOC通过无参构造函数来创建对象,我们来回顾一下一般有几种创建对象的方式:

  • 无参构造函数创建对象
  • 带参数的构造函数创建对象
  • 工厂创建对象
    • 静态方法创建对象
    • 非静态方法创建对象

使用无参的构造函数创建对象我们已经会了,接下来我们看看使用剩下的IOC容器是怎么创建对象的。

带参数的构造函数创建对象

首先,JavaBean就要提供带参数的构造函数:


    public User(String id, String username) {
        this.id = id;
        this.username = username;
    }

接下来,关键是怎么配置applicationContext.xml文件了。


    <bean id="user" class="User">

        <!--通过constructor这个节点来指定构造函数的参数类型、名称、第几个-->
        <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" name="username" type="java.lang.String" value="zhongfucheng"></constructor-arg>
    </bean>

这里写图片描述


在constructor上如果构造函数的值是一个对象,而不是一个普通类型的值,我们就需要用到ref属性了,而不是value属性

比如说:我在User对象上维护了Person对象的值,想要在构造函数中初始化它。因此,就需要用到ref属性了


    <bean id="person" class="Person"></bean> 

    <bean id="user" class="User" >

        <!--通过constructor这个节点来指定构造函数的参数类型、名称、第几个-->
        <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" name="username" type="java.lang.String" ref="person"></constructor-arg>
    </bean>

工厂静态方法创建对象

首先,使用一个工厂的静态方法返回一个对象


public class Factory {

    public static User getBean() {

        return new User();
    }

}

配置文件中使用工厂的静态方法返回对象


    <!--工厂静态方法创建对象,直接使用class指向静态类,指定静态方法就行了-->
    <bean id="user" class="Factory" factory-method="getBean" >

    </bean>

这里写图片描述


工厂非静态方法创建对象

首先,也是通过工厂的非非静态方法来得到一个对象


public class Factory {


    public User getBean() {

        return new User();
    }


}

配置文件中使用工厂的非静态方法返回对象


    <!--首先创建工厂对象-->
    <bean id="factory" class="Factory"/>

    <!--指定工厂对象和工厂方法-->
    <bean id="user" class="User" factory-bean="factory" factory-method="getBean"/>

这里写图片描述



<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
RAGFlow系列(06):从0.20.0版本升级到最新版的完整指南 本文提供了从RAGFlow 0.20.0版本升级到最新版的完整指南。升级前务必进行数据、配置和状态的三层备份,尤其是智能体配置因版本间存在不兼容风险。指南详细说明了如何优雅停止服务、拉取新代码、检查并调整配置文件(如端口、环境变量),以及最终部署验证的步骤,确保升级过程平滑安全。 阅读详情

相关推荐

PyCharm配置及使用Git教程

平时习惯在Windows下开发,但是我们又需要实时将远方仓库的代码clone到本地,也需要将自己修改的代码push到远端服务器。

酒酿小圆子呀~ 4万+

第四章:Spring七大核心模块Bean、Core、Context

容器模块(spring core)、应用上下文模块(spring context)、AOP模块(spring aop)、JDBC抽象和DAO模块(spring dao)、对象/关系映射集成模块(spring orm)、Web模块(spring web)、MVC模块(spring mvc)

beiback的博客 2758

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南

本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。

kubernetes8ctl的博客 230

SpringCore 完整学习教程1,入门级别

默认情况下,SpringApplication将任何命令行选项参数(即以——开头的参数,例如——server.port=9000)转换为属性,并将它们添加到Spring环境中。如果你需要构建一个ApplicationContext层次结构(具有父/子关系的多个上下文),或者如果你更喜欢使用“流畅”的构建器API,你可以使用SpringApplicationBuilder。应用程序的“活跃”状态告诉我们,它的内部状态是否允许它正常工作,或者如果当前出现故障,它是否可以自行恢复。

nanshaws的博客 598

深入理解梅尔刻度、梅尔滤波器组和梅尔时频谱图

读取一段音频,使用短时傅里叶变换,得到普通的时频谱图,然后绘制梅尔滤波器组,值得注意的是,librosa的梅尔滤波器组函数还带有权重归一化功能,即对一个三角形滤波器的每个权重,都除以该三角形的面积,如果不希望进行该归一化,设置参数。从公式可见,对数部分可以以自然对数为底数,也可以以10为底数,不同的底数对应不同的系数,要确定当前的系数,只需要代入(1000Hz, 1000mel)即可。其中,m是当前滤波器的序号,表征了当前的时间段,k是当前频率的序号,表征了当前正在对哪一频率的。

DEDSEC_Roger的博客 1万+

TPS563201DDCR电路翻车实录:从原理图到PCB,我踩过的5个坑及补救方法

本文详细记录了使用TPS563201DDCR电源芯片设计电路时遇到的5个常见问题及解决方案,包括EN引脚配置、BST电容选型、反馈网络设计、PCB布局优化以及散热处理。通过实际案例和数据分析,帮助工程师避免类似错误,提升电源模块的可靠性和效率。

weixin_42532938的博客 530

spring学习之路2 - spring-core

spring core下有6个包 asm 提供了web 的基本操作 lang 提供了java 语言不同版本兼容的功能. Objenesis 实例化对象的方式. util 提供了 compare, backoff, xml, concurrent, MimeType 的方式. cglib core 提供了基本核心模块IO/serial,codec,convert,env 等. Spring Core - 简书 1、基础设施工具类(spring框架基...

yiguang_820的博客 4246

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1136

Spring 的Core模块

回到首页☞ Core模块主要的功能是实现了反向控制IOC(Inversion of Control)与依赖注入DI(Dependency Injection)、Bean配置以及加载。Core模块中有Beans、BeanFactory、BeanDefinitions、ApplicationContext等几个重要概念。 Beans为Spring里的各种对象,一般要配置在Spring配置文件中:Bea...

JDIT的博客 2099

AI上推荐 之 协同过滤

㐇

Miracle8070 1万+

SAP ATP可用性检查简介

系统中建立此单时,SAP就会做一个所谓的检查,检查一下我们预先设定的考虑因素,能否满足客户的要求,什么时候可以满足,这就是可用性检查的功能。2、同样的在创建生产订单的时候也有ATP的检查,生产订单是100PC,要求2024-07-01生产完成,系统就会根据配置进行物料的可用性的检查,看物料是否能够满足生产同时能够满足交期。14: 表示相关预留的选项,与10的区别在于,10是一般是表示我们用MB21建立的,而14是表示由于相关预留,即此预留是来自于其他物料,如生产订单所产生的预留。

我小时候很黑的博客 3377

Spring——Core

Spring

weixin_39407955的博客 1182

激光除草技术原理与应用全解析

激光除草技术通过光热、光化学等效应精准破坏杂草组织,核心参数包括功率(20-6000W)、波长(400nm-10.6μm)和脉冲宽度。主要应用于大田作物(如玉米、棉花)、经济作物(烟草、果树)及城市绿化,具有环保(无化学污染)、高效(识别率≥95%)和非接触等优势,但存在设备成本高(20-50万元)、技术门槛高等局限。当前技术融合AI识别、多光谱协同等创新,国产设备如华工智耘已实现95.3%识别精度。虽短期投入较高,但长期可降低30%除草成本,并带来环境效益(每亩减排1.2吨CO₂)

start_up_go的博客 557

Spring入门案例【spring框架创建对象】(超详细)

Spring入门案例Spring框架概述Spring框架特点准备过程下载 spring-5.2.6.RELEASE-dist.zip下载 commons-logging-1.2-bin.zip把两个zip解压挑选核心基础的五个放到新创建的文件夹中创建一个新的Java项目创建lib文件夹,导入jar包添加依赖创建个User类在src下创建bean1.xml Spring框架概述 (1)Spring是轻量级的开源的JavaEE框架。 (2)Spring可以解决企业应用开发的复杂性。 (3)Spring框架主要由

『愚』的博客 4444

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring框架及七大模块

Spring框架及七大模块 Spring Core:框架的最基础部分,提供 IoC 容器,对 bean 进行管理。它主要的组件就是BeanFactory, 是工厂模式            的实现。同时BeanFactory适用控制反转(IOC)思想将应用程序的配置和依赖性规范与实际的应用            程序分开。 Spring Context:继承BeanFactory,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化等功能。 Spring DAO:提供了JDBC的

愚公移code的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring框架—Core模块

介绍 Spring框架是一个轻量级的javaEE框架,所谓轻量级就是不依赖于容器就可以运行的。Struts,Hibernate也是轻量级的。 轻量级也是相对于重量级框架而言的,重量级框架依赖于特定的容器,例如EJB框架就必须运行在JBoss等支持EJB的容器中。而不能运行在Tomcat中。 Spring框架 Spring是最广泛的轻量级javaEE框架之一,它以Ioc,AO...

super_优快云er的博客 2277

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring的Core模块

  Core模块主要的功能是实现了反向控制IOC(Inversion of Control)与依赖注入DI(Dependency Injection)、Bean配置以及加载。Core模块中有Beans、BeanFactory、BeanDefinitions、ApplicationContext等几个重要概念。   Beans为Spring里的各种对象,一般要配置在Spring配置文件中...

QQ40153258的博客 439

模拟Spring容器使用bean.xml创建对象的过程

正式使用spring之前先来体验一下spring的自动创建对象,让面向对象编程变成面向接口编程。思路:    在调用spring的bean.xml配置时,就已经自动创建Dao层和Service层的对象一、JAR包        因为是来体验spring的bean.xml,所以不需要连接数据库,那就只需要spring的四个核心包。        spring-beans、context、core、e...

FBDriftz的博客 729

Spring Core模块

说明Core模块主要的功能是实现了反向控制IoC(Inversion of Control)与依赖注入DI(Dependency Injection)、Bean配置以及加载。Core模块中有Beans、BeanFactory、BeanDefinitions、ApplicationContext等几个重要的概念实例化BeanFactory在Web程序中用户不需要实例化BeanFactory,Web程...

芸灵fly的博客 6270

spring bean和spring context和spring core的区别

我们在这里把xmlBeanfactory看作一个bean,再将xmlBeanFactory对bean的额外处理也看作一个简单的bean,beanFactory额外处理也和没处理一样看作一个bean,再将其他扩展功能也看一系列的bean的组成,所有的都看作bean,bean就是组件,spring-bean提供的是一个组件,主要是beanFactory,一个提供了创建组件的功能(,每个组件在自己的模块与其他组件协同作用)而上下文有,时间发布,消息,资源处理,以及beanFactory。

2303_76384306的博客 355

Spring 快速入门

Spring 快速入门 快速入门流程 下载Spring Jar包 1.1 直接在浏览器地址栏输入 https://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 下载某个版本 1.2 下载完成后解压,查看目录结构。 导入Spring核心开发Jar包到工程 2.1 下图是开发中需要用到的核心jar包 + 2.2 或者可以Maven引入 ``` <dependencies> &l

顾曲周郞的博客 202

Spring Core

Spring 是什么?为什么需要 Spring Core?Spring Core 在整个 Spring 生态中的地位核心模块结构简介(Beans、Context、Core、Expression)@Bean自动装配:基于注解的自动装配@Profile的使用场景工厂方法与静态工厂装配IoC 与 DI 的区别与联系@Autowired的原理与使用细节Bean 生命周期回调顺序问题如何解决循环依赖?三级缓存机制详解配置类推荐写法:可读性、可维护性、可扩展性项目中如何合理分层管理 Bean 定义。

2301_79902294的博客 1316

spring core,核心 ~ bean

spring core,核心 ~ bean

Java博客 981

Spring Bean 生命周期

一、Spring核心模块介绍 1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。 2.Spring Context: 构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N).

fox_bert的博客 4697
上一篇: Spring第一篇【介绍Spring、引入Spring、Spring六大模块】
下一篇: Spring第三篇【Core模块之对象依赖】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值