【Spring】快速入门Spring框架

news2024/11/13 10:52:27

文章目录

  • 1. 对Spring的理解
  • 2. Spring IoC
  • 3. DI
  • 4. 如何创建一个Spring项目
    • 4.1 创建一个Maven项目
    • 4.2 添加Spring框架支持
    • 4.3 添加启动类
  • 5. 存储Bean对象
    • 5.1 添加配置文件
    • 5.2 创建Bean对象
    • 5.3 注册Bean
  • 6. 获取并使用Bean对象
  • 7. 更简单存储Bean对象的方式
    • 7.1 前置工作
    • 7.2 添加存储对象的注解
      • 7.2.1 类注解
      • 7.2.2 方法注解
  • 8. 对象装配/对象注入
    • 8.1 属性注入
    • 8.2 构造方法注入
    • 8.3 Setter注入
    • 8.4 @Resource注解
    • 8.5 @Bean将一个对象多次注入问题

1. 对Spring的理解

Spring是一个框架,包含了众多工具方法的IoC容器

什么是容器?

容器就是容纳物品的装置,比如:

  • List/Map,用来储存数据,说明它是一个数据存储容器
  • Tomcat,webapps目录下保存多个web应用程序,说明它是一个web容器

什么是IoC?

IoC的意思就是控制反转,是一种设计原则,主要通过IoC容器实现控制权发生反转,如对象的初始化及依赖关系(对象引用另一个对象),由程序自己控制这部分逻辑转变为由容器统一控制

IoC的优点: 实现代码的解耦,将对象的生命周期交给IoC容器来管理,程序员无需管理

2. Spring IoC

前面说了Spring是一个包含众多工具方法的IoC容器,所以关键还是在容器上,所谓容器,就得具有容器的基本功能,取东西,存东西,对应这里的Spring容器,它具有最基本的功能为:

  • 将对象存储到容器
  • 从容器中将对象取出

将容器中存储的对象称为Bean对象(Java中的普通对象),Spring是一个IoC容器也就是将对象的创建和销毁的权利都交给Spring来管理,它本身具备了存储对象和获取对象的能力

3. DI

DI的意思为依赖注入,就是由IoC容器在运行期间,动态的将某种依赖关系注入到对象中

DI与IoC的区别?

IoC是一种思想,DI为具体实现,它俩是从不同角度描述同一件事情,就是利用IoC容器,利用依赖关系注入的方式实现对象之间的解耦,例如:吃饭(IoC),吃米饭(DI)

4. 如何创建一个Spring项目

4.1 创建一个Maven项目

创建Maven项目
设置好创建项目的路径

设置路径

4.2 添加Spring框架支持

在pom.xml中添加Spring的框架支持,xml配置如下:

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

4.3 添加启动类

在java文件夹下,创建一个启动类,包含main方法

启动类

5. 存储Bean对象

5.1 添加配置文件

第一次添加需要在项目中添加Spring配置文件(只需第一次添加

在resources目录下创建一个spring-config.xml(此文件名可以为别的,建议为spring-config)

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">
</beans>

5.2 创建Bean对象

Bean对象就是Java中普通的对象,这里我们创建一个Dog类

public class Dog {
    public void say(String name){
        System.out.println(name+":旺旺~");
    }
}

5.3 注册Bean

将创建好的Bean对象通过配置文件注册到Spring中

<bean id="dog" class="com.beans.Dog"></bean>

6. 获取并使用Bean对象

使用Spring上下文的方式获取Bean对象

  1. 先获取Spring上下文
  2. 再通过上下文对象提供的方法获取指定的Bean对象
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Dog dog = (Dog)context.getBean("dog");
        dog.say("旺财");
    }
}

打印结果
getBean的更多用法:

  • 使用bean name获取bean(需强转,返回类型为Object)
Dog dog = (Dog)context.getBean("dog");
  • 使用bean type获取bean(该类必须唯一,也就是多个该类型被注入到Spring中会报错)
Dog dog = context.getBean(Dog.class);
  • 使用bean name和type获取bean
Dog dog = context.getBean("dog",Dog.class);

使用Bean工厂的方式获取Bean对象

  1. 先获取bean工厂对象
  2. 再使用该对象的getBean方法获取Bean对象
public class App {
    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        Dog dog = factory.getBean("dog",Dog.class);
        dog.say("旺财");
    }
}

打印结果

