spring基础,编写第一个程序

news2025/1/11 8:04:14

spring基础

  • 前言
  • Spring
    • Spring概述
    • Spring的8大模块
    • Spring特点
    • 学习spring6软件版本
    • Spring的入门程序
      • 第一个Spring程序
  • 小结


前言

控制反转,是面向对象编程中的一种设计思想,可以用来降低代码之间的耦合度,符合依赖倒置原则。

控制反转的核心是:将对象的创建权交出去,将对象和对象之间关系的管理权交出去,由第三方容器来负责创建与维护。

控制反转常见的实现方式:依赖注入
通常,依赖注入的实现由包括两种方式:
● set方法注入
● 构造方法注入

而Spring框架就是一个实现了IoC思想的框架。
IoC可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在GoF(23种设计模式)中。


Spring

Spring概述

Spring简介

来自百度百科
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring最初的出现是为了解决EJB臃肿的设计,以及难以测试等问题。
Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等)。

Spring的8大模块

注意:Spring5版本之后是8个模块。在Spring5中新增了WebFlux模块。
在这里插入图片描述

Spring特点

  1. 轻量
    a. 从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。
    b. Spring是非侵入式的:Spring应用中的对象不依赖于Spring的特定类。
  2. 控制反转
    a. Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
  3. 面向切面
    a. Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
  4. 容器
    a. Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
  5. 框架
    a. Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
    所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

学习spring6软件版本

● IDEA工具:2022.1.4
● JDK:Java17(Spring6要求JDK最低版本是Java17)
● Maven:3.8.6
● Spring:6.0.0-M2
● JUnit:4.13.2

Spring的入门程序

3.1 Spring的下载
官网地址(中文):http://spring.p2hp.com/

如果你只是想用Spring的IoC功能,仅需要引入:spring-context即可。将这个jar包添加到classpath当中。
如果采用maven只需要引入context的依赖即可。

第一个Spring程序

前期准备:
● 打开IDEA创建Empty Project,命名spring6

● 设置JDK版本17,编译器版本17

● 设置IDEA的Maven:关联自己的maven

● 在空的工程spring6中创建第一个模块,命名spring6-001-first

下面正式开始做第一个spring程序

第一步:添加spring context的依赖,pom.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.powernode</groupId>
    <artifactId>spring6-001-first</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <repositories>
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!--spring context依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

</project>

第二步:添加junit依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.powernode</groupId>
    <artifactId>spring6-001-first</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <repositories>
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <dependencies>
        <!--spring context依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

</project>

第三步:定义bean:Users

package com.w.spring6.dao.bean;

public class Users {
}

第四步:编写spring的配置文件:beans.xml。该文件放在类的根路径下(resources目录下)

<?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="userBean" class="com.w.spring6.dao.bean.Users"/>
</beans>

bean的id和class属性:
● id属性:代表对象的唯一标识。可以看做一个人的身份证号。
● class属性:用来指定要创建的java对象的类名,这个类名必须是全限定类名(带包名)。

第五步:编写测试程序

package com.w.spring6.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Spring6Test {

    @Test
    public void testFirst(){
        // 初始化Spring容器上下文(解析beans.xml文件,创建所有的bean对象)
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        // 根据id获取bean对象
        Object userBean = applicationContext.getBean("userBean");
        System.out.println(userBean);
    }
}

第七步:运行测试程序
在这里插入图片描述


小结

  • Spring是如何创建对象的呢?原理是什么?
// dom4j解析beans.xml文件,从中获取class的全限定类名
// 通过反射机制调用无参数构造方法创建对象
Class clazz = Class.forName("com.w.spring6.dao.bean.Users");
Object obj = clazz.newInstance();
  • getBean()方法返回的类型是Object,如果访问子类的特有属性和方法时,还需要向下转型,有其它办法可以解决这个问题吗?
User user = applicationContext.getBean("userBean", User.class);
  • 配置文件中配置的类可以不是自定义的,可以使用JDK中的类,例如:java.util.Date

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

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

