spring:详解控制反转IOC

news2024/11/21 2:26:41

文章目录

    • IOC
      • 工厂模式
      • 实例
      • 基于xml管理Bean
      • 基于注解管理Bean
        • 常用注解:用于创建对象的
        • 常用注解:用于注入数据的
        • 常用注解:和生命周期相关的(了解)
        • 常用注解:新注解

IOC

IOC (Inversion of Control)是Spring的核心概念之一。它是指控制反转,它改变了程序员的编程习惯,将应用程序的控制权从应用程序代码中转移到IoC容器中,使应用程序变得更加灵活和易于维护。Spring中的IoC容器充当了控制权的中心,通过配置文件或注解,容器将对象实例化、组装和配置,然后将它们提供给应用程序代码使用。

DI:Dependency Injection,中文意思是依赖注入。依赖注入(DI)是实现控制反转的一种方式,它通过容器自动将所需的依赖关系注入到对象中,从而实现对象之间的解耦。在Spring中,依赖注入可以通过XML配置文件或注解方式来实现。

关于XML方式和注解的方式创建和使用java bean,我们一般使用注解的方式,java bean 可以理解为 js 中的对象,类似这样:

package cn.itcast.domain;

public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

作用:解耦

我结合我常用 js 的方式说一下我理解的IOC,在 js 中我们习惯用函数式编程来解耦我们的程序,函数式其实就是让依赖由函数传入,而不是在函数内部获取。其实和IOC一样,IOC也是让依赖从外部获取,这里的注入的依赖 userService
@Autowired
private UserService userService;
其实就是js函数里的形参 function (userService) {}。

工厂模式

本来我们直接用 new 的方式会让 app 和资源是直接依赖的无法消除,而使用 ioc 我们让 app 问工厂要资源,工厂去控制资源的调度。这种控制权发生的转移我们就叫控制反转。
在这里插入图片描述

实例

例如,假设我们有一个名为UserService的类,它需要与数据访问对象(DAO)进行交互。如果我们将UserService与DAO紧密耦合在一起,那么每次需要修改数据访问的实现时,就需要修改UserService的实现。而如果我们使用控制反转,则可以将DAO的实现作为一个bean注入到UserService中,这样UserService只需要关注其需要的数据访问操作,而不需要关注具体的DAO实现。

@Service  
public class UserService {  
  
    @Autowired  
    private UserDao userDao;  
  
    public List<User> getAllUsers() {  
        return userDao.getAll();  
    }  
  
    public User getUserById(int id) {  
        return userDao.getUserById(id);  
    }  
  
    // Other methods...  
}

在上述代码中,UserService类通过@Autowired注解将UserDao类的实例注入到自身中,从而避免了直接在UserService类中创建UserDao实例。这是控制反转的一个基本例子,它通过将对象的创建和管理交给了Spring容器来降低类之间的耦合度。

基于xml管理Bean

一般很少用

基于注解管理Bean

注解的概念:和XML文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。

但是追根本源:所有一切的操作都是由Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行。

常用注解:用于创建对象的

使用@Component注解标记普通组件(相当于在 xml 中配置一个 bean,属性
value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。)

import org.springframework.stereotype.Component;

@Component
public class CommonComponent {
}

使用@Repository注解标记持久化层组件

import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {

}

使用@Service注解标记业务逻辑组件

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
}

使用@Controller注解标记控制层组件

import org.springframework.stereotype.Controller;@Controller
public class UserController {
}

我们可以点进去查看源码,我们会发现:@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字。对于Spring的IOC容器来说,这三个组件本质上没有什么区别,而他们的的作用主要是来提高代码的可读性。

常用注解:用于注入数据的

@Autowired、@Qualifier、@Resource和@Value是Spring框架中常见的注解,它们的区别主要有以下几点:

@Autowired和@Qualifier:这两个注解都是Spring的注解,用于自动装配bean。@Autowired用于自动装配bean,@Qualifier用于指定在存在多个相同类型的bean时,注入哪一个bean。
@Resource:这个注解属于J2EE的注解,用于自动装配bean。默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。使用这个注解,需要在J2EE环境中才能使用。
@Value:这个注解是Spring框架的注解,用于注入基本类型和String类型的值。这个注解有一个value属性,用于指定数据的值。可以使用Spring中的SpEL(也就是Spring的EL表达式)来定义复杂的表达式。这个注解不能用于装配bean,只能用于注入值。
总结起来,这四个注解的作用各不相同,@Autowired和@Qualifier主要用于自动装配bean,@Resource主要用于在J2EE环境中自动装配bean,而@Value主要用于注入基本类型和String类型的值。

