SSM入门—Spring框架-IOC简单案例

news2024/9/23 3:27:16

目录

控制反转:创建对象

基于XML实现

基于注解实现

依赖注入:对象赋值

通过xml注入


控制反转:创建对象

把对象的创建权交给了Spring容器

基于XML实现

1、maven 导入依赖

<!--Maven会自动添加当前jar依赖的其他jar-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.9.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"
       xmlns:context="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">

        <!-- 1、基于XML实现-->
        <bean id="userInfo" class="com.gxa.pojo.UserInfo"></bean>

</beans>

3、使用测试类获取对象

public static void main( String[] args )
{

    //1.使用ApplicationContext接口,就是在获取spring容器
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring_beans.xml");
    //        UserInfo userInfo = (UserInfo) ac.getBean("userInfo");
    UserInfo userInfo1 = ac.getBean(UserInfo.class);
    System.out.println(userInfo1);
    //
    //        UserInfo userInfo2 = ac.getBean(UserInfo.class);


    //        System.out.println(userInfo1 == userInfo2);


}

运行App.java测试效果:

基于注解实现

在之前的基础上进行修改:

1、(.xml)开启命名空间

xmlns:context="http://www.springframework.org/schema/context"


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

2、(.xml)开启注解扫描

<!-- 2、基于注解实现-->
<!--开启注解扫描-->
<context:component-scan base-package="com.gxa.pojo"></context:component-scan>

3、对需要扫描的类写注解

执行App.java 测试效果:

扩展:

注解使用场景区分

@Repository 数据访问层

@Component 没有任何功能划分时,可以使用

@Service 业务逻辑层代码

@Controller 主要用于控制器

都能创建对象,并交给Spring容器管理

<bean></bean>的其他选项:

懒加载:​lazy-init="true"​

单例模式: scope="singleton"

多例模式:scope="prototype"

单例模式和多例模式的区别

单例通过getbean() 获取的对象是相等的,而多例不相等

依赖注入:对象赋值

目的:给对象赋值

通过xml注入

1、属性注入

前提:set方法存在

又称setter注入: 实则调用的是对象下的set方法

步骤:

1、在类中设置属性,并编写set方法

这里以UserInfo类为例:

2、在xml文件中的<bean></bean>内使用<property></property>标签

3、执行App.java 测试效果

2、构造方法注入

前提:类的有参构造方法存在

步骤:

1、在类中编写有参构造方法

2、在xml文件中的<bean></bean>内使用<constructor-arg></constructor-arg>标签

3、执行App.java 测试效果

常用的是,基于属性注入

扩展:通过注解注入

为实现类提供了两个注解:@Autowired @Resource

@Resource注解和@Autowired注解(面试常考题)

两者的共同点

@Resource注解和@Autowired注解都可以用作bean的注入.

在接口只有一个实现类的时候,两个注解可以互相替换,效果相同.

两者的不同点

@Resource注解是Java自身的注解,@Autowired注解是Spring的注解.

@Resource注解有两个重要的属性,分别是name和type,如果name属性有值,则使用byName的自动注入策略,将值作为需要注入bean的名字,如果type有值,则使用byType自动注入策略,将值作为需要注入bean的类型.如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。即@Resource注解默认按照名称进行匹配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Autowired注解是spring的注解,此注解只根据type进行注入,不会去匹配name.但是如果只根据type无法辨别注入对象时,就需要配合使用@Qualifier注解

制作不易,喜欢就点赞关注吧~

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

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

相关文章

第一章 数据库的操作

第一章 数据库的操作 一、库的操作1、创建数据库&#xff08;1&#xff09;语法&#xff08;2&#xff09;字符集与校验规则a.定义 &#xff08;3&#xff09;创建不同字符集与校验规则的数据库 2、查看数据库&#xff08;1&#xff09;语法&#xff08;2&#xff09;示例 3、显…

自定义类型——结构体,枚举,联合(详,真的太详了)

一.结构体 1.1什么是结构体&#xff0c;结构体如何声明和定义变量&#xff1f; 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 struct 变量名 { 不同类型的成员变量&#xff1b; }&#xff1b; 一定要记得在花括号的后面加上分…

5.4 python内置高阶函数之--map、reduce、filter、sorted

高阶函数满足条件&#xff1a;1、 函数名被作为参数传给另外一个函数2、 函数返回值为另外一个函数&#xff08;返回为自己&#xff0c;则为递归&#xff09;一、 高阶函数&#xff1a;map 【 map函数】说明可以去查看源码&#xff0c; 会发现&#xff1a;map的__init__中有两个…

deeplabv3+源码之慢慢解析 第二章datasets文件夹(3)cityscapes.py--Cityscapes类

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之…

MyBatis-Plus学习总结

目录 1.MyBatis-Plus介绍 2.第一个MyBatis-Plus程序 3.配置日志输出 4. 主键生成策略 4.1 ID_WORKER -- 雪花算法 4.2 主键生成策略 -- 详情 5. 自动填充 6.MyBatis-Plus的CRUD 6.1 insert -- 插入 6.2 delete -- 删除 6.3 update -- 更新 6.4 select -- 查询 7. …

Nacos报错Could not resolve placeholder ‘order.name‘ in value “${order.name}“怎么解决?

出现这个原因有两个&#xff1a; 1.首先在Nacos配置中心&#xff0c;写入yml配置文件的数据和后端服务在取数据的时候名称不一致 如下图&#xff0c;现在我的配置中心为order-service 看看其中的文件内容信息&#xff1a; 再看看后端是怎么取的&#xff1a; 看出上面错误了吗…