ApplicationContext与BeanFactory有什么区别?

  • ApplicationContext属于BeanFactory的子类
  • BeanFactory只提供了基础访问Bean的方法,而ApplicationContext除了拥有BeanFactory的所有功能外,还提供了更多的方法实现,如对国际化的支持,资源访问的支持以及事件和传播等方面的支持
  • 性能两者不同,BeanFactory是按需加载Bean类似懒加载,而ApplicationContext在创建时会将所有Bean加载起来,属于饿汉式

7. 更简单存储Bean对象的方式

7.1 前置工作

在Spring配置文件中设置bean扫描路径,将前面配置的xml文件换成下面的,但是注意下面存放bean对象的路径要和自己的创建的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">
<!--    com.beans 是所有要存放bean对象的根路径-->
    <content:component-scan base-package="com.beans"></content:component-scan>
</beans>

7.2 添加存储对象的注解

7.2.1 类注解

  • @Controller,控制层(前端参数校验)
  • @Service,服务层(数据组装和接口调用)
  • @Repository,数据持久层(负责和数据库进行交互)
  • @Component,组件(非其他四类)
  • @Configuration,配置层(系统运行前,提前加载一些资源)
@Controller
public class UserController {
    public void sayHello(){
        System.out.println("hello Controller");
    }
}
public class Application1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //bean name为类名改写为小驼峰方式
        UserController userController = context.getBean("userController",UserController.class);
        userController.sayHello();
    }
}

结果
其他四个注解与此用法相同

为什么需要五大类注解

五大类注解
提高代码的可读性,让程序员能够直观的判断当前类的用途

类注解的关系

@Controller,@Service,@Repository,@Configuration都是基于@Component实现的,所以可以认为@Component是它们的父类

Spring使用五大类注解成bean Name问题

  • 如果一个类名的第一个字母为大写,第二个字母也为大写,那么bean Name就为改类名
  • 如果一个类名的第一个字母为大写,第二个字母为小写,那么bean Name就为小驼峰格式的类名

7.2.2 方法注解

@Bean注解加到方法上,将方法的返回值添加到容器中

注意: @Bean注解必须结合五大类注解来使用

@Component
public class Students {
    @Bean
    public Student s1(){
        Student student = new Student();
        student.setName("张三");
        student.setAge(23);
        return student;
    }
}
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Student student = context.getBean("s1",Student.class);
        System.out.println(student);
    }
}

打印结果

@Bean重命名

@Bean命名规则:

  • 当没有设置name属性时,方法名为bean名称
  • 当设置了name属性,只能通过name属性对应的值来获取,使用方法名就获取不到
@Component
public class Students {
    @Bean(name = "student1")
    public Student s1(){
        Student student = new Student();
        student.setName("张三");
        student.setAge(23);
        return student;
    }
}
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        Student student = context.getBean("student1",Student.class);
        System.out.println(student);
    }
}

打印结果

8. 对象装配/对象注入

8.1 属性注入

使用@Autowired注解获取到Spring中的Student对象,将其注入到UserController1的属性中

@Controller
public class UserController1 {

    @Autowired
    private Student student;

    public void sayHello(){
        System.out.println(student);
    }
}
public class App2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController1 userController1 = context.getBean(UserController1.class);
        userController1.sayHello();
    }
}

打印结果

8.2 构造方法注入

构造方法注入是在构造方法上加@Autowired,实现注入

@Service
public class UserService {

    private Student student;

    @Autowired
    public UserService(Student student1){
        this.student = student1;
    }
    public void say(){
        System.out.println(student);
    }
}
public class App2 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService = context.getBean(UserService.class);
        userService.say();
    }
}

打印结果

如果当前类中只存在一个构造方法,那么@Autowired可以省略

8.3 Setter注入

Setter注入是在设置的set方法上加@Autowired注解

@Controller
public class UserController2 {
    private Student student;

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

    public void say(){
        System.out.println(student);
    }
}
public class App1 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController2 userController2 = context.getBean(UserController2.class);
        userController2.say();
    }
}

8.4 @Resource注解

在进行对象注入的时候,除了可以使用 @Autowired 关键字之外,我们还可以使用 @Resource 进行注入

public class UserService2 {
    @Resource(name = "student1")
    private Student student;
    
    public void say(){
        System.out.println(student);
    }
}

@Autowired与@Resource区别

  1. 出身不同:@Resource来自于jdk,@Autowired时Spring框架提供的
  2. 用法不同:@Autowried可以用于属性注入,构造方法注入,Setter注入,@Resource不支持构造方法注入
  3. 参数不同:@Resource支持更多的参数设置,比如name,type,而@Autowried只支持required参数

8.5 @Bean将一个对象多次注入问题

