spring框架:简介+依赖注入

目录

一、spring简介

二、创建项目

三、spring创建对象 

四、SpringBean管理

1.注入实现-XML

2.注入实现-注解


一、spring简介

        spring诞生与2003年,是一个轻量级的、IOC( Inversion Of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)的java开发框架,为了简化企业级应用开发。

二、创建项目

1.Maven导入spring核心基础jar包

        添加spring-context jar包

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2.编写spring配置文件

<?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>

三、spring创建对象 

 1.在bean添加spring框架需要管理的类:

        如下class为类地址,id为唯一标识  

<bean id="user" class="com.yyds.spring.bean.User" scope="prototype"></bean>

        设置bean中的scope:

        singleton:只创建一个bean对象,在启动spring时创建(默认形式)

        prototype:在每次获取对象时创建,创建新的bean对象

2.启动spring:

        spring.xml为spring的配置文件(含有约束和管理的类)

 ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");

创建对象:其中参数user为bean管理类的id,第二个参数为该类的Class对象,我们让spring帮我们创建了对象,把创建对象的控制权限交给了spring框架,再也不用new对象,这就是IOC“反转控制”的思想。

        User user =  applicationContext.getBean("user", User.class);
        System.out.println(user);

IOC 底层实现方式: 解析 xml/扫描注解标签 + 工厂模式 + 反射机制

四、SpringBean管理

依赖注入:创建对象时,需要为对象的属性进行赋值。

注入方式:

        set方法

        构造方法

1.注入实现-XML

        set方法 :name 为属性名,value为值

    <bean id="user2" class="com.yyds.spring.bean.User" scope="prototype">
        <!--为属性赋值 通过set方法-->
        <property name="id" value="100"></property>
        <property name="name" value="张三"></property>
    </bean>

        构造方法:name 为构造方法的参数名,value为传入参数的值

    <bean id="user3" class="com.yyds.spring.bean.User" scope="prototype">
       <!-- 通过构造方法-->
        <constructor-arg name="id" value="12"></constructor-arg>
        <constructor-arg name="name" value="李四"></constructor-arg>
    </bean>

 属性含有对象时:

        例如:UserService类中含有userDao对象,有userDao的set方法,实现对userDao中方法的调用:

public class UserService {
    UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void insert(User user) {
        userDao.insertUser(user);
    }
}

UserDao类

public class UserDao {
    public void insertUser(User user){
        System.out.println("保存成功");
    }
}

XML如下,与为简单属性赋值的方式有一点不同,在property标签中的value要改为ref,表示引用此id的类:

测试:

public class TestUser{
    @Test
    public void test1(){
        //启动spring
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
        //spring创建user对象作userService.insert方法的为参数
        User user =  applicationContext.getBean("user3", User.class);
        System.out.println(user);
        //spring创建userService对象并创建属性为UserDao的对象
        UserService userService =  applicationContext.getBean("userService", UserService.class);
        userService.insert(user);
    }
}

输出结果:

 

2.注入实现-注解

        开启注解扫描:

                在spring的xml配置文件中配置:此处配置的为需要扫描的包,包含里面所有的类

<context:component-scan base-package="com.yyds.spring"></context:component-scan>

        添加约束:

        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd

添加后的spring.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"
       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
       ">

    <context:component-scan base-package="com.yyds.spring"></context:component-scan>

</beans>

 相关注解:

实现创建对象功能:
@Component(value=“user”)等于<bean id=“user” class=“”></bean>
@Service:通常添加到Service层的类名之上
@Repository:通常添加到Dao层的类名之上
Scope设置:
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例

依赖注入:

  1.         @Autowired可以放在属性上,就可以不用set方法,通过属性的类型在spring容器中寻找
  2.         @Autowired @Qualifier 联合使用,要用标识:value=" ";
  3.         @Resource可以通过类型和标识找,有无name=“ ”都可以。

 @Autowired和@Qualifier是spring框架提供的,@Resource是JDK提供的。

示例: 

@Service
public class UserService {
    @Resource
    UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void insert(User user) {
        userDao.insertUser(user);
    }
}
@Repository
public class UserDao {
    public void insertUser(User user){
        System.out.println("保存成功");
    }
}
public class Test {
    @Test
    public void test1(){
        //启动spring
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
        User user1 =  applicationContext.getBean("user", User.class);
        UserService userService = applicationContext.getBean(UserService.class);
        userService.insert(user1);
    }
}

 输出结果:

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【rust/egui】(六)看看template的app.rs:TextEdit

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 TextEdit 文本编辑框 其定义为&#…

有限与无限游戏 | 真北荐书

2023佛山敏捷之旅暨DevOps Meetup志愿者为进行大会的组织与准备&#xff0c;每周三晚有一个例会。 例会前等人的时间&#xff0c;涌现出一个小的分享环节。今天分享这本书&#xff1a;《有限与无限游戏》。 大家选择成为志愿者&#xff0c;是一个无限游戏。而组织活动和完成各种…

uni-app里使用webscoket

实现思路和vue中是一样的。如果想看思路可以看这篇文章&#xff1a;websocket 直接上可以运行的代码&#xff1a; 一、后端nodeJS代码&#xff1a; 1、新建项目文件夹 2、初始化项目&#xff1a; npm init -y 3、项目里安装ws npm i ws --save 4、nodeJS代码&#xff1…

