11.1Spring基础(核心概念,创建和使用,简单读取)

news2024/11/15 11:19:13

一.Spring概念:

1.Spring就是包含了众多工具方法的IoC容器.

2.IoC容器:控制反转,指的是对象的生命周期,将对象的生命周期(什么时候创建,销毁)交给Spring进行管理.

1a54a4a9c86d4421a312b0cf958575ea.png

在传统开发中,如果A类依赖B类,会在A类中创建B类的实例,如果B类增加一个属性,那么使用B类的构造方法需要修改代码,如果使用IoC的观念,类的实例的创建全部在app类的方法中(由Spring完成),这样B类发生改变,A类不需要修改代码.

3.为什么要使用IoC容器:为了解耦合.

4.IoC容器的两个基本功能是将对象存入容器和从容器中取出容器.

5.DI:依赖注入,在程序运行期间,动态的将某个对象传入到当前类中的行为.

6(重要).IoC和DI的区别:IoC是一种思想,DI是一种具体的实现技术.

二.Spring创建:

1.步骤:

d112f5f2d18b404ea0578a9c710af8c8.png

<dependencies>
   <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
  
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
</dependencies>

dbebe6a64fc14ebe854e2fa4010a1f92.png

2.Spring对象的存储:

a.创建Bean对象,随便写一个类.

b.将Bean对象存到Spring当中(使用xml):resourses目录下创建Spring配置文件(命名无要求,这里我用spring-config.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"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="user" class="User"></bean>
</beans>

3.从Spring中读取到Bean对象:

 a.先得到Spring的上下文.

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

 b.得到Bean对象(三种方法,推荐第三种).

        //User user = (User)context.getBean("user"); // 这里需要和xml文件中的bean标签的id名称对应,如果是空指针,强转会出错
        //User user = context.getBean(User.class); // 这种方法不推荐,如果同一个类注入多次就会发生问题
        User user = context.getBean("user", User.class); // 推荐使用这种方法,不用强制,不会出错

注意起名规范(xml中bean标签id不重复,class用域名(如果没有可省略)+类名),名字对应. 

 c.使用Bean(可选).

System.out.println(user.hello());

d.使用BeanFactory方式.

BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml")); // 古老写法

ApplicationContext和BeanFactory区别:

1)相同点

a)都可以得到Spring上下文对象.

b)都是来着Spring的顶级接口.

2)不同的

a) ApplicationContext是BeanFactory的子类,前者功能更多(国际化支持,资源方法,事件传播).

b)性能区别: ApplicationContext是饿汉模式,BeanFactory是懒汉模式,前者快,后者慢.

三.Spring更简单地读取和存储对象

1.依靠注解,先配置扫描路径

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com"></content:component-scan>
</beans>

2.注解

b5ae08743d1b406ea672287b61315934.png

a.使用类注解

注意:默认使用类名的首字母改小写作为id.

f480464c42f44fc2b63fcc7a62f3f813.png

5891c8909ef540d78e7b0752dfc0bf5c.png 254af3f3bf1e45ab8708640a15b5b52e.png

关于这个通配符(**),首先一定是两个(*),然后,ApplicationContext的对象不能使用,BeanFactory对象可以使用,但是效率很低,因为要扫描所有的路径,建议创建合适的目录。

Demo1 demo1 = context.getBean("demo1", Demo1.class);

b.使用方法注解 

1)需要重新写一个类,通过编写多个不同的方法,返回多个同一个类的不同对象.

2)@Bean注解可以给一个对象起多个(包括一个)名字,起了名字之后就不能使用默认的名字了.

3)ApplicationContext的对象可以使用,BeanFactory对象不能使用.

4)代码

public class Student {
    public void hello() {
        System.out.println("hello");
    }
}
@Controller
public class StudentBeans {
    @Bean(name = {"s1", "s2"})
    public Student student() {
        Student student = new Student();
        return student;
    }

}
public class App {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        Student student = context.getBean("s2", Student.class);
        System.out.println(student);
    }
}

3.更加简单的获取Bean对象的方法(常用)

a.属性注入(不建议使用,但是目前最常用)

注意:不能在main方法中使用. 

代码实现:

@Service
public class Student {
    public void hello() {
        System.out.println("hello");
    }
}
@Controller
public class StudentBeans {
    @Autowired
    private Student student;

    public void print1() {
        student.hello();
    }
    public void hi() {
        System.out.println("hi");
    }
}
public class App {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        StudentBeans sc = context.getBean("studentBeans", StudentBeans.class);
        sc.print1();
    }
}

缺点: 

b.set注入(很危险,不推荐使用)

代码实现:

@Service
public class Student {
    public void hello() {
        System.out.println("hello");
    }
}
@Controller
public class StudentBeans {

    private Student student;

    @Autowired
    public void setStudent(Student student) {
        this.student = student;
    }

