Java --- Spring6项目创建及注意事项

news2025/1/17 21:52:40

目录

一、Spring框架解决的问题

 二、Spring介绍

三、Spring八大模块

 四、Spring特点

五、第一个Spring6入门程序

 六、spring的细节

6.1、配置文件的bean的id不能重复

6.2、spring底层是通过反射调用无参构造方法创建对象

6.3、spring会把创建好的对象存储在Map集合中

 6.4、Spring的配置文件名不是固定的

 6.5、spring的配置文件可以为多个

6.6、配置文件的类不是必须为自定义类,可以是JDK中的类

 6.7、Spring中调用getBean()方法中的id不存在

 6.8、使用getBean()方法解决类型强转问题

6.9、加载配置文件不在类路径下方法

6.10、通过XmlBeanFactory获取Spring的容器

一、Spring框架解决的问题

1、Spring框架实现了控制反转IoC这种思想,对象的创建(new)和对象间的关系维护由Spring框架帮我们完成。

2、Spring是一个实现了IoC思想的容器。

3、控制反转的实现方式有多种,依赖注入(Dependency Injection)是比较重要的一种。

4、控制反转是思想,依赖注入是这种思想的具体实现。

5、依赖注入,常见的有两种方式:set注入(执行set方法给属性赋值),构造方法注入(执行构造方法给属性赋值)。

6、依赖:对象与对象的关系。注入:是一种手段,让对象和对象产生关系。通过依赖注入,对象和对象之间的关系,依靠注入的手段来维护。

 二、Spring介绍

1、Spring是一个开源框架,由Rod Johnson创建,它主要为了解决企业应用开发的复杂性而创建的。

2、Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

3、Spring最初的出现是为了解决EJB臃肿的设计,以及难以测试等问题。

4、Spring是为了简化开发而生的,程序员只需要关注核心业务,尽可能不再关注非业务逻辑的代码。

三、Spring八大模块

在Spring5之前是七大模块,在Spring5时加入了Webflux模块。

 四、Spring特点

1、轻量:①、从大小和开销两个方面而言Spring都是轻量级的,完整的Spring框架可以在一个大小只有1MB多的jar文件里发布。并且Spring所需的处理开销也是微不足道的。②、Spring是非侵入式的:Spring应用中的对象不依赖于Spring的特定类。

2、控制反转:①、Spring通过一种称控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象,也可以认为IoC与JNDI相反,不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

3、面向切面:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务(如审计(auditing)和事务(transacting)管理)进行内聚性的开发。应用对象只实现它们应该做的-----完成业务逻辑----仅此而已。它们并不负责其它系统级关注点,例如日志或事务支持。

4、容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,可以配置你的每个bean如何被创建----基于一个可配置原型(prototype),我们的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例-----以及它们是如何相互关联的,然而,Spring不应该被混同于传统的重量级的EJB容器,它们是庞大与笨重的,难以使用。

5、框架:Spring可以将简单的组件配置,组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理,持久化框架集成等),将应用逻辑开发留给了程序员。

所有Spring的这些特征能够使我们编写更干净、更可管理、并更于测试的代码。它们也为Spring中的各种模式提供了基础支持

五、第一个Spring6入门程序

官网地址:Spring | Home

创建Spring6项目 

 在pom.xml写入依赖并导入

<!--这里就是jar形式,先不采用web配置-->
    <packaging>jar</packaging>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <!--配置多个仓库-->
    <repositories>
        <!--spring里程碑版本的仓库,这里需要把maven配置文件中的仓库下载地址(如阿里云远程仓库)注释掉,
        不然报错,因为没有正式发布所以只能使用spring提供的仓库-->
        <repository>
            <id>repository.spring.milestone</id>
            <name>Spring Milestone Repository</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <!--导入依赖-->
    <dependencies>
       <!--spring context依赖,表示将spring的基础依赖引入了-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

创建一个实体类

