Spring框架IOC

目录

一、Spring框架的介绍

1.1 Spring框架的概述

1.2 Spring框架的优点

 二、Spring的核心 IOC技术

2.1 什么是IOC

2.2 IOC的程序入门

2.3 IOC技术总结

2.4 Spring框架的Bean管理的配置文件方式 


一、Spring框架的介绍

1.1 Spring框架的概述

Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring的核心是控制反转(IoC控制反转)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

1.2 Spring框架的优点

1.方便解耦,简化开发,Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理。(IOC的作用)

2.AOP编程的支持,Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。可扩展性

3.声明式事务的支持,只需要通过配置就可以完成对事务的管理,而无需手动编程。

4.方便程序的测试,Spring对Junit4支持,可以通过注解方便的测试Spring程序。

5.方便集成各种优秀框架,Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts2、Hibernate、MyBatis、Quartz等)的直接支持。

6.降低JavaEE API的使用难度,Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

 二、Spring的核心 IOC技术

2.1 什么是IOC

IOC -- Inverse of Control,控制反转,将对象的创建权力反转给Spring框架!!

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

解决问题:使用IOC可以解决的程序耦合性高的问题!!Spring的工厂读取配置文件。

2.2 IOC的程序入门

项目中的目录结构:

controller(表现层):

controller层的功能为请求和响应控制
controller层负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返回具体的页面和数据到客户端

dao(持久层):也被称为mapper层

dao层的作用为访问数据库,向数据库发送sql语句,完成数据的增删改查任务

pojo(数据库实体类):也被称为entity层,model层

一般数据库一张表对应一个实体类,类属性同表字段一一对应

service(业务层):
service层的作用为完成功能设计
service层调用dao层接口,接收dao层返回的数据,完成项目的基本功能设计

utils(工具类):

存放了一些公共部分的工具类,主要是用于减少项目开发中的重复代码

步骤:

① 创建普通maven Java工程不需要界面所以不用创建web项目,需要导入spring依赖,所以创建普通maven Java项目即可,导入坐标依赖

    <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>

② 编写接口和实现类,编写具体的实现方法

package com.qcby.service;

/**
 * 业务层接口
 * 用户模块接口
 * 目的:演示springIOC入门
 */
public interface UserService {
    //接口中的抽象方法
    public void hello();
}
package com.qcby.service.impl;

import com.qcby.service.UserService;

/**
 * 用户模块实现类实现用户模块接口
 * 实现其抽象方法
 * 耦合度低
 */
public class UserServiceImpl implements UserService {
    //实现入门
    @Override
    public void hello() {
        System.out.println("Hello IOC!!");
    }
    
}

③ 编写Spring核心的配置文件,在 src/main/resources 目录下创建 applicationContext.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.xsd">

        <!--IOC管理bean-->
        <!--bean的意义是将该类的创建对象权力转给spring框架-->
        <bean id="userService" class="com.qcby.service.impl.UserServiceImpl" />

</beans>

④ 把log4j.properties的配置文件拷贝到 src/main/resources 目录下,做为 log4j 的日志配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n"/>
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

⑤ 编写测试方法

package com.qcby.demo;

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;

/**
 * 测试类
 * 测试UserService交给spring管理
 * IOC入门
 */
public class UserServiceTest {
    @Test
    public void run1(){
        UserService userService = new UserServiceImpl();
        UserService userService1 = new UserServiceImpl();
        userService.hello();
        userService1.hello();
        System.out.println(userService);
        System.out.println(userService1);
    }

    @Test
    public void run2(){
        // 使用Spring的工厂
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 通过工厂获得类:
        UserService userService = (UserService) applicationContext.getBean("userService");
        UserService userService1 = (UserService) applicationContext.getBean("userService");
        userService.hello();
        userService1.hello();
        System.out.println(userService);
        System.out.println(userService1);
    }
}

运行 run1() 方法,可以看到,使用new方法直接创建对象是创建了两个不同的对象,这种做法在某些情况下可能会导致资源浪费,所以我们选择 run2() 的方法进行创建对象

运行 run2() 方法,可以看到,虽然创建了两个对象,但他们两个是单例,是相同的,只创建了一个对象,可以对之前创建的对象进行重复使用(使用这种方法也可以选择多例进行创建,默认是单例,可以在bean中进行属性设置也可以达成 run1() 中效果)