    public void print1() {
        student.hello();
    }
    public void hi() {
        System.out.println("hi");
    }
}
public class App {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        StudentBeans sc = context.getBean("studentBeans", StudentBeans.class);
        sc.print1();
    }
}

优点:相较于属性注入,更符合单一设计原则. 

缺点: 

c.构造方法注入(推荐使用)

 

 注意:

 代码:

@Service
public class Student {
    public void hello() {
        System.out.println("hello");
    }
}
@Controller
public class StudentBeans {

    private Student student;

    //@Autowired
    public StudentBeans(Student student) {
        this.student = student;
    }



    public void print1() {
        student.hello();
    }
    public void hi() {
        System.out.println("hi");
    }
}
public class App {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        StudentBeans sc = context.getBean("studentBeans", StudentBeans.class);
        sc.print1();
    }
}

 优点:

 缺点:没有属性注入简单.

d.

如果使用@Bean注解,可以注入一个类的多个对象,那么@Resource和@Autowired需要根据对象名(@Bean注解的方法名) 来获取指定对象.

1)@Resource需要设置参数(@Resource(name = "?")).

2)@Autowired有两种方法

a)对象名和@Bean注解的方法名相同,但是不推荐使用,如果@Bean注解的方法是别人写的,这样会沿用别人的名字,可能会发生命名不规范.

b)同时使用@Qualifier("??").

代码

public class Student {
    private String hello;
    public Student(String hello) {
        this.hello = hello;
    }
    public void hello() {
        System.out.println(hello);
    }
}
@Component
public class StudentBeans {
    @Bean
    public Student student1() {
        Student student = new Student("1");
        return student;
    }

    @Bean
    public Student student2() {
        Student student = new Student("2");
        return student;
    }

}

 

@Controller
public class Test {
//    @Autowired
//    private Student student1;
//    public void print1() {
//        student1.hello();
//    }

//    @Autowired
//    @Qualifier("student2")
//    private Student student;
//        public void print1() {
//        student.hello();
//    }

    @Resource(name = "student2")
    private Student student;
    public void print1() {
        student.hello();
    }
}
public class App {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Test test1 = context.getBean("test", Test.class);
        test1.print1();
    }
}

四.五大类注解(重点)

1.作用

2.区别:@Component是其它四个类注解的父类.

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

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

相关文章

Java基于SpringBoot的原创歌曲分享平台

文章目录 1 简介2 技术栈3 需求分析4 平台设计主要功能5 平台实现5.1平台功能模块 5.2后台功能模块52.1管理员功能模块5.2.2用户功能模块 源码咨询 1 简介 原创歌曲分享平台&#xff0c;为了随时随地查看原创歌曲分享信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管…

外卖霸王餐平台究竟是如何运作的?以及盈利点到底在哪里?

外卖霸王餐 1、业务简介。业务模式是消费者以5-10元吃到原价15-25元的外卖&#xff0c;底层逻辑是帮外卖商家做推广&#xff0c;解决新店基础销量、老店增加单量、品牌打万单店的需求。 因为外卖店的平均生命周期只有6个月&#xff0c;不断有新店愿意送霸王餐。部分老店也愿…

指南:通过 NFTScan API 获取钱包地址的 NFT Statistics 全量数据

获取钱包地址的全量 NFT 及统计分析数据对于开发者和投资者来说都是十分重要的。具体来说&#xff1a;对开发者而言&#xff0c;获取每个钱包的完整资产数据&#xff0c;并进行统计分析&#xff0c;是构建钱包管理工具、资产分析应用的基础&#xff0c;这些应用都需要全面且精确…

安装typescript之后提示不是内部命令

解决方案&#xff1a; 1、删除C:\Users\用户\下的.npmrc文件 2、在命令行输入npm cache clean --force 以上提示表示执行成功 3、重新安装typescript npm install -g typescript tsc

算法-堆/多路归并-查找和最小的 K 对数字

算法-堆/多路归并-查找和最小的 K 对数字 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 优先级队列构建大顶堆 2.1 思路 将两个数字的和放入大…

同一台电脑下的wireshark的http抓包查看使用的接口

开发过程中写软件开发设计时需要写调用的接口&#xff0c; 可以使用抓包软件 操作一遍&#xff0c;看抓包记录 然后看自己需要的接口调用情况 同一台电脑用这个 设置需要的抓包协议 在后台搜索关键词也可以看到用了哪些接口 Json查看器也可以查看接口信息

Vue+element开发Simple Admin后端管理系统页面

最近看到各种admin&#xff0c;头大&#xff0c;内容太多&#xff0c;根本不知道怎么改。所以制作了这个项目&#xff0c;只包含框架、和开发中最常用的表格和表单&#xff0c;不用自己从头搭建架构&#xff0c;同时也容易上手二次开发。可以轻松从其他开源项目整合到本项目。项…

避障技术再提升,扫地机器人避障不止于精准

