Spring从精通到入门

news2024/12/29 11:05:28

Spring

    • 1.spring了解
    • 2. Spring实现
      • 2.1 添加依赖
      • 2.2 Spring实现
        • 2.2.1 xml配置实现
          • 2.2.1.1 Bean标签属性

1.spring了解

  1. spring重要性
    在当前的系统中,spring的重要性and占比性高达50%,无论是在ssm、ssh等框架中,spring始终屹立在前方,所以对于一个程序员来说,spring技术是每一个程序员必备的技术。好了,那我们就开始学习spring了吧~
    ···········
    在java程序中创建对象是必然的,只要需要对象就会去创建一个对象,但是呢创建后就没有销毁等操作了,这就意味着对象和内存就得不到更好的管理,虽然有垃圾回收机制,但是至于什么时候回收这也是jvm的事情,所以也不好判断,为了解决对象和内存的问题,spring就来的刚刚好。

  2. Spring概念
    spring可以看作是一个容器,容器里面装了很多的对象(bean)并且维护起来,要使用对象的时候,直接在容器里面取就可以了

  3. Spring作用
    Spring最主要的作用就是管理的对象的完整生命周期(对象的创建、使用、销毁等)包括对象之间的依赖关系给,spring都可以去管理

2. Spring实现

2.1 添加依赖

在maven项目中,要使用某一个框架呀啥的都是需要去导入对应的jar包的
依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.18</version>
</dependency>

2.2 Spring实现

2.2.1 xml配置实现

当然哈,在使用配置文件进行操作的时候,实体类吖、dao层啊、service层的代码的连接自己要写好哟,spring的实现都是在这些基础上的哈。
在这里插入图片描述

  1. xml配置文件:
    第一种实现方式xml配置实现,既然是用xml配置文件实现,那就要去配置一下spring的xml文件了,在spring中的xml配置文件一般是用ApplicationContext.xml来命名存放的(记得是放在resource里面哟~)
<?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">
         <!--先放在这里,先去完成controller、serviceImpl里面的对象创建再来填补这里代码-->  

注意:每一个xml配置文件,包括mybatis的config.xml吖、mapper.xml啊这些的xml文件,都会是有一个头的,这个头相当于就是告诉我们的编译器,这个xml文件是一个什么类型的xml文件

  1. 改变对象的创建方式
    以前使用方式:创建PetController的对象去调用service对象,service对象再去调用dao对象去完成,但是这样的话就很不方便,每一次要用对象的时候都要去new一个来用
    private PetService petService = new PetServiceImpl();
    spring方法:将对象都真装在容器里面,这样的话每一次要用直接调用set方法就行。这样的话不管什么时候想用都可以,所以就将controller和serviceImpl中的对象创建方式换一下:
    在这里插入图片描述
  2. 配置xml完整
    所有类都创建好后,就可以通过去配置xml文件,去反射出相应的对象,然后又因为ref的连接,所有对象又可以按照controller调用service调用dao去连接有了关系
<?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),每一个bean就是每一个对象,根据id去判断具体是那个类、接口的对象,然后通过反射就会去创建对应id的对象-->
    <bean id="petDao" class="com.xiaowang.dao.impl.PetDaoImpl">
<!--        获取dao层的对象,完成对数据库信息的管理-->
    </bean>
    
    <bean id="petService" class="com.xiaowang.service.impl.PetServiceImpl">
<!--        获取service层的对象,去调用dao层内对象,所以需要去与dao层进行关联-->
<!--        property标签内的name就是跟对象创建set的方法后面的方法名,也就是方法名去掉set的部分,
            比如:setPetDao——>petDao   setPetService——>petService
            然后ref里面的就是要连接容器中对象的id,-->
        <property name="petDao" ref="petDao"/>
    </bean>
    
    <bean id="petController" class="com.xiaowang.controller.PetController">
        <property name="petService" ref="petService"/>
    </bean>
    
<!--    相当于现在就在容器中放了三个对象了,三个对象的关系也由ref给连接起来了-->
    
</beans>
  1. 测试spring的代码
package com.xiaowang;

import static org.junit.Assert.assertTrue;

import com.xiaowang.controller.PetController;
import com.xiaowang.entity.Pet;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Unit test for simple App.
 */
public class AppTest 
{
    /**
     * Rigorous Test :-)
     */
    @Test
    public void shouldAnswerWithTrue()
    {
        //创建容器对象,容器就是刚刚配置的xml文件
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        //从容器中获取对象
        //getBean里面的name就是xml文件里面controller的id,根据这个id和后面的类类型,这样就可以拿到容器里面对应的对象
        PetController petController = classPathXmlApplicationContext.getBean("petController", PetController.class);
        //因为在xml配置文件中,controller、service、dao的对象关系已经连接了,所以也不用自己去实例化了
        Pet xiaowang = petController.add("xiaowang", "123456");
        System.out.println(xiaowang);
    }
}

