Spring入门之IOC(包含实例代码)

news2024/12/23 14:03:29

目录

  • 什么是Spring?
  • 什么是Spring IOC?
    • 如何创建一个Spring IOC项目?
      • 1. 导入Maven项目依赖
      • 2. 准备一个实体类(先定义接口再实现)
      • 3. 准备配置文件
      • 4. 在Test类中测试
    • IOC中的Bean管理
    • 实例化Bean的三种方式

什么是Spring?

框架相当于把原来servlet的工作分成了三层:表现层(接受和响应数据)服务层 | 业务层(分配任务、控制流程)持久层(与数据库交互)

ssm框架springmvc + spring + mybatis,多用于互联网项目
ssh框架springmvc + spring + hibernet,多用于事业单位项目

pic

  • spring的核心有IOC(控制反转)AOP(面向切面开发)DI(依赖注入)

什么是Spring IOC?

IOC又称为控制反转,指的是把对象的创建权力交给spring框架,底层实际上是使用反射实现的,用来降低程序的耦合度。

如何创建一个Spring IOC项目?

1. 导入Maven项目依赖

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2. 准备一个实体类(先定义接口再实现)

package com.qcby.service;

public interface UserService {
    public void hello();
}
package com.qcby.service.impl;

import com.qcby.service.UserService;

public class UserServiceImpl implements UserService {
    public void hello() {
        System.out.println("业务层:你好!");
    }

}