STL list基本用法

目录 list的使用构造函数和赋值重载迭代器(最重要)容量相关插入删除元素操作reversesortuniqueremovesplice list的底层实际是双向链表结构 list的使用 构造函数和赋值重载 构造函数说明list()无参构造list (size_type n, const value_type& val value_type())构造的li…

Python学习笔记_进阶篇(一)_浅析tornado web框架

tornado简介 1、tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架&#xff08;包括大多数 Python 的框架&#xff09;有着明显的区别&#xff1a;它是非阻塞式服务器&#xff0c;而且速度相当快。得利于…

Clock Domain Crossing(CDC)跨时钟域

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ​跨时钟域(CDC)指的是信号由一个时钟域进入另一个时钟域,以下图为例。 ● F1属于clk1时钟域 ● Q1属于clk1时钟域的信号 ● F2属于clk2时钟域 ● Q2属于clk2时钟域的信号 ● Q1对于F2来说是…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

数据结构(Java实现)-二叉树(下)

获取二叉树的高度 检测值为value的元素是否存在(前序遍历) 层序遍历 判断一棵树是不是完全二叉树 获取节点的路径 二叉树的最近公共祖先

c++的IO流

前言 很多编程语言都有自己的输入输出流&#xff0c;流是一种抽象的概念&#xff0c;为了方便我们使用各种输入输出设备从而抽象出来的概念。 目录 1.C语言的输入和输出 2.流的概念 3.CIO流 3.1C标准I/O流 3.2C文件I/O流 4.stringstream的简单介绍 1.C语言的输入和输出 在…

MIUI 欧版刷机教程(操作篇)

文章目录 0 前置条件1 下载ROM包2 确定刷机方式3 线刷教程4 卡刷教程使用系统更新使用 TWRP 问题汇总 0 前置条件 必须先解除手机的 bootloader 锁。详细教程参见官网&#xff1a;申请解锁小米手机 (miui.com)。 1 下载ROM包 在 MIUI EU 官方论坛&#xff08;需要科学上网&a…

css-选择器、常见样式、标签分类

CSS CSS简介 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可…

呈现数据的精妙之道:选择合适的可视化方法

在当今数据时代&#xff0c;数据可视化已成为理解和传达信息的重要手段。然而&#xff0c;选择适合的数据可视化方法对于有效地呈现数据至关重要。不同的数据和目标需要不同的可视化方法&#xff0c;下面我们将探讨如何选择最佳的数据可视化方法来呈现数据。 1. 理解数据类型&a…

蓝蓝设计-UI设计公司作品-博晖创新原子吸收光谱仪软件交互及界面设计

博晖创新原子吸收光谱仪软件交互及界面设计 图标设计 | 交互设计 | 界面设计 博晖公司拥有强大的自主研发实力&#xff0c;建立了专业的研发团队&#xff0c;通过不断的技术创新&#xff0c;形成了分子诊断、免疫诊断、原子吸收、原子荧光及质谱五大技术平台&#xff0c;并成功…

Vue中使用vue-drag-resize实现窗体可拖拽和随意缩放大小

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_ruoyi本地调式_霸道流氓气质的博客-CSDN博客 在上面的基础上&#xff0c;实现弹窗窗体可移动以及随意缩放大小。 效果如下 注&#xff1a; 博客&am…

【Go 基础篇】Go语言中的defer和recover:优雅处理错误

Go语言以其简洁、高效和强大的特性受到了开发者的热烈欢迎。在错误处理方面&#xff0c;Go语言提供了一种优雅的机制&#xff0c;即通过defer和recover组合来处理恐慌&#xff08;panic&#xff09;错误。本文将详细介绍Go语言中的defer和recover机制&#xff0c;探讨其工作原理…

vue页面中想在input框用户输入的参数后加单位的方法

<el-form-item label"金重" prop"weight"><el-input v-model"form.weight" placeholder"请输入金重"><template #append><div>g</div></template></el-input></el-form-item>

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…

8086汇编test指令学习

Test指令将两个操作数进行逻辑与运算&#xff0c;并根据运算结果设置相关的标志位。Test的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。 TEST AX,BX 与 AND AX,BX 命令有相同效果&#xff0c;只是Test指令不改变AX和BX的内容&#xff0c;而AND指令会把结果保…

入门超值型32位单片机MM32G0001开发板

灵动微入门级超值型MM32G0001系列MCU。采用48MHz ArmCortex-M0内核&#xff0c;提供16KB Flash和2KB SRAM&#xff0c;并提供丰富的外设资源。适用于多种多样的入门级32位MCU市场&#xff0c;可覆盖广泛的8/16位MCU升级需求。MM32G0001在各种温度范围内的闪存擦写寿命与数据保存…

跟随角色镜头时,解决地图黑线/白线缝隙的三种方案

下面一共三个解决方案&#xff0c;这里我推荐第二个方案解决&#xff0c;因为够快速和简单。 现象&#xff1a; 解决方案一&#xff1a; 参考【Unity2D】去除地图中的黑线_unity选中后有线_香菇CST的博客-CSDN博客&#xff0c;博主解释是因为抗锯齿采样导致的问题。 具体到这…