相关文章

06、SpringBoot+微信支付 -->商户定时查订单状态、用户取消订单(关闭订单API)、查询订单API--到微信支付平台查询订单

目录 Native 下单、取消订单订单功能完善需求1&#xff1a;商户定时查单前端代码&#xff1a;后端代码&#xff1a;测试&#xff1a;swagger 测试&#xff1a; 需求2&#xff1a;用户取消订单&#xff08;关闭订单API&#xff09;需求&#xff1a;代码&#xff1a;前端&#xf…

Linux安装Python3.10与部署flask项目实战详细记录

java开发新手入门Python,创建flask后端服务对外提供访问.记录一下在阿里云服务器部署flask项目的操作过程,简单介绍一下使用的阿里云服务器系统配置:ubantu16.04,其他内核版本操作部分命令会有所区别,下面开始详细操作过程! 1.pycharm创建flask项目并打包 2.Python3.…

grafana 密码忘记怎么重置

1.重置密码的命令&#xff1a; grafana-cli admin reset-admin-password 新的密码

【JavaEESpring】Spring, Spring Boot 和Spring MVC的关系以及区别

Spring, Spring Boot 和Spring MVC的关系以及区别 Spring&#xff1a;简单来说&#xff0c;Spring 是一个开发应用框架&#xff0c;什么样的框架呢&#xff1f;轻量级、一站式、模块化&#xff0c;其目的是用于简化企业级应用程序开发 Spring的主要功能: 管理对象, 以及对象之…

收银系统有哪些分类 收银软件有哪些类型

收银系统有以下这几种分类&#xff0c;你都清楚么&#xff1a; 一、按是否能数据共享可分为&#xff1a;单机版收银系统、网络版收银系统 这里需要注意&#xff0c;很多地方说单机也能收银&#xff0c;其实单机和网络版只是数据存储地方不同&#xff0c;单机版需要在线收银还是…

2023第六届泰迪杯数据分析,第五届泰迪杯数据分析技能赛B题源码图片分享

需要B题源码以及第六届带队”指导“请私信本人&#xff0c;团队包含技能赛双一等&#xff0c;数学建模省一&#xff0c;泰迪杯挖掘国一&#xff0c;研究生队友。 去年一等作品可视化图如下&#xff0c;私信获取源码

javaSE学习笔记(五)集合框架-Collection,List,Set,Map,HashMap,Hashtable,ConcurrentHashMap

目录 四、集合框架 1.集合概述 集合的作用 集合和数组的区别 集合继承体系 数组和链表 数组集合 链表集合 2.Collection 方法 集合遍历 并发修改异常 3.List List集合的特有功能&#xff08;核心是索引&#xff09; 集合遍历 并发修改异常产生解决方案ListIterato…

在虚拟机中新安装的Linux无法联网解决办法

1、我们在虚拟机中新安装了linux&#xff0c;默认是无法连接网络的&#xff0c;这个时候&#xff0c;需要配置自动获取ip的网设置。 2、我们在VMware Workstatio需要配置net网络&#xff0c;如下图 3、进入linux系统&#xff0c;找到 /etc/sysconfig/network-scripts/ [rootn…

腾讯待办关停怎么办?可将导出的ics文件添加到手机待办APP中

有不少网友之前一直使用微信中的“腾讯待办”小程序来记录待办事项并设置定时提醒时间&#xff0c;但是最近一段时间在使用腾讯待办的时候&#xff0c;却发现主页弹出了“业务关停通知”&#xff0c;主要内容是&#xff1a;由于业务发展方向调整&#xff0c;腾讯待办将于2023年…

下载文本标注工具doccano遇到的报错以及解决方案

下载文本标注工具doccano遇到的报错以及解决方案 最近在用doccano搭标注平台的时候遇到了一些问题&#xff0c;总是报错&#xff0c;下面记录一下 pip install doccano首先检查python版本得是3.9,否则会报错 报错信息如下&#xff1a; ERROR: No matching distribution fou…