结果:
在这里插入图片描述

2.2.1.1 Bean标签属性
id 表示bean在容器中的唯一标识 一般是类名首字母小写 如果没有写 默认值为 全路径#第几个  com.zlt.controller.UserController#0
        class 类的全路径
        init-method 初始化方法 对象创建后会被调用一次
        destroy-method 销毁方法 容器销毁之前会被调用一次
        scope="singleton" 作用范围
            singleton 单例模式 默认值 
            prototype 工厂模式 设置为工厂模式的时候销毁方法不会执行
            如果是在web项目中 request 请求作用域 session 会话作用域 globalSession 全局作用域
        autowire 自动装配
            byType 默认从容器中寻找对应的类型的bean注入进去  如果匹配到多个就会不知道注入谁进去
            byName 根据id和属性名进行自动注入
            constructor 通过构造来进行注入
            no 和 default 都相当于不自动注入
        lazy-init 懒加载 设置为true的时候容器创建时不会去初始化对象 默认false

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

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

相关文章

Postman创建Elasticsearch(2.4版本)索引

一、创建索引二、删除索引三、其他1、查看es信息2、查看索引test信息3、test索引下mapping查看4、elasticsearch 2.2.1下载一、创建索引 1、请求方式&#xff1a;PUT2、请求地址&#xff1a;地址 索引名3、请求数据 {"settings": {"number_of_shards": …

C语言offsetof(TYPE, MEMBER)全解

offsetof(TYPE, MEMBER) 是一个宏定义&#xff0c;用于计算一个结构体中某个成员的偏移量。 其第一个参数 TYPE 是一个结构体类型&#xff0c;第二个参数 MEMBER 是 TYPE 中的一个成员变量名。 它将返回类型为 size_t 的整数&#xff0c;表示 MEMBER 相对于 TYPE 起始地址的偏…

inode和逻辑块,目录的结构,挂载的实现 源码级分析linux内核的文件系统的结构

bitmap.c 位图相关 封装了set_bit clear_bit find_first_zero clear_block等操作位图的宏 对应i节点位图和逻辑块位图有对应的四个函数 free_inode, new_inode,free_block, new_block new_block 创建逻辑块 通过super_block找到逻辑块位图&#xff0c;给逻辑块位图的第一个…

Spring Boot中的bean注入方式和原理

Spring Boot是一个非常流行的Java框架&#xff0c;它可以帮助开发者快速地构建高效、健壮的应用程序。依赖注入是Spring Boo其中一个重要的功能&#xff0c;就是将一个对象注入到另一个对象中&#xff0c;以便它们可以相互协作。在Spring Boot中&#xff0c;依赖注入是通过bean…

Python如何获取大量电影影评,做可视化演示

前言 《保你平安》今天上映诶&#xff0c;有朋友看过吗&#xff0c;咋样啊 这是我最近比较想看的电影了&#xff0c;不过不知道这影评怎么样&#xff0c;上周末的点映应该是有蛮多人看的吧&#xff0c;可以采集采集评论看过的朋友发出来的评论&#xff0c;分析分析 这周刚好…

2023年斋月倒计时,跨境卖家该如何做好选品和营销?

2023年斋月即将到来&#xff0c;这是一个伊斯兰教徒们非常重要的节日&#xff0c;同时也是跨境卖家们迎接销售高峰的时期。在2023年的斋月期间&#xff0c;跨境卖家应该如何做好选品和营销呢&#xff1f;本文Nox聚星将和大家好好聊一聊。 根据2022年的数据&#xff0c;斋月期间…

【巨人的肩膀】MySQL面试总结(一)

&#x1f4aa; 目录&#x1f4aa;1、什么是ER图2、数据库范式了解吗3、超键、候选键、主键、外键分别是什么&#xff1f;4、为什么不推荐使用外键与级联5、什么是存储过程6、drop、delete与truncate区别7、数据库设计通常分为那几步8、什么是关系型数据库9、什么是SQL10、MySQL…

SpringBoot整合Redis实现高并发数据缓存

目录什么是缓存为什么要用缓存Redis为什么这么快实现一个用户信息的缓存方式一&#xff1a;利用RedisTemplate实现导入依赖添加配置添加redis工具类及配置类开发mapper接口service层controller层测试方式二&#xff1a;采用SpringBoot注解开启缓存在启动类添加EnableCaching注解…

旋转框目标检测mmrotate v1.0.0rc1 之RTMDet训练DOTA的官方问题解析整理(四)