/**
 * 封装了用户信息
 */
public class User {
}

在spring.xml中配置bean

<?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">
   <!--这里xml的文件名可以随意,文件放在resources目录下,相对于放在类路径下-->
    <!--配置bean,这样spring才能帮我们管理对象
        两个重要属性:id:不能重复,唯一标识
                   class:填写类的全路径-->
       <bean id="userBean" class="com.cjc.spring6.bean.User"></bean>
</beans>

在测试类中进行测试:

public class UserTest {
    @Test
    public void testUser(){
        /**
         * 获取Spring容器对象
         * ApplicationContext:是一个接口,其实就是Spring容器
         * ClassPathXmlApplicationContext:是ApplicationContext接口的一个实现类
         * 专门从类路径中加载spring配置文件的一个spring上下文对象。
         * 执行本行代码:相当于启动了spring容器,解析spring.xml文件,并且实例化所以的bean对象,放在spring容器中。
         */
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        //根据bean的id从spring容器中获取这个对象
        Object userBean = applicationContext.getBean("userBean");
        System.out.println(userBean);
    }
}

测试结果:

 六、spring的细节

6.1、配置文件的bean的id不能重复

 直接报错:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Bean name 'userBean' is already used in this <beans> element
Offending resource: class path resource [spring.xml]

6.2、spring底层是通过反射调用无参构造方法创建对象

/**
     * 默认情况下Spring会通过反射机制,调用类的无参构造方法来实例化对象
     * 实现原理:
     * Class class = Class.forName("com.cjc.spring6.bean.User");
     * class.newInstance;
     */
    public User() {
        System.out.println("User无参构造方法被调用");
    }

6.3、spring会把创建好的对象存储在Map集合中

 6.4、Spring的配置文件名不是固定的

 6.5、spring的配置文件可以为多个

 @Test
    public void testUser(){
        /**
         * 获取Spring容器对象
         * ApplicationContext:是一个接口,其实就是Spring容器
         * ClassPathXmlApplicationContext:是ApplicationContext接口的一个实现类
         * 专门从类路径中加载spring配置文件的一个spring上下文对象。
         * 执行本行代码:相当于启动了spring容器,解析spring.xml文件,并且实例化所以的bean对象,放在spring容器中。
         */
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring1.xml","spring2.xml");
        //根据bean的id从spring容器中获取这个对象
        Object userBean = applicationContext.getBean("userBean1");
        Object userBean2 = applicationContext.getBean("userBean2");
        System.out.println(userBean);
        System.out.println(userBean2);
    }

6.6、配置文件的类不是必须为自定义类,可以是JDK中的类

<!--配置JDK的bean-->
       <bean id="JDKBean" class="java.util.Date"></bean>
@Test
    public void testJDK(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring1.xml");
        Object jdkBean = applicationContext.getBean("JDKBean");
        System.out.println(jdkBean);
    }

 6.7、Spring中调用getBean()方法中的id不存在

 id不存在直接报错

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'JDKBean1' available

 6.8、使用getBean()方法解决类型强转问题

@Test
    public void testJDK(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring1.xml");
        //Date jdkBean = (Date) applicationContext.getBean("JDKBean");
        //使用getBean的第二参数来解决类型强转问题
        Date jdkBean = applicationContext.getBean("JDKBean", Date.class);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(simpleDateFormat.format(jdkBean));
    }

6.9、加载配置文件不在类路径下方法

@Test
    public void getPath(){
    //FileSystemXmlApplicationContext:不是从类路径中加载资源
        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("D:\\spring6\\spring02\\spring02\\src\\spring2.xml");
        Object userBean2 = applicationContext.getBean("userBean2");
        System.out.println(userBean2);
    }

6.10、通过XmlBeanFactory获取Spring的容器