先创建一个Cat类,属性有name和color,并提供get,set,toString方法

往Spring中注入多个Cat对象

@Controller
public class Cats {
    @Bean
    public void cat1(){
        Cat cat = new Cat();
        cat.setName("糯米");
        cat.setColor("白色");
    }
    
    @Bean
    public void cat2(){
        Cat cat = new Cat();
        cat.setName("汤圆");
        cat.setColor("黑色");
    }
}

在另一个类中获取Cat对象

@Controller
public class CatController {

    @Autowired
    private Cat cat;

    public void getCat(){
        System.out.println(cat);
    }
}

创建启动类

public class App3 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        CatController catController = context.getBean(CatController.class);
        catController.getCat();
    }
}

报错

发现报错了,因为Spring中已经注入了两个Cat对象,所以此时不知道获取哪个对象

原因

三种解决方案

  1. 精确的描述bean的名称(将注入的名称写对)
  2. 使用@Rsource设置name方式来重命名注入对象
  3. 使用@Autowired+@Qualifier来筛选bean对象

方案一:精确的描述bean的名称(将注入的名称写对)

@Controller
public class CatController {

    @Autowired
    private Cat cat1; //精确描述bean名称

    public void getCat(){
        System.out.println(cat1);
    }
}

方案1

方案二: 使用@Rsource设置name方式来重命名注入对象

@Controller
public class CatController {

    @Resource(name = "cat2")
    private Cat cat;

    public void getCat(){
        System.out.println(cat);
    }
}

结果

方案三:使用@Autowired+@Qualifier来筛选bean对象

@Controller
public class CatController {

    @Autowired
    @Qualifier(value = "cat1")
    private Cat cat;

    public void getCat(){
        System.out.println(cat);
    }
}

结果

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

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

相关文章

python爬虫1

1.1 网络爬虫概述 网络爬虫&#xff08;又被称为网络蜘蛛、网络机器人&#xff0c;在某社区中经常被称为网页追逐者&#xff09;&#xff0c;可以按照指定的规则&#xff08;网络爬虫的算法&#xff09;自动浏览或抓取网络中的信息&#xff0c;通过 Python 可以很轻松地编写爬…

二叉搜索树+二叉进阶oj

索引二叉搜索树1.二叉搜索树概念与性能分析2.二叉树的应用3.二叉树的实现细节4.类中函数递归调用5.二叉树实现总体代码6.二叉进阶oj7.二叉树三种遍历非递归实现二叉搜索树 1.二叉搜索树概念与性能分析 什么是二叉搜索树 二叉搜索树也被称为二叉排序树&#xff0c;其也可以是一…

热视觉2:使用Python和OpenCV从图像中测量温度

热视觉2:使用Python和OpenCV从图像中测量温度 这篇博客将介绍学习热/中远红外视觉的基础知识,gray8 和 gray16 图像(即最常见的热成像格式)之间的差异,学习如何使用Python和OpenCV从热图像中的每个像素点测量温度,并以不同的调色板显示结果。以及如何实时计算视频流和UV…

2022高频经典前端面试题(vue2+vue3+typescript+nodejs下篇,含答案)

vue2篇 1.vue的生命周期&#xff08;重点&#xff09; 2.父子组件的钩子函数顺序 页面初次渲染的时候&#xff1a; 父beforeCreate-> 父created -> 父beforeMount 子beforeCreate-> 子created ->子beforeMount-> 子mounted 父mounted 页面更新的时候&#xff…

大数据之Hive

文章目录前言一、数据仓库介绍&#xff08;一&#xff09; 数据仓库的基本概念&#xff08;二&#xff09;数据仓库的主要特征&#xff08;三&#xff09;数据仓库与数据库的区别二、Hive的概念&#xff08;一&#xff09;Hive的介绍&#xff08;二&#xff09;Hive的架构总结前…

4种方法!怎么把电脑上的音频传到苹果手机上?

案例分享 我新买了iphone13&#xff0c;想把macbook上下载的音乐传输一份到手机上&#xff0c;怎么把电脑上的音频传到苹果手机上&#xff1f;能否通过网络实现将电脑音乐传输到手机播放&#xff1f;” 很多果粉在刚拿到心爱的苹果手机后&#xff0c;都先把之前收藏的歌曲传到…

Grpc简介

博主在5月份已经从上一家公司辞职了&#xff0c;七月份已经到现在的公司了&#xff0c;能在整个互联网大环境都不好的前提下&#xff0c;还能找到工作&#xff0c;待遇还不错&#xff0c;已经很知足了。grpc是进到公司的第一个项目用到的技术&#xff0c;已经用了很久也总结了&…