个人网厅——销户

目录 需求文档 公积金销户类 controller层 service层 service层实现类 1.验证 &#xff08;个人账户&#xff09; 2.提交&#xff08;添加&#xff09; controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4. 详情查询…

知了汇智主题讲座走进四川轻化工大学

2011年&#xff0c;Netscape创始人马克安德森一句“软件正在吞噬世界”掀起热浪&#xff0c;随着云计算、大数据、人工智能等技术的日趋成熟&#xff0c;我们发现吞噬当下世界的是数字化技术&#xff0c;而非软件。 数字化技术一方面改变着国家、企业、个人之间的竞争规则&…

U-Mail邮件系统安全登录解决方案

企业邮箱是企业对内对外商务往来的主要通信工具&#xff0c;并且企业邮箱里面还包含了大量企业内部隐私信息、商业机密等&#xff0c;很容易成为黑客的攻击目标。其中邮件盗号是企业邮箱遭受攻击的主要形式&#xff0c;一旦企业邮箱密码被黑客盗取&#xff0c;黑客不仅可以利用…

自主可控的半导体ic测试系统-国产化替代方案ATECLOUD

在当今高速发展的科技时代&#xff0c;半导体和集成电路(IC)已成为推动世界进步的核心驱动力。为了确保半导体/IC在性能、质量和可靠性方面达到最高标准&#xff0c;我们提供一套全面、创新的测试解决方案&#xff0c;以满足不断变化的市场需求。 利用我公司自主研发的ATECLOU…

银行转账p图在线制作生成,回执单凭证,工商农业邮政建设,易语言画板!

小编这边用易语言画板实现了一个可以自动P银行回执单的软件&#xff0c;当然我加了水印的&#xff0c;生成的图片都有水印&#xff0c;防止被恶意利用&#xff0c;然后可以选择模版&#xff0c;通过单选框的方式&#xff0c;生成的是转账成功后的截图奥&#xff0c;在编辑框输入…

Mysql--高级(自定义函数、存储过程、视图、事务、索引)

自定义函数 语法 delimiter $$ create function 函数名称(参数列表) returns 返回类型 begin sql语句 end $$ delimiter ; 说明: delimiter用于设置分割符&#xff0c;默认为分号,主要用于命令行&#xff0c;在“sql语句”部分编写的语句需要以分号结尾&#xff0c;此时回车会…

探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用

目录 一、什么是海外服务器 二、不同主流海外云服务器对比 三、海外服务器的创建(亚马逊为例) 四、个人总结 一、什么是海外服务器 亚马逊云科技海外服务器&#xff1a;指的是部署在世界各地的亚马逊数据中心中的服务器设备。这些服务器提供了计算、存储、数据库、网络等各…

基于RK3568的内部定时器应用示例

1. 内部定时器介绍 内核定时器是内核用来控制在未来某个时间点&#xff08;基于jiffies&#xff09;调度执行某个函数的一种机制&#xff0c;其实现位于kernel/linux/timer.h和kernel/timer.c 文件中。 被调度的函数肯定是异步执行的&#xff0c;它类似于一种“软件中断”&am…

HP惠普暗影精灵9P OMEN 17.3英寸游戏本17-cm2000(70W98AV)原装出厂Windows11-22H2系统镜像

链接&#xff1a;https://pan.baidu.com/s/1gJ4ZwWW2orlGYoPk37M-cg?pwd4mvv 提取码&#xff1a;4mvv 惠普暗影9Plus笔记本电脑原厂系统自带所有驱动、出厂主题壁纸、 Office办公软件、惠普电脑管家、OMEN Command Center游戏控制中心等预装程序 所需要工具&#xff1a;3…

麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包

原文链接&#xff1a;麒麟KYLINIOS软件仓库搭建03-软件仓库添加新版本的软件包 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟桌面操作系统软件仓库搭建的文章03-软件仓库添加新版本的软件包&#xff0c;本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版…