spring:详解控制反转IOC和AOP

news2024/11/16 21:53:47

文章目录

    • 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/1078037.html

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

相关文章

【SoC FPGA】HPS启动过程

SoC HPS启动流程 Boot ROMPreloaderBoot Loader HPS的启动是一个多阶段的过程&#xff0c;每一个阶段都会完成对应的工作并且将下一个阶段的执行代码引导起来。每个阶段均负责加载下一个阶段。第一个软件阶段是引导 ROM&#xff0c;引导 ROM 代码查找并且执行称为预加载器的第 …

TCP协议总结

一、TCP协议概念。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。它主要用于在计算机网络中&#xff0c;通过建立可靠的通信连接来进行数据传输。 TCP协议的特点如下&#xff1a; 可靠性&#xf…

【Linux C】Linux如何执行一个程序(程序存储空间、系统调用、内核调用)

文章目录 一、程序存储空间1.1 C语言程序存储空间1.2 用户空间和内核空间1.3 用户模式和内核模式 二、内核调用-系统调用-C语言库函数2.1 系统调用和内核调用2.2 C语言库函数 三、Linux如何执行一个程序 一、程序存储空间 本节说的空间主要是指内存空间&#xff0c;即程序如何分…

【STM32 中断】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STM32中断 前言一、STM32的中断如何&#xff1f;如何管理这么复杂的中断&#xff1f;实际优先级如下怎么使用呢&#xff1f; 二、使用步骤1.引入库函数先分组&#xff0c;怎么…

Gin 文件上传操作(单/多文件操作)

参考地址: 单文件 | Gin Web Framework (gin-gonic.com)https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/ 单文件 官方案例: func main() {router := gin.Default()// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)router.MaxMultipartMem…

IP协议总结

一、定义。 IP全称为Internet Protocol&#xff0c;是TCP/IP协议族中的一员&#xff0c;负责实现数据在网络上的传输。它是一种无连接、不可靠的数据报协议。 IP协议常用于Internet网络和局域网中&#xff0c;它通过将数据包进行分组并进行逐跳转发来实现数据在网络中的传输。…

Android App备案获取公钥、签名MD5值

1.生成签名文件 keytool -genkey -alias 别名XXX -keypass 密码XXX -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\XXX.keystore -storepass 密码XXX2.查看签名MD5值 keytool -list -v -keystore D:\XXX.keystore3.查看公钥 导出证书XXX.cer keytool -export -a…

小程序分销商城有哪些功能?

越来越多的企业&#xff0c;开始打造商城小程序&#xff0c;想要利用商城小程序功能来进行转型升级&#xff0c;那么商城小程序功能有哪些&#xff0c;[可R]下面就来分享一下商城小程序功能有哪些&#xff1f;常用小程序商城功能介绍&#xff1b; 1.产品展示功能&#xff1a;产…

DataGrip导出和导入文件

导出文件后用excel打开 发现乱码。解决办法&#xff1a; DataGrip导出CSV文件中文乱码 | 一个博客 (imguan.com) 再次导入进行测试

java - 设计模式 - 状态模式

文章目录 前言java - 设计模式 - 状态模式1. 概述2. 作用3. 示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xf…

CDGA数据治理工程师考试心得

2023年8月初&#xff0c;准备备考CDGA。当时也是很迷茫&#xff0c;啥时候考试都不知道&#xff0c;也不知道该怎么做。写这篇文章的目的也只是记录一下。 1.什么是CDGA? CDGA就是数据治理工程师&#xff08;Certified Data Governance Associate&#xff09;&#xff0c;“D…

【安鸾靶场】cmseasy内网渗透 (500分)

文章目录 题目一、渗透开始后台执行rce漏洞内网横向 题目 一、渗透开始 上burp后没有报漏洞&#xff1a; /admin存在后台&#xff1a; 爆破一下&#xff1a; admin admin123 后台执行rce漏洞 POC&#xff1a; 1111111111";}<?php phpinfo()?> 触发漏洞&#xf…

公众号运营重要策略-公众号排名优化

排名优化一直以来都是公众号运营的重要策略之一。公众号作为连接用户和商家的桥梁&#xff0c;其排名的高低直接影响着曝光量和用户关注度&#xff0c;因此公众号排名优化是每个运营者必须掌握的技能之一。本文将从以下几个方面&#xff0c;为大家深入剖析公众号排名优化的技术…

CCF CSP认证 历年题目自练Day27

题目一 试题编号&#xff1a; 202104-1 试题名称&#xff1a; 灰度直方图 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 样例输入 7 11 8 0 7 0 0 0 7 0 0 7 7 0 7 0 7 0 7 0 7 0 7 0 7 7 0 0 0 7 0 0 0 7 0 7 7 0 0 0 0 7 0 0 7 7 0 7 0 0 0 0 0 7 0 7 0 0 7 0 …

MySQL对日期计算

mysql日期计算 前言使用场景一 日期作减法操作二 获取前一天或后一天的日期三 获取前一个月或后一个月的日期四 获取前一年或后一年的日期五 查询一个月内的申请记录 总结 前言 在MySQL中&#xff0c;日期计算是非常常见的操作。其中&#xff0c;日期减法操作可以用来计算两个…

PTE DESCRIBE IMAGE做题方法 (一)

目录 界面切换来判断 到了哪一种题目 说废话 还是会给流利度加分 回答问题的时候想想哪些不说 必定是不行的呢 事先会预计学生会说些什么 鱼池理论 1st:Ttle.Unit,Legends.非说不可2nd:X-axis.Y-axis. 多多益善3 rd:Extra information(implications&development)不…

滚雪球学Java(45):探秘Java Runtime类:深入了解JVM运行时环境

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

《深入理解计算机系统》(2):虚拟内存

虚拟内存是一种对主存的抽象概念。 &#xff08;1&#xff09;将主存看作一个存储在磁盘上的地址空间的高速缓存&#xff0c;在主存中只保存活动区域&#xff0c;并根据需要在磁盘和主存之间来回传送数据&#xff0c;通过这种方式高效地使用内存 &#xff08;2&#xff09;为每…

30天入门Python(基础篇)——第4天:Python中的【输入】+【数据类型】的认识(万字建议点赞收藏)

文章目录 专栏导读上节课回顾Python中的输入Python中的数据类型1、可变数据类型2、不可变数据类型 如何查看一个变量(数据)的变量类型字符串&#xff08;str不可变&#xff09;整数&#xff08;int不可变&#xff09;浮点数&#xff08;float不可变&#xff09;列表&#xff08…

```,```中间添加 # + 空格 + 空行后遇到的底部空行出错,书接上回,处理空行

【python查找替换&#xff1a;查找空行&#xff0c;空行前后添加&#xff0c;中间添加 # 空格 空行后遇到的第1行文字&#xff1f; - CSDN App】http://t.csdnimg.cn/QiKCV def is_blank(line):return len(line.strip()) 0txt 时间戳&#xff1a; ("%Y-%m-%d %H:%M:…