在成员变量上使用@Autowired注解来完成自动装配
在controller层装配Service

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    public void add(){
        userService.add();
    }
}

在这个例子中,我们有两个同类型的SomeService bean,通过@Qualifier注解指定我们想要注入的bean的名称。

@Configuration  
public class AppConfig {  
  
    @Bean  
    @Qualifier("someService1")  
    public SomeService someService1() {  
        return new SomeService();  
    }  
  
    @Bean  
    @Qualifier("someService2")  
    public SomeService someService2() {  
        return new SomeService();  
    }  
  
    @Autowired  
    @Qualifier("someService2")  
    private SomeService someService;  
}
常用注解:和生命周期相关的(了解)

@PostConstruct:用于指定初始化方法。
@PreDestroy:用于指定销毁方法。

常用注解:新注解

@ComponentScan
用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
<context:component-scan base-package="com.itheima"/> 是一样的。

@Configuration
@ComponentScan("com.itheima")
public class SpringConfiguration {
}

我们已经配置好了要扫描的包,但是数据源和 JdbcTemplate 对象如何从配置文件中移除呢?

@Bean:
该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。

@PropertySource:
用 于 加载 .properties 文件 中的 配置 。 例如 我们 配置 数据 源时 , 可以 把连 接数 据库 的信 息 写 到
properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
属性:
value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:

public class JdbcConfig {
	@Value("${jdbc.driver}")
	private String driver;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
	/**
	* 创建一个数据源,并存入 spring 容器中
	* @return
	*/
	@Bean(name="dataSource")
	public DataSource createDataSource() {}
}
jdbc.properties 文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/day44_ee247_spring

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

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

相关文章

智能电表消磁复位怎么回事

随着科技的发展的不断进步&#xff0c;智能电表已经成了家家户户用电管理的左膀右臂。相对于传统电表&#xff0c;智能电表具备远程控制读值、实时监控系统、自动控制系统等服务&#xff0c;不但能有效提高电气安全&#xff0c;还有助于客户节约能源。但是&#xff0c;智能电表…

从零开始探索C语言(十一)----共用体和位域

文章目录 1. 共用体1.1 定义共用体1.2 访问共用体成员 2. 位域2.1 位域声明2.2 位域的定义和位域变量的说明2.3 位域的使用2.4 位域小结 1. 共用体 共用体是一种特殊的数据类型&#xff0c;允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体&#…

Vuex基础使用存取值+异步请求后台

目录 一、Vuex简介 1.1 定义 1.2 Vuex关键概念 1.3 使用Vuex的优势 1.4 Vuex中各个js文件的用途 1.5 Vuex各组件 1.5.1 图解 1.5.2 详解 1.6 变量传值的演变形式 二、Vuex获取值 2.1 安装 2.2 菜单栏 2.3 模块 2.4 引用 三、Vuex改变值 四、Vuex异步&请求后台…

Jmeter性能测试之生成测试报告详解

结构 测试计划 测试计划是顶级的层级⽬录的结构&#xff0c; 那么在这样的⽬录结构中&#xff0c;⾥⾯可以包含很多线程组 线程组 线程组我们可以简单的理解为postman测试⼯具⾥⾯的collection&#xff0c;那么在整体线程组⾥⾯&#xff0c;可以添加很多的测试 ⽤例 简单控…

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商?

北京股票开户的佣金手续费是多少?北京股票开户选择哪家券商? 股票注册开户是非常简单的&#xff0c;在2015年前也就是互联网还不发达的时候&#xff0c;投资者只能去券商的营业部柜台办理&#xff0c;而自从各大券商都可以网上开户后&#xff0c;更多的投资者会选择网上开户…

红队专题-从零开始VC++远程控制软件RAT-C/S-[1]远控介绍及界面编写

红队专题 招募六边形战士队员[1]---远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境&#xff1a;3.界面编程新建项…

2023年中国滑雪设备行业分析:随着滑雪运动人数增加,产品需求不断提升[图]

滑雪设备行业是指生产各种滑雪设备的行业。这些设备包括滑雪板、雪杖、雪鞋、滑雪杆、滑雪头盔、滑雪镜等。这些设备广泛应用于滑雪运动和相关活动&#xff0c;为滑雪者提供安全、舒适和高效的体验。 滑雪设备行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&am…

ITSS云能力评估是什么?