2.3 IOC技术总结

ApplicationContext接口,工厂的接口,使用该接口可以获取到具体的Bean对象。

该接口下有两个具体的实现类:

ClassPathXmlApplicationContext,加载类路径下的Spring配置文件,使用方法如下:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

FileSystemXmlApplicationContext,加载本地磁盘下的Spring配置文件,使用方法如下:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\Users\\ZSW\\Desktop\\idea\\SpringIOC\\src\\main\\resources\\applicationContext.xml");

推荐使用ClassPathXmlApplicationContext,因为第二种写的是本地磁盘下的绝对路径,在真正开发项目时不易修改使用

2.4 Spring框架的Bean管理的配置文件方式 

id属性,自己对Bean起的名字,在约束中采用ID的约束,唯一,取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符

class属性,Bean对象的全路径

scope属性,scope属性代表Bean的作用范围

        singleton单例(默认值),最常用的方式

        prototype多例

Bean对象的创建和销毁的两个属性配置:

说明:Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法

init-method,当bean被载入到容器的时候调用init-method属性指定的方法

destroy-method,当bean从容器中删除的时候调用destroy-method属性指定的方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跨站脚本攻击的多种方式——以XSS-Labs为例二十关详解解题思路

一、XSS-Labs靶场环境搭建 1.1、XSS介绍 跨站脚本攻击&#xff08;XSS&#xff09;_跨站脚本测试-CSDN博客https://coffeemilk.blog.csdn.net/article/details/142266454 1.2、XSS-Labs XSS-Labs是一个学习XSS攻击手法的靶场&#xff0c;方便我们系统性的学习掌握跨站脚本攻击…

使用C语言编写UDP循环接收并打印消息的程序

使用C语言编写UDP循环接收并打印消息的程序 前提条件程序概述伪代码C语言实现编译和运行C改进之自由设定端口注意事项在本文中,我们将展示如何使用C语言编写一个简单的UDP服务器程序,该程序将循环接收来自指定端口的UDP消息,并将接收到的消息打印到控制台。我们将使用POSIX套…

html中实用标签dl dt dd(有些小众的标签 但是很好用)

背景描述 html <dl> <dt> <dd>是一组合标签&#xff0c;他们与ol li、ul li标签很相似 但是他却是没有默认前缀并且有缩进的标签 使用方式与table表格的标签一致 使用方式 dt和dd是放于dl标签内&#xff0c;dt与dd处于dl下相同级。就是dt不能放入dd内&am…

vue2实现word在线预览

实现附件在线预览是一个很常用的功能&#xff0c;这次正好碰到这样的需求&#xff0c;记录一下自己实现的过程。 首先是插件的选择&#xff0c;网上实现预览的方法主要有两种&#xff0c;一个是vue-office插件&#xff0c;另一个是docx-preivew插件。看网上其他网友的教程都能…

linux-----常用指令

文件和目录操作指令 ls&#xff08;list&#xff09;指令 功能&#xff1a;用于列出目录的内容&#xff0c;包括文件和子目录。示例&#xff1a; ls&#xff1a;列出当前目录下的所有非隐藏文件和目录。例如&#xff0c;在一个包含文件file1.txt、file2.txt和目录dir1的目录中&…

时间管理系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

第2节-Test Case如何调用Object Repository中的请求并关联参数

前提&#xff1a; 已经创建好了project&#xff08;File -> New -> Project&#xff0c;Type&#xff1a;API/WebService&#xff09;&#xff0c;object repository中已经创建了RESTful endpoint&#xff08;Object Repository -> New -> Web Service Request&am…

<论文>初代GPT长什么样?

一、摘要 今天我们聊一下论文《Improving Language Understanding by Generative Pre-Training》以及它所提出来的预训练模型——GPT1。我们知道Bert在出道那会儿红极一时&#xff0c;但实际上GPT1比Bert还要早几个月就出道了&#xff0c;而且同样刷新了当时的多个任务记录。GP…

研发效能DevOps: Vite 使用 Element Plus

目录 一、实验 1.环境 2.初始化前端项目 3.安装 vue-route 4.安装 pinia 5.安装 axios 6.安装 Element Plus 7.gitee创建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、问题 1.README.md 文档推送到gitee未自动换行 2.访问login页面显示空白 3.表单输入账户…

动态规划练习四(子序列子数组问题)