3. 准备配置文件

  • 实例化Bean的三种方式(示例代码以第一种方式为例,全部实现方式见文章最后
    1. 默认为无参数的构造方法:<bean id = "us" class="实体类的路径(包含到类名)"></bean>
    2. 静态工厂实例化方式:<bean id = "us" class="静态工厂类路径(包含到类名)" factory-method="实例化方法"/>
    3. 实例化工厂实例化方式,生成一个对象交给IOC:<bean id = "dFactory" class="实例化工厂类路径(包含到类名)"/><bean id = "us" factory-bean="工厂名" factory-method="实例化方法"/>
<?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">

    <bean id = "us" class="com.qcby.service.impl.UserServiceImpl"/>
</beans>

4. 在Test类中测试

  • ApplicationContext接口是个工厂接口,使用该接口可以获取到具体的Bean对象,该接口下有两个具体的实现类:
    • ClassPathXmlApplicationContext:加载类路径下的spring配置文件(常用)
    • FillSystemXmlApplicationContext:加载本地磁盘下的spring配置文件(让配置文件与项目分离管理)
import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest {

    //传统创建对象
    @Test
    public void run1() {
        UserService userService = new UserServiceImpl();
        userService.hello();
    }

    //spring ioc创建对象 ioc是一个map key是对象的标识 value是ioc创建的对象
    @Test
    public void run2() {
        // 创建spring ioc工厂,加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 获取bean对象 (底层通过反射来获取到对象)
        UserService userService = (UserService)ac.getBean("us");
        // 调用方法
        userService.hello();
        System.out.println(userService);
    }
}

IOC中的Bean管理

<bean id = "us" class="com.qcby.service.impl.UserServiceImpl"/>

属性解释
id属性给bean起个名字,具有唯一性。取值要求:字母开头,可以用字母、数字、连字符、下划线
class属性bean对象的全路径(包名+类名)
scope属性表示bean对象的作用范围
singleton单例(默认)最常用的方式,生命周期和配置文件一样(配置文件加载出来后就会创建实例)
prototype多例,不是加载配置文件的时候创建实例,获取实例时才创建
request多例,不常用,应用于web项目中,每次http请求时创建一个新的实例
session多例,不常用,应用于web项目中,同一个http session共享一个实例
init-method属性bean对象创建时可以配置一个指定方法并自动调用(通过反射获取到的)
destroy-method属性bean对象销毁时可以配置一个指定方法并自动调用

实例化Bean的三种方式

  1. 默认为无参构造方法
    <bean id="us" class="实体类的路径"></bean>
  1. 静态工厂实例化方法(可以自己编写业务逻辑)
package com.qcby.util;

import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;

public class StaticFactory {
    public static UserService createUs() {
        System.out.println("通过静态工厂的方式~");
        //编写业务逻辑
        //。。。
        return new UserServiceImpl();
    }
}
	<bean id = "us" class="com.qcby.util.StaticFactory" factory-method="createUs"/>
  1. 实例化工厂实例化方式(可以自己编写业务逻辑)生成一个对象交给ioc
package com.qcby.util;

import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;

public class DFactory {
    public UserService createUs() {
        System.out.println("通过实例化工厂的方式~");
        //编写业务逻辑
        //。。。
        return new UserServiceImpl();
    }
}
	<bean id = "dFactory" class="com.qcby.util.DFactory"/>
    <bean id = "us" factory-bean="dFactory" factory-method="createUs"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信中如何搜索附近的人

我们 微信 下面选择 发现 然后 点卷 附件 进入后 头上的页签 切换成 附件的人 在列表中点击后即可添加附件的人啦

鸿蒙启动框架配置文件(StartUpTask)

{"startupTasks": [//有哪些任务{"name": "StartupTask_001",//任务名字"srcEntry": "./ets/startup/StartupTask_001.ets",//任务的文件路径"runOnThread": "taskpool",//运行在哪个现成&#xff0c;有…

泰克TDP1000差分探头Tektronix TDP0500参数资料

泰克Tektronix TDP0500 TDP1000 高压差分探头 ​Tektronix TDP1000 高压差分探头是一款多功能且易于使用的探头&#xff0c;可提供开关电源、CAN/LIN 总线和高速数字系统设计所需的高速电气和机械性能。Tektronix TDP1000 探头专为与 TekVPI 探头接口或 TekProbe BNC 接口配…

Java:路径计算与障碍物处理

Java 实现寻找字符串数组中的最长公共前缀及不同路径数量计算&#xff08;含障碍物&#xff09; 在计算机科学和软件开发中&#xff0c;经常需要解决一些基本但实用的问题。本文将介绍两种常见问题的解决方案&#xff1a;一是从一组字符串中找出最长公共前缀&#xff1b;二是计…

能力驱动的企业战略转型:基于能力规划的战略转型与数字化实践全指南

在当今数字化和全球化加速发展的时代&#xff0c;企业面临着复杂的市场环境和迅速变化的客户需求。为了在竞争中脱颖而出&#xff0c;企业必须不仅制定卓越的战略&#xff0c;还需确保这些战略能够有效地转化为实际行动。基于能力规划&#xff08;Capability-Based Planning, C…

Lua 代码编码规范

lua代码格式 vscode stylua 插件 配置文件stylua.toml column_width 240 line_endings “Unix” indent_type “Spaces” --使用空格 很重要&#xff0c;保证不同编辑器打开是一样的 indent_width 4 quote_style “AutoPreferDouble” --字符串引号样式双引号 call_paren…

海康二次开发学习笔记9-通讯触发及模块列表获取

通讯触发及模块列表获取 模块列表获取 获取流程中所有模块的模块名,添加下拉框用于显示模块名 1. 处理Combox2的DropDown事件 /// <summary>/// 模块列表获取/// </summary>/// <param name"sender"></param>/// <param name"e&q…

MCU官方IDE软件安装及学习教程集合 — STM32CubeIDE(STM32)

简介 各MCU厂商为保证产品的市场地位以及用户体验&#xff0c;不断的完善自己的产品配套&#xff0c;搭建自己的开发生态&#xff0c;像国外ST公司&#xff0c;国内的GD&#xff08;兆易创新&#xff09;&#xff0c;AT&#xff08;雅特力&#xff09;等等。目前就开发生态而言…

测试.net core服务项目调用dotNetify-Pulse监控性能的基本用法

微信公众号“DotNet讲堂”的文章《开源 .NET API 实时监控项目》介绍了开源实时日志及性能监控项目dotNetify-Pulse&#xff0c;在项目中引用简单&#xff0c;既能用其自带的监控页面&#xff0c;也支持按需配置监控页面。本文在之前创建的环境检测项目中添加并测试dotNetify-P…

逆向工程核心原理 Chapter20 | “内嵌补丁”练习

前言 自己学《逆向工程核心原理》一书的记录&#xff0c;只记录自己觉得重要/有用的一些点。 知识点学习 很实用的一个逆向技术。 原理&#xff1a; “壳”的逻辑也是这样的。EP处先解密OEP代码&#xff0c;再跳转到洞穴代码&#xff0c;恢复IAT之类的&#xff0c;然后跳回…

免费分享-MATLAB代码融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型 通过融合正余弦和柯西变异改进麻雀搜索算法&#xff0c;对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化 预测效果图如下 代码如下&#xff1a; %% 清空环境变量 wa…

Vue(七) TodoList案例1.0

文章目录 组件化编码流程(通用)1. 拆分静态组件2. 初始化列表展示动态数据如何让一个标签动态的拥有某一个属性 3. 按回车添加todo子组件给父组件传值之props 4. 勾选与取消勾选一个Todo5. 删除6. footer底部统计7. footer底部交互7.1 全选框自动打勾7.2 全选框取消勾选 8. 清除…

【java】vscode配置javaweb开发环境

下载jdk https://www.oracle.com/java/technologies/downloads/?er221886下载完毕直接安装&#xff0c;安装完毕自动添加以下环境变量 在cmd中运行 java -version出现以下代表成功 再添加系统变量 下载Maven https://maven.apache.org/download.cgi下载完解压放到自己方…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客&#xff0c;即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中&#xff0c;本小白试图模仿神级人物Gilles Castel&#xff0c;打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说&#xff0c;东施效颦了。虽不至于一无所得&#xff0c;但也仅仅算…

STM32通过ADM3222完成UART转232通信电平转换

1、简介 单片机默认串口输出电平是UART信号,但是在实际项目中经常需要将其转换成232电平,此时就需要ADM3222芯片来完成电平的转换,下面对使用过程进行总结。 2、硬件电路 从上图中可以看到芯片需要对1、18进行配置才能进行工作,通过查阅手册可知,1引脚需要配置低电平,…

生物信息学:DNA序列的构成

DNA序列是由一串字母表示的真实的或者假设的携带基因信息的DNA分子的一级结构。‌ DNA序列的构成基于四种特定的碱基&#xff0c;分别是腺嘌呤&#xff08;A&#xff09;、胸腺嘧啶&#xff08;T&#xff09;、鸟嘌呤&#xff08;G&#xff09;和胞嘧啶&#xff08;C&#xff…

【机器学习】K近邻(K-Nearest Neighbors,简称KNN)的基本概念以及消极方法和积极方法的区别

引言 K近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法是一种基础的机器学习方法&#xff0c;属于监督学习范畴 文章目录 引言一、K近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;1.1 原理详述1.1.1 距离度量1.1.2 选择k值1.1.…

django网吧收费管理系统 项目源码26819

摘 要 随着互联网的普及&#xff0c;网吧作为公共互联网接入场所&#xff0c;依旧在许多地区发挥着重要作用。现代网吧不仅仅是提供上网服务的场所&#xff0c;还包括了游戏、社交、休闲等多功能体验。为了提高网吧的服务质量和运营效率&#xff0c;迫切需要一个高效的管理系统…

采集工具选型调研

原文阅读&#xff1a;【巨人肩膀社区博客分享】采集工具选型调研 大家一起来探讨SeaTunnel方案&#xff0c;简化当前Dinky与chunjun的双轨模式&#xff08;Dinky仅用于实时同步&#xff0c;chunjun负责离线处理&#xff09;。提议小组一起共议&#xff0c;并由大数据组构建dem…

大模型battle,哪家才是真的“价美”也“物美”

大模型battle&#xff0c;哪家才是真的“价美”也“物美” 物美价廉何为物美价廉大模型battle基础能力测试&#xff1a;专业能力测试&#xff1a;中文特性能力测试&#xff1a;逻辑推理能力测试&#xff1a;创新能力测试&#xff1a;安全性与合规性测试&#xff1a;写在最后 近…