@Test
    public void getBeanFactory(){
        /**
         * ApplicationContext接口的父接口是 :BeanFactory(能够生产Bean对象的一个工厂对象)
         * BeanFactory是IoC容器的顶级接口
         * Spring的IoC容器实际上使用的就是工厂模式
         * Spring底层IoC容器实现的原理:XML解析+工厂模式+反射机制
         */
        BeanFactory beanFactory  = new ClassPathXmlApplicationContext("spring1.xml");
        System.out.println(beanFactory.getBean("userBean1"));
    }

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

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

相关文章

【数据结构初阶】树+二叉树+堆的实现

真正的勇士&#xff0c;就是在看清生活的真相后&#xff0c;依旧慷慨面对他所遭受的苦难与挫折。 大学究竟教会了我们什么呢&#xff1f;或许答案只有一个&#xff0c;看清自己&#xff0c;与自己和解&#xff0c;和自己坐下来谈一谈。 人生或许本就没有什么意义&#xff0c;…

MySQL的缓冲池(buffer pool)及 LRU算法

1.什么是缓冲池&#xff08;buffer pool&#xff09; buffer pool 是数据库的一个内存组件&#xff0c;里面缓存了磁盘上的真实数据&#xff0c;Java系统对数据库的增删改操作&#xff0c;主要是这个内存数据结构中的缓存数据执行的。 控制块 存的是 数据页所属的表 空间号&a…

MATLAB break语句

MATLAB中 break 语句用于终止 for 或 while 循环的执行&#xff0c;当在循环体内执行到该语句的时候&#xff0c;程序将会跳出循环&#xff0c;继续执行循环语句的下一语句。 注意&#xff1a;在嵌套循环中&#xff0c;break 退出只能在循环发生&#xff0c;后通过的声明控制循…

git关于创建/删除分支常用命令

主要用来介绍git中如何操作分支的命令&#xff1a; 1.git查看所有的分支: git branch -a 2.创建本地分支&#xff1a; git checkout -b <name> 3.有了本地分支之后推送到远程分支; git push origin <name> 4.切换分支&#xff1a; git checkout <name> 5.删除…

黑*头条_第5章_文章发布粉丝管理成形记

黑*头条_第5章_文章发布&粉丝管理成形记 文章目录黑*头条_第5章_文章发布&粉丝管理成形记文章发布&粉丝管理1 需求分析1.1 功能需求1.2 前端需求1.2.1 图文数据需求1.2.2 素材管理需求1.2.3 发布文章需求1.2.4 内容列表需求1.2.5 粉丝概况需求2 定义2.1 后端定义2.…

MacBook磁盘内存空间清理软件CleanMyMac2023

Mac电脑用的时间久了&#xff0c;Mac用户尤其是MacBook用户会经常收到“磁盘几乎已满”的提示&#xff0c;如何解决这个问题&#xff0c;当我们使用苹果MAC一段时间后&#xff0c;就会有大量的垃圾文件占用磁盘空间&#xff0c;例如系统缓存文件、应用程序缓存文件、备份和重复…

2022/11/18[指针] 关于指针的初步理解

先看一段利用指针交换a和b值得代码&#xff1a; #include<stdio.h> void swap(int* p1, int* p2); int main() {int a, b;int* pa, * pb;printf("enter:");scanf_s("%d%d", &a, &b);pa &a;pb &b;printf("%d,%d\n", pa,…

面试:线程池核心线程如何保持一直运行的

对于Java中 Thread 对象&#xff0c;同一个线程对象调用 start 方法后&#xff0c;会在执行完run 后走向终止&#xff08;TERMINATED&#xff09;状态&#xff0c;也就是说一个线程对象是不可以通过多次调用 start 方法重复执行 run 方法内容的。Java的线程是不允许启动两次的&…

frp内网穿透服务

参考博客&#xff1a; https://www.jianshu.com/p/19ea81efffc4 https://blog.csdn.net/yj222333/article/details/124752420 依赖于&#xff1a;Github开源软件FRP 下载地址&#xff1a;https://github.com/fatedier/frp/releases frp 主要由 客户端(frpc) 和 服务端(frps…