关于rotated_rtmdet_l-coco_pretrain-3x-dota_ms.py配置文件的batchsize和学习率设置问题&#xff1a;回答&#xff1a;如何在mmrotate中绘制特征图问题&#xff1a;回答&#xff1a;你好AllieLan&#xff0c;您可以尝试使用https://github.com/open-mmlab/mmyolo/blob/main/de…

Java Class 加密工具 ClassFinal

Jar包加密工具 ClassFinal介绍环境依赖使用说明下载加密命令行示例maven插件方式无密码模式机器绑定启动加密后的jar启动参数给密码不加密码参数直接启动1. 密码文件获取2. 交互输入参考资料介绍 ClassFinal 是一款 java class 文件安全加密工具&#xff0c;支持直接加密jar包…

KDHL-600A 回路电阻测试仪

一、产品概述 武汉凯迪正大KDHL-600A回路电阻测试仪是用于测量开关、断路器、变压器等设备的接触电阻、回路电阻的专用测试设备。其采用典型的四线制测量法&#xff0c;通过输出一个直流电流&#xff0c;施加于被测体的两个端钮之间&#xff0c;并测量电流流过被测体所产生的压…

Node.js简介

客户端访问网页时向服务器端发送请求要访问服务器中的页面&#xff0c;服务器收到请求后向数据库中进行搜索&#xff0c;搜索到相关数据然后返回结果给客户端显示&#xff1b; 这个过程就类似于&#xff1a;客人&#xff08;客户端&#xff09;去饭馆&#xff08;服务端&#…

TryHackMe-VulnNet: Active(ez 域渗透)

VulnNet: Active VulnNet Entertainment在他们以前的网络中遇到了不好的时光&#xff0c;该网络遭受了多次破坏。现在&#xff0c;他们移动了整个基础架构&#xff0c;并再次聘请您作为核心渗透测试人员。您的目标是获得对系统的完全访问权限并破坏域。 这应该是我在thm打的最…

Uipath Excel 自动化系列15-Protect Sheet(保护工作表)

活动描述 Protect Sheet(保护工作表):在 Excel 中启用对指定工作表的保护&#xff0c;以便无法对其进行任何其他更改,该活动需与Use Excel File 活动选择的 Excel 文件一起使用。 提示&#xff1a;Protect Sheet活动功能类似Excel文件【审阅】菜单栏下的保护工作簿功能&#…

TencentOS Server 安装 PostgreSQL

TencentOS 简介 2019 年&#xff0c;随着腾讯公司外部客户的需求&#xff0c;以及公司开源协同战略的推进&#xff0c;tlinux 对外开源并进行了品牌升级&#xff0c;升级为 TencentOS Server。TencentOS 包含三大场景&#xff0c;分别如下&#xff1a; TencentOS Server&…

MySQL DQL语句基础(一)

目录 DQL 基本语法 基础查询 1、查询多个字段 2、字段设置别名 3、去除重复记录 条件查询 语法 条件 案例 聚合函数 常见的聚合函数 语法 DQL DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 基…

java面试-jvm

JVM JVM 是 java 虚拟机&#xff0c;简单来说就是能执行标准 java 字节码的虚拟计算机 JVM 是如何工作的 首先程序在执行之前先要把 Java 代码&#xff08;.java&#xff09;转换成字节码&#xff08;.class&#xff09;&#xff0c;JVM 通过类加载器&#xff08;ClassLoade…

Linux:创建守护进程,注册信号捕获回调函数,使用shell脚本代码管理守护进程

1.创建守护进程&#xff0c;编译时命名为a.out. 2.在守护进程中注册信号捕捉函数。 3.使用脚本发送自定义信号SIGUSR1给进程a.out。 4.守护进程捕获函数catchSignal&#xff08;&#xff09;捕捉到10号函数SIGUSR1退出进程。 创建守护进程代码&#xff1a; #include <stdi…

第八批国家药品集中采购-(附药品集采目录明细下载)

2023年3月2日&#xff0c;‘国家组织药品联合采购办公室’发出了《全国药品集中采购文件》&#xff0c;宣告了第八批国家组织药品集中采购工作正式开展&#xff0c;其公告中还包含三个附表分别为‘采购品种目录’、‘各地区首年约定采购量’、‘各采购品种首年约定采购量’&…

python for循环中 if else语句缩进对应问题

python for循环中 if else语句缩进对应问题 忙里偷闲&#xff0c;备考计算机二级&#xff0c;发现一个好玩的小知识&#xff0c;想分享一下自己当时的思考以及解决问题的过程 也许点进来的你会莫名其妙&#xff0c;if和else语句的缩进必须对齐&#xff0c;这不是连初学者都一…