一、解决思路 与之前的dp问题相比&#xff0c;给我三个最大的不同感受是&#xff1a; 1、考虑能否自成一组&#xff0c;毕竟一个也是子序列&#xff0c;子数组。所以在很多的dp表填写中需要考虑只有一个的情况。 2、由于子数组子序列是连续的&#xff0c;所以有一些题可以利…

【工具变量】中国数字经济发展水平面板数据DID(2012-2022)

数据来源&#xff1a;《中国统计年鉴》、国家统计局 时间跨度&#xff1a;2012-2022年 数据范围&#xff1a;中国各省 包含指标&#xff1a; 1. 地区 2. id 3. 年份 4. 互联网域名数 5. 互联网接入端口数 6. 互联网宽带接入用户数 7. 移动基站密度 8. 移动电…

一文速通 IIC I2C子系统驱动 通信协议原理 硬件 时序 深度剖析

本文作为一个引入&#xff0c;作用是让读者理解熟知IIC协议关键内容&#xff0c;结合实际手册内容&#xff0c;深度解析协议本质&#xff0c;作为后续嵌入式linux驱动IIC子系统的一个铺垫。 目录 1. 硬件连接 2. IIC传输时序 2.1.写操作 2.2.读操作 2.3.I2C信号 3.IIC协议…

Go语言启动独立进程

文章目录 问题解决方案1. **将 npc.exe 启动为独立的进程**2. **修改 exec.Command 函数**示例代码解释为什么这样有效注意 问题 在你当前的代码中&#xff0c;调用 exec.Command("XXX.exe") 启动 XXX.exe 程序时&#xff0c;这个程序是由 Go 程序直接启动的。如果 …

【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)

一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑&#xff0c;一个是外部特性&#xff0c;一个是内部特性。外部特性就是把电感视为一个黑盒子&#xff0c;带有两个端子&#xff0c;如果带有抽头的电感就有三个端子&#xff0c;需要去考虑其电感值、Q值和自…

Everything实现,快速搜索文件

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 翻阅了很多博客, 结果大致如下: 1.分析比较肤浅, 采用USN日志枚举来获取文件记录 速度一言难尽, 因为日志枚举的是全盘所有文件的所有日志, 记录比文件记录还多, 速度当然很慢, 还有的甚至于是 使用 DeviceIoControl 函数…

【完美解决】windows打开cmd窗口的时候闪退解决办法

本章教程&#xff0c;主要记录&#xff0c;windows中打开cmd的时候&#xff0c;闪退问题。产生问题的原因&#xff0c;电脑上之前安装了anaconda&#xff0c;卸载之后&#xff0c;就发现cmd无法正常打开&#xff0c;一执行不会弹出窗口。 解决办法 一、打开注册表 regedit二、…

乐凡信息智能安全管控方案:助力油气田行业安全管控多方位升级

我国油田地域广阔&#xff0c;分布着大量各种油井&#xff0c;油井开采设备的连续稳定运行是保证石油开采的首要条件。然而&#xff0c;由于油田多位于特殊地理环境中&#xff0c;因而实现油井之间的通信首要问题就是要克服地理环境所带来的限制&#xff0c;传统通信系统的建设…

2024年企业中生成式 AI 的现状报告

从试点到生产&#xff0c;企业 AI 格局正在被实时改写。我们对 600 名美国企业 IT 决策者进行了调查&#xff0c;以揭示新兴的赢家和输家。 从试点到生产 2024 年标志着生成性人工智能成为企业关键任务的一年。这些数字讲述了一个戏剧性的故事&#xff1a;今年人工智能支出飙升…

L24.【LeetCode笔记】 杨辉三角

目录 1.题目 2.分析 模拟二维数组的大致思想 杨辉三角的特点 二维数组的元素设置代码 两个参数returnSize和returnColumnSizes 理解"有效"的含义 完整代码 提交结果 1.题目 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉…

“从零到一:揭秘操作系统的奇妙世界”【操作系统中断和异常】

一开始看王道网课&#xff0c;它说内中断就是异常。但是我一查ai&#xff0c;它又说内中断和异常不能等同&#xff0c;是两个概念&#xff0c;这时候我觉得天都塌了。内中断到底是不是异常啊&#xff1f; 我心想我今天一定要把这个搞懂&#xff0c;我来交作业了&#xff01;我…