Windows Cluster 投票权问题

在日常运维中&#xff0c;如果你的 Windows Cluster 需要升级、重启、意外宕机、网络中断等&#xff0c;你知道该怎么操作才能保证集群的可用性吗&#xff1f;按什么样的顺序怎样关闭或启动集群节点吗&#xff1f;怎么快速恢复你的集群呢&#xff1f; 接下来&#xff0c;我们就…

【C++ 重要知识点总结】STL字符串向量

字符串、向量和数组 这里讲的是 C中的处理&#xff0c;置于 C 中的字符串向量和数组&#xff0c;可以自己去复习。 1 命名空间的 using 声明 基本使用 //独立使用名字 using namespace::name; //声明空间 using namespace使用规则 头文件中不应包含 using 声明。因为会破坏包…

组合数学相关知识总结(适合复习用)

全排列 例子&#xff1a; n n n 个数取 m m m 个数有序排放 通项公式&#xff1a; A n m ( P n m ) n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ⋅ ⋅ ⋅ ∗ ( n − m 1 ) n ! ( n − m ) ! A_n^m(P_n^m)n*(n-1)*(n-2)**(n-m1) \frac{n!}{(n-m)!} Anm​(Pnm​)n∗(n−1)∗(n−2)∗…

[QT编程系列-12]:QT快速学习 - 0 - 主要内容

第0章 主要内容 0.1 QT的主要内容 附录&#xff1a; Qt 是一个功能强大的应用程序开发框架&#xff0c;涵盖了广泛的知识点。以下是一些常见的 Qt 知识点&#xff1a; 基本概念和特性&#xff1a;了解 Qt 的基本概念&#xff0c;如信号和槽、事件处理、对象模型、元对象系统等…

Python基础合集 练习27 (turtle函数使用)

import turtle as t 画笔控制工具 t.penup() 表示画笔抬起 海龟在天上飞 不能直接形成图形 t.pendown() 画笔落下 海龟降下来 t.pensize(15) 也可以用 t.width() 画笔宽度 t.pencolor(“red”) 画笔颜色 为颜色字符串或rgb值 运动控制函数 控制行进方向、走曲线或…

二进制文件的Python写入

二进制文件的Python编写 这么基础的东西&#xff0c;必然用内置的就好 二进制文件的Python读写 重要提示 p.s. 1 >>> bHello World.decode() "Hello World" True >>> example import struct with open(binary_file.bin, wb) as file:data b…

【cfengDB】自己实现数据库第0节 ---整体介绍及事务管理层实现

LearnProj 内容管理 MySQL系统结构一条SQL执行流程 cfengDB整体结构事务管理TM模块TID文件规则定义文件读写 -- NIORandomAccessFile、FileChannel、ByteBuffer接口实现文件合法检测begin()commit(tid)rollback(tid)tid文件创建 本文作为数工底层的项目CfengDB开始篇章&#xf…

vue 升级3 +vite+antdv4

目录 一、安装包相关升级 二、vite.config 三、 入口文件修改 四、App.vue 及相关升级 五、路由 六、状态管理VUEX 一、安装包相关升级 升级pakage.json相关安装包 vue2插件vue3替换插件vue2使用vue3使用vue-ls vuex-persistedstate或vuex-persistVue.ls.get() Vue.ls.…

C++ 多线程学习总结

C 多线程 创建线程 thread jion与detach方式的区别 jion方式&#xff1a;必须等待创建并启动的子线程任务执行完毕&#xff0c;才会继续往下执行。 示例&#xff1a; #include <stdio.h> #include <unistd.h> #include <iostream> #include <string&g…

【企业架构实践】要避免的 7 个企业架构错误

颠覆性时代需要有弹性、前瞻性的企业架构。不要让错误的框架破坏您的组织实现当前和未来目标的能力。 企业架构为成功的业务 IT 计划奠定了基础。如果设计和实施得当&#xff0c;企业架构将帮助业务领导者实现他们的目标&#xff0c;使组织变得更具响应性、效率和竞争力。 不幸…

matlab使用教程(2)—数组索引、工作区与字符

1数组索引 MATLAB 中的每个变量都是一个可包含许多数字的数组。如果要访问数组的选定元素&#xff0c;请使用索引。 例如&#xff0c;假设有 44 矩阵 A &#xff1a; A [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16] A 44 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 引…

python selenium.webdriver 爬取政策文件

文章目录 获取文章链接批量爬取政策文件应用selenium爬取文件信息数据处理导出为excel 获取文章链接 获取中央人民政府网站链接&#xff0c;进入国务院政策文件库&#xff0c;分为国务院文件和部门文件&#xff08;发改委、工信部、交通运输部、市场监督局、商务部等&#xff…

JavaScript 中 五种迭代数组的方法 every some map filter forEach

JavaScript 中 五种迭代数组的方法 every some map filter forEach 1.every 和 some2.filter (重点常用)3.map (灵活常用&#xff09;4.forEach (重点常用) ECMAScript 提供了 5个对数组的迭代方法 1.every() 2.some() 3.filter() 4.forEach() 5.map() 1.every 和 some every…

串联型PI和并联型PI调节器的比较

一、PI调节器的种类 图3-4 仿真波形变化情况&#xff08;串联型PI调节器&#xff0c;1500r/min&#xff09; 从图3-1到3-4比较可知&#xff0c;与并联型PI调节器相比&#xff0c;串联型PI调节器的超调量很小&#xff08;速度环&#xff09;&#xff0c;且动态过程时间短&…