一、ITSS云服务能力评估是什么为了提升云计算产品&#xff08;系统&#xff09;的服务能力&#xff0c;保证云计算服务质量&#xff0c;以GB/T 36326-2018《信息技术云计算云服务运营通用要求》等系列国家标准为依托&#xff0c;由中国电子工业标准化技术协会信息技术分会&…

HashMap(2)正文源码分析

序、慢慢来才是最快的方法。 1.简介 HashMap的底层结构是基于分离链表发解决散列冲突的动态散列表。 在Java7中使用数组链表&#xff0c;发生散列冲突的键值对会使用头插法添加到单链表中&#xff1b;在Java8中使用数组链表红黑树&#xff0c;发生散列冲突的键值对会用尾插发…

面试算法23:两个链表的第1个重合节点

题目 输入两个单向链表&#xff0c;请问如何找出它们的第1个重合节点。例如&#xff0c;图4.5中的两个链表的第1个重合节点的值是4。 分析 首先遍历两个链表得到它们的长度&#xff0c;这样就能知道哪个链表比较长&#xff0c;以及长的链表比短的链表多几个节点。在第2次遍…

Java基础面试-JDK JRE JVM

详细解释 JDK&#xff08;Java Devalpment Kit&#xff09;java 开发工具 JDK是Java开发工具包&#xff0c;它是Java开发者用于编写、编译、调试和运行Java程序的核心组件。JDK包含了Java编程语言的开发工具和工具集&#xff0c;以及Java标准库和其他一些必要的文件。JDK中的…

QTableWidget 表格部件

QTableWidget是QT中的表格组件类。一般用来展示多行多列的数据&#xff0c;是QT中使用较多的控件之一。1、QTableWidgetItem对象 QTableWidget中的每一个单元格都是一个QTableWidgetItem对象&#xff0c;因此先介绍下QTableWidgetItem的常用方法。 1.1、设置文本内容 void QT…

陪诊系统|陪诊系统开发|陪诊小程序开发指南

随着移动互联网的快速发展&#xff0c;陪诊小程序的出现为医疗服务行业带来了全新的便捷体验。无需排队、无需等待&#xff0c;只需轻轻一点&#xff0c;陪诊小程序即可为患者提供全方位的陪诊服务。本文将为您介绍陪诊小程序的开发流程和其功能特点&#xff0c;帮助您了解并投…

java模拟GPT流式问答

流式请求gpt并且流式推送相关前端页面 1&#xff09;java流式获取gpt答案 1、读取文件流的方式 使用post请求数据&#xff0c;由于gpt是eventsource的方式返回数据&#xff0c;所以格式是data&#xff1a;&#xff0c;需要手动替换一下值 /** org.apache.http.client.metho…

如何选择适合您需求的SOCKS5代理

SOCKS5协议是最新版本的SOCKS协议&#xff0c;它带来了一系列重要特点&#xff0c;相对于SOCKS4来说引入了许多重要特性&#xff1a; 1. 更多身份验证选项&#xff1a; SOCKS5通过更完整的TCP连接和SSH隧道方法路由流量&#xff0c;支持多种身份验证方法&#xff0c;增强了安全…

竞赛选题 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

干货分享|腾讯内部项目管理PPT

我是胖圆&#xff0c;欢迎大家关注留言~ 或者移步公众号【胖圆说PM】找我~

HashMap -- 调研

HashMap 调研 前言JDK1.8之前拉链法: JDK1.8之后JDK1.7 VS JDK1.8 比较优化了一下问题: HashMap的put方法的具体流程?HashMap的扩容resize操作怎么实现的? 前言 在Java中&#xff0c;保存数据有两种比较简单的数据结构:数组和链表。 数组的特点是:寻址容易&#xff0c;插入…

Java实现防重复提交,使用自定义注解的方式

目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证 6.总结 1.背景 在进行添加操作时&#xff0c;防止恶意点击&#xff0c;后端进行请求接口的防重复提交 2.思路 通过拦截器搭配自定义注解的方式进行实现&#xff0c;拦截器拦截请求&#xff0c;使…

如何在 Keras 中开发具有注意力的编码器-解码器模型

link 【翻译自 &#xff1a; How to Develop an Encoder-Decoder Model with Attention in Keras 】 【说明&#xff1a;Jason Brownlee PhD大神的文章个人很喜欢&#xff0c;所以闲暇时间里会做一点翻译和学习实践的工作&#xff0c;这里是相应工作的实践记录&#xff0c;…