三菱FX5U系列PLC内置高速计数器的使用方法示例

三菱FX5U系列PLC内置高速计数器的使用方法示例 三菱FX5U系列PLC内置高速计数器如何使用? 具体的使用方法可参考如下: 如下图所示,打开GX-WORKS3编程软件,在左侧的项目树中找到参数—FX5U—模块参数—高速I/O, 如下图所示,在弹出的右侧窗口中双击高速计数器—详细设置,…

没有十几年的积累,你还真写不出什么好的代码

如标题所说&#xff0c;我不知道大家怎么看待这句话&#xff1f; 拿一个正常的程序员举个例子&#xff0c;18开始上大学学习写代码&#xff0c;22岁大学毕业&#xff0c;一直干到30岁就需要考虑程序员的中年危机。 小编身边很多程序员都不喜欢写代码&#xff0c;感觉写代码没有…

C · 进阶 | 指针的进阶

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

数电学习(六、时序逻辑电路)(一)

文章目录引言概述特点时序电路的一般结构形式与功能描述方法时序电路分类时序电路的分析方法同步时序电路的分析方法状态转换表状态转换图&#xff08;回顾&#xff09;在现在的场景下看触发器的动态特性&#xff08;四个时间&#xff09;&#xff08;举例&#xff09;分析下面…

计算机毕设(附源码)JAVA-SSM佳音大学志愿填报系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

python有哪些编译器

python有哪些编译器 1、Brython把Python转换成Javascript代码。 是一个流行的Python编译器&#xff0c;它可以把Python转换成Javascript代码。该软件支持所有网络浏览器(包括手机网络浏览器)。 它还支持最新的Html5/CSS3标准&#xff0c;可以使用流行的CSS框架&#xff0c;如…

200、无线网桥与无线AP的带机量是多少?一篇文章搞明白

正文&#xff1a; 一个无线ap的带机量是多少&#xff1f;也有朋友提到无线网桥的带机量&#xff1f;这个我们之前有提到过&#xff0c;在了解他们的带机量的话&#xff0c;我们就不得不了解ap的性能指标了&#xff0c;那么本期我们来总结下带机量的问题。 一、选择AP前需要考虑…

用通俗易懂的大白话彻底搞明白mysql的数据类型以及mysql中的int(11),这个11到底是啥?

今天抽时间来讲一下mysql里的知识点&#xff0c;之前有不少人问过我&#xff0c;mysql中的int(11)&#xff0c;这个11到底是啥意思&#xff1f;是11位的意思吗&#xff1f;你是否也想过这个问题&#xff0c;是否也有这个疑问&#xff1f; ok&#xff0c;今天就展开来讲一下&am…

深度分析React源码中的合成事件

热身准备 明确几个概念 在React17.0.3版本中&#xff1a; 所有事件都是委托在id root的DOM元素中&#xff08;网上很多说是在document中&#xff0c;17版本不是了&#xff09;&#xff1b;在应用中所有节点的事件监听其实都是在id root的DOM元素中触发&#xff1b;React自…

【MySQL 第十一天 创建和存储|复合结构的存储|存储过程和函数的区别】

【MySQL 第十一天 创建和存储|复合结构的存储|存储过程和函数的区别】【1】mysql储存过程及语法结构【1.1】mysql过程体【2】mysql创建和使用存储过程【2.1】mysql创建无参的存储过程【2.2】mysql创建有参的输入输出存储过程【3】mysql删除存储过程【4】mysql创建复合结构的存储…

专精特新小巨人的认定条件

奖励&#xff1a;对新认定的专精特新“小巨人”企业&#xff0c;聊城市财政最高一次性奖励50万元。其他地区各有不同。 认定条件 专精特新“小巨人”企业认定需同时满足专、精、特、新、链、品六个方面指标。 (一)专业化指标&#xff1a;坚持专业化发展道路&#xff0c;长期…

大学生体育运动网页设计模板代码 DIV布局校园运动网页作业成品 HTML学校网页制作模板 学生简单体育运动网站设计成品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

C++知识精讲14 | 算法篇之二分查找算法

博主主页&#xff1a;Cool Kid~Yu仙笙_C领域博主&#x1f984; 目录 二分查找定义 二分查找效率 二分查找与遍历的对比 二分查找的限制性 二分查找的限制性&#xff08;总结&#xff09; 二分查找搭建 循环实现二分查找 循环二分查找基本框架&#xff1a; 循环二分查找源码&am…