扫地机器人好用与否&#xff0c;避障表现首当其冲&#xff0c;那么评判避障好坏的标准又是什么&#xff1f; 有效避障仅是第一步 时至今日&#xff0c;可以说仍有相当一部分人对于扫地机器人的印象停留在人工“智障”上&#xff0c;由于早期的产品基本不具备避障能力&#xf…

ArcGIS 10.7软件安装包下载及安装教程!

【软件名称】&#xff1a;ArcGIS 10.7 【安装环境】&#xff1a;Windows 【下载链接 】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1IwsPubYWGHd9ztmn45QLJA 提取码&#xff1a;1oeq 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 软件简介 ArcGIS…

ubuntu16编译linux源码内核

一、环境准备 1.1、安装虚拟机ubuntu16 编译内核大概需要20G的磁盘空间&#xff0c;所以硬盘大小尽量大于40G网络适配使用桥接 1.1.1、查看当前内核版本 uname -r1.2、安装samba服务 Samba 是一款数据共享的软件&#xff0c;可用于 Ubuntu 与 Windows 之间共享源代码&#…

Flink容错机制

容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我们不停地做存档操作。如果每处理一条数据就进行检查点的保存…

IP地址分配的原则:确保网络有效性和可管理性

IP地址是互联网通信的关键基础&#xff0c;它们用于标识和定位设备在网络上的位置。为了确保网络的有效性和可管理性&#xff0c;IP地址分配IP66_ip归属地在线查询_免费ip查询_ip精准定位平台需要遵循一定的原则和准则。本文将介绍IP地址分配的原则&#xff0c;以帮助网络管理员…

Java当中的BIO模型

我们知道Java中的IO模型分为BIO和NIO模型&#xff0c;BIO是BlCKING IO的简称而NIO当中的N有两层意思&#xff0c;一个是从java1.4开始出现的NEW IO&#xff0c;今天我们来聊一聊为什么传统的BIO会慢以及它并不适合大量的连接&#xff0c;我们先来看一段简单的代码&#xff0c;这…

unity生成模型预览图并导出图片

1、首先将模型打成预制体.prefab对象 2、放入指定文件夹 3、打开工具 4、不好使就多点一次 这样就会批量生成预制体图片了 Demo参见&#xff1a; GetbadEarlyup/unityPicDemo: 在unity中生成可导出缩略图的Demo工程 (github.com)https://github.com/GetbadEarlyup/unityPicDe…

天津口碑web前端培训机构 Web前端能干一辈子吗?

近年来&#xff0c;前端开发领域的就业市场呈现出蓬勃发展的态势。越来越多的公司和组织意识到用户体验的重要性&#xff0c;因此对前端开发人员的需求也随之增加。 学前端还是学后端 随着互联网的发展&#xff0c;前端和后端技术在招聘市场上都有很大的需求。学前端可以成为…

紧固螺栓的常见类型有哪些?

大螺丝、小螺丝 螺丝有各种各样的叫法。螺丝、小螺丝、螺栓、鋲螺、螺杆、螺子、小螺钉等。螺丝的大小、以现代的技术细的可以加工到1毫米以下。例如用于手表、计算机、手机等螺丝能加工到0.5毫米。粗的螺丝一般使用到50毫米&#xff0c;主要用于建筑、桥梁等。根据需要可加工…

【VUE复习·4】计算属性computed:原理、完整写法(不常用)、与 methods 的区别、简写(最常用)、应用案例!

总览 1.简介计算属性 2.computed 与 methods 的区别 3.computed 的简写&#xff08;不修改计算属性&#xff0c;只显示&#xff09; 4.经典应用场景 一、计算属性 1.为什么需要计算属性&#xff1f; 首先&#xff0c;如果我们要写一个插值语法&#xff0c;而 {{ }} 内的内容…

微信小程序 block 标签

今天在小程序开发中发现项目中出现了一个 block 作为一个小程序经验并不是特别多的我 显然触及到新大陆了 于是问了AI 在小程序中&#xff0c;block 元素用于包裹一组节点&#xff0c;类似于一个容器。它的作用是可以在页面中创建一个独立的作用域&#xff0c;方便对这组节点…

高光时刻丨极智嘉斩获2023中国物流与采购联合会科学技术一等奖

不久前&#xff0c;中国物流与采购联合会宣布了2022年度科学技术奖获奖名单&#xff0c;其中包括了一项令人瞩目的成就。这项成就源自于极智嘉与国药物流、南京医药、九州通医药以及多所高校的合作&#xff0c;他们共同努力&#xff0c;成功研究并应用了一项关键技术&#xff0…

上海再发区块链专项方案 和数集团欲打造新一代Web3.0创新生态

9月27日消息&#xff0c;上海市科学技术委员会印发《上海区块链关键技术攻关专项行动方案&#xff08;2023-2025年&#xff09;》的通知。 《行动方案》指出&#xff0c;专项行动要为上海市级区块链基础服务平台建设以及政务、跨境贸易、供应链、金融、元宇宙、数据要素流通等…