基于JAVA景区售票系统设计与实现 开题报告

本科生毕业论文 基于java框架springboot旅游景区景点购票系统 开题报告 学 院&#xff1a; 专 业&#xff1a; 计算机科学与技术 年 级&#xff1a; 学生姓名&#xff1a; 指导教师…

三维模型文件以及obj、ply格式文件生成pcd点云文件

方法一、三维模型文件生成obj文件 要想生成点云文件&#xff0c;要先将三维模型文件保存为obj文件格式&#xff0c;步骤如下&#xff1a; 通过SolidWorks将模型保存为stl文件格式打开SolidWorks的插件选择&#xff0c;在ScanTo3D前面打勾 在solidworks中以网格文件的形式打开…

通信算法之九十六:电力通信系统-HRF多载波通信系统-物理层收发信道开发

目录1.HRF通信系统-物理层收发信道开发1.1 SIG发射机算法功能模块1.2 SIG接收机算法功能模块1.3 PHR发射机算法功能模块1.4 PHR接收机算法功能模块1.5 PSDU发射接收机处理流程1.6前导LTF/STF序列发射接收处理流程1.7PPDU帧&#xff08;前导SIGPHRPSDU&#xff09;发射接收处理流…

阿里云服务器(Ubuntu)配置nextcloud个人网盘

tags: Ubuntu Server Linux 写在前面 最近迷恋上了云服务器的配置, 感觉云服务器能做的事情太多了, 不管是docker还是直接部署, 都是相当方便快捷的, 下面来看看在阿里云服务器配置nextcloud网盘的基本配置方法, 这里参考了一篇文章1, 写的相当详细了, 我这里只是做一些补充.…

【5G MAC】Msg1 TX开环功控介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

使用python编写mqtt客户端向EMQX服务器发送数据

摘要&#xff1a;本文介绍如何用python编写一个mqtt客户端向EMQX服务器发送数据&#xff0c;实现一个简易的本地物联网服务器。 上一篇文章讲到使用mqtt.fx软件来发布消息。 (1条消息) 使用mqtt.fx向EMQX服务器发送消息_TMS320VC5257H的博客-CSDN博客https://blog.csdn.net/yo…

【树莓派不吃灰】命令篇⑦ 学习awk命令

目录awk 命令1. 基本语法2. 工作原理3. 基础实例操作3.1 把用户名和Shell打印出来3.2 找到以ssh关键字开头的所有行&#xff0c;并输出用户名和shell&#xff0c;中间以“-”分割3.3 给用户 ID加上一个常量3.4 输出第一个字段为sshd所在的行4. BEGIN END 操作4.1 基于3.2&#…

智慧仓储解决方案-最新全套文件

智慧仓储解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧仓储全套最新解决方案合集一、建设背景 仓储行业目前存在的问题 仓管员需要手动录单&#xff0c;工作量大&#xff0c;易出错&#xff0c;无法保证数据的准确率和及时性。 批次属性复杂、保…

计算机里的刻度:时钟和步进器

计算机的底层逻辑很简单&#xff0c;它们被定义为完成一些简单的事情。计算机是一个复杂系统&#xff0c;复杂的是如何规划好处理这些简单的事情的时间和步骤。本节就可以了解到计算机的时间刻度和步进器的构成&#xff0c;帮助我们进一步理解计算机的底层工作原理。 时钟是什…

redis三(3-1)

分布式缓存 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题 一、redis持久化 - RDB持久化 - AOF持久化1.1RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的…

java项目-第150期ssm网络视频播放器-java毕业设计_计算机毕业设计

java项目-第150期ssm网络视频播放器-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm网络视频播放器》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台查看视频信息、系统公告、论坛信息。 并且可以进入到个人中心查看视频信息、…