Android中的MVVM架构:使用Jetpack组件实现现代化的应用架构

news2025/1/14 1:07:48

Android中的MVVM架构:使用Jetpack组件实现现代化的应用架构

Jetpack组件是构建现代Android应用的绝佳利器,组件化设计让构建App如此简单。

引言

mvvm

随着移动应用的日益复杂和功能的不断增加,构建稳健、可扩展和易维护的Android应用变得越来越重要。在应对这一挑战时,选择合适的应用架构是至关重要的。MVVM(Model-View-ViewModel)架构作为一种现代化的应用架构,在Android应用开发中变得越来越流行。

MVVM架构通过将应用分为三个主要组件:Model、View和ViewModel,并定义它们之间的关系,实现了应用的解耦和高内聚。Model负责处理数据和业务逻辑,View负责用户界面的展示,ViewModel作为View和Model之间的中介,负责管理UI状态和处理用户交互。这种分离关注点的架构设计可以使应用更加模块化、可测试和易维护。

MVVM架构在Android应用中具有许多优点。首先,它可以帮助开发人员将业务逻辑和UI逻辑分开,使代码更加清晰和易于维护。其次,MVVM架构通过使用观察者模式和数据绑定,实现了响应式编程,使UI能够自动更新以反映数据的变化,从而提供了更好的用户体验。此外,MVVM架构还支持单向数据流,使得数据的流动更加明确和可控,降低了bug的产生和维护成本。

为了实现MVVM架构,Google提供了一套强大的Jetpack组件,包括LiveData、ViewModel和Data Binding等。这些组件可以帮助开发人员更轻松地实现MVVM架构,并提供了许多现代化的开发工具和技术。在本文中,我们将深入介绍MVVM架构的概念和优势,并重点介绍Jetpack组件在实现现代化的Android应用架构中的作用。让我们一起探索如何使用MVVM架构和Jetpack组件构建更加先进和高效的Android应用。

MVVM架构介绍

mvvm arch

MVVM架构是一种基于数据绑定的架构模式,它将应用程序分为三个主要组件:Model、View和ViewModel。每个组件有着不同的职责和功能:

Model:负责处理数据层的逻辑,包括数据的获取、存储和处理等。它可以是数据库、网络接口、API等。

View:负责用户界面的展示和用户输入的处理。它可以是Activity、Fragment、XML布局文件等。

ViewModel:负责处理View和Model之间的交互,将Model中的数据进行处理和转换后提供给View进行展示,同时接收View中的用户输入并进行处理。ViewModel与View之间通过数据绑定进行通信。

MVVM架构的优点:

分离关注点:MVVM架构将数据处理和界面展示分离,使得代码更加清晰和易于维护。Model负责数据逻辑,View负责界面展示,ViewModel负责处理业务逻辑,将三者解耦。

提高代码复用性:由于ViewModel负责处理业务逻辑,因此业务逻辑可以在不同的View中复用,从而减少了代码的重复编写。

实现松耦合:MVVM架构通过数据绑定实现了View和ViewModel之间的松耦合。View不再直接与Model交互,而是通过ViewModel进行数据绑定和事件处理,从而实现了更加灵活和可扩展的架构。

MVVM架构在Android应用开发中有着广泛的应用,它可以提供更好的代码组织和项目结构,使得应用更加易于维护和扩展。

Jetpack组件介绍

mvvm arch

Android Jetpack是一套官方提供的用于简化Android应用开发的库集合,其中包含了很多组件,可以帮助开发者构建现代化的Android应用。在MVVM架构中,Jetpack组件提供了一些关键的组件,包括LiveData、ViewModel和Data Binding,它们在实现MVVM架构中起着重要的作用。

LiveData:LiveData是一种具有生命周期感知能力的数据持有者,它可以在数据发生变化时通知观察者。LiveData可以感知Activity、Fragment等组件的生命周期,当这些组件处于活跃状态时,LiveData会自动更新数据并通知观察者,从而确保数据的一致性和安全性。LiveData在MVVM架构中作为ViewModel与View之间的桥梁,负责将Model中的数据通过观察者模式通知给View进行展示。

ViewModel:ViewModel是用于存储和管理与UI相关的数据的类,它负责处理View和Model之间的交互。ViewModel通常与某个特定的View关联,当View被销毁并重新创建时,ViewModel会保持其数据的状态。ViewModel可以在View中进行数据绑定,将Model中的数据通过LiveData暴露给View,并处理View中的用户输入和事件,从而将业务逻辑从View中解耦。

Data Binding:Data Binding是一种用于将布局文件中的UI组件与数据绑定的库,它可以使得在布局文件中直接使用数据对象的属性和方法。Data Binding可以帮助开发者简化布局文件中的代码,避免了繁琐的findViewById和手动设置数据的过程。在MVVM架构中,Data Binding可以与LiveData和ViewModel结合使用,实现数据的双向绑定,从而让UI自动更新,保持与Model中数据的同步。

Jetpack组件中的LiveData、ViewModel和Data Binding可以协同工作,使得MVVM架构在Android应用开发中更加容易实现和维护。

使用LiveData实现响应式编程

mvvm arch

LiveData是Jetpack组件中的一个关键组件,它可以帮助我们实现在MVVM架构中的响应式编程,从而使得数据的观察和更新变得简单和高效。

  1. LiveData概述:LiveData是一种具有生命周期感知能力的数据持有者,它可以在数据发生变化时通知观察者。LiveData可以自动处理生命周期,当观察者处于活跃状态时,LiveData会更新数据并通知观察者;当观察者处于非活跃状态时,LiveData会停止更新,从而避免不必要的资源消耗和数据更新。LiveData还可以处理配置变化导致的Activity和Fragment的重建,确保数据的一致性和安全性。

  2. LiveData的使用:在MVVM架构中,LiveData通常用于将Model中的数据通过ViewModel暴露给View进行展示。ViewModel可以持有LiveData对象,并通过观察者模式将LiveData的数据更新通知给View,从而实现数据的观察和响应式编程。LiveData提供了一些方法用于观察数据的变化,包括observe()、observeForever()和observeOnce()等,可以根据业务需求选择合适的方法。

  3. LiveData的最佳实践:在使用LiveData时,有一些最佳实践可以帮助我们写出高效和可维护的代码。例如,应该将LiveData的更新逻辑放在ViewModel中,避免将LiveData暴露给View层直接操作;应该合理使用线程调度器,将耗时的操作放在后台线程进行,避免阻塞UI线程;应该使用Transformation和MediatorLiveData等LiveData的扩展功能,优化数据的处理逻辑;应该使用合适的观察者策略,避免内存泄漏等。

下面是一个示例代码,展示了如何使用LiveData实现数据的观察和响应式编程:

// 定义一个LiveData对象
val userLiveData = MutableLiveData<User>()

// 在ViewModel中更新LiveData的数据
fun updateUser(user: User) {
    userLiveData.value = user
}

// 在View中观察LiveData的数据更新
viewModel.userLiveData.observe(viewLifecycleOwner, { user ->
    // 更新UI界面
    binding.tvUserName.text = user.name
    binding.tvUserAge.text = user.age.toString()
})

通过使用LiveData,我们可以简化数据的观察和更新过程,避免手动刷新UI和处理生命周期的复杂逻辑,从而提高代码的可维护性和稳定性。在下一部分中,我们将介绍如何使用ViewModel来管理UI相关的数据和业务逻辑。

使用ViewModel管理UI状态

Jetpack

ViewModel是Jetpack组件中的另一个关键组件,它可以帮助我们在MVVM架构中有效地管理UI状态和业务逻辑,从而实现UI和数据的分离。

  1. ViewModel概述:ViewModel是一种设计用于持有UI相关的数据和业务逻辑的类。ViewModel可以在配置变化导致的Activity或Fragment的重建时保持数据的一致性,确保UI状态的稳定性。ViewModel也可以与LiveData一同使用,实现数据的观察和响应式编程。ViewModel不持有UI的引用,从而避免了内存泄漏的问题。

  2. ViewModel的使用:在MVVM架构中,ViewModel通常用于将Model中的数据和业务逻辑暴露给View进行展示和操作。ViewModel可以在需要的时候通过LiveData将数据更新通知给View,从而实现UI和数据的分离。ViewModel还可以持有一些UI状态,例如加载中、错误状态等,从而帮助View进行状态管理和错误处理。ViewModel的生命周期通常与Activity或Fragment绑定,当它们被销毁时,ViewModel会自动被清理。

  3. ViewModel的最佳实践:在使用ViewModel时,有一些最佳实践可以帮助我们写出高效和可维护的代码。例如,应该避免在ViewModel中持有Context或View的引用,以免导致内存泄漏;应该合理使用LiveData来进行数据的观察和更新,避免频繁的UI刷新;应该将业务逻辑封装在ViewModel中,避免将复杂的逻辑放在View层;应该使用ViewModel的扩展功能,例如SavedStateHandle来实现数据的状态保存和恢复。

下面是一个示例代码,展示了如何使用ViewModel来管理UI状态和业务逻辑:

class UserViewModel : ViewModel() {
    // 定义LiveData来持有用户信息
    private val _userLiveData = MutableLiveData<User>()
    val userLiveData: LiveData<User> get() = _userLiveData

    // 定义UI状态
    private val _loadingLiveData = MutableLiveData<Boolean>()
    val loadingLiveData: LiveData<Boolean> get() = _loadingLiveData

    // 定义业务逻辑
    fun fetchUserData(userId: Int) {
        // 更新UI状态为加载中
        _loadingLiveData.value = true

        // 模拟从网络请求用户信息
        // ...

        // 更新用户信息并通知UI更新
        _userLiveData.value = user
        // 更新UI状态为加载完成
        _loadingLiveData.value = false
    }
}

// 在View中观察ViewModel的LiveData和UI状态
viewModel.userLiveData.observe(viewLifecycleOwner, { user ->
    // 更新UI界面
    binding.tvUserName.text = user.name
    binding.tvUserAge.text = user.age.toString()
})

viewModel.loadingLiveData.observe(viewLifecycleOwner, { isLoading ->
    // 更新UI状态
    if (isLoading) {
        binding.progressBar.visibility =
View.VISIBLE
} else {
binding.progressBar.visibility = View.GONE
}
})

在上面的示例中,UserViewModel是一个继承自ViewModel的类,用于管理用户信息和UI状态。ViewModel中通过LiveData持有用户信息和加载状态,并在需要的时候通知View进行更新。View中通过观察ViewModel的LiveData和UI状态来更新UI界面和UI状态,从而实现了UI和数据的分离,并且可以实现响应式编程的效果。

使用ViewModel来管理UI状态的最佳实践包括:

  • 将UI状态和业务逻辑封装在ViewModel中,避免将复杂的逻辑放在View层。
  • 合理使用LiveData来进行数据的观察和更新,避免频繁的UI刷新,提高性能。
  • 避免在ViewModel中持有Context或View的引用,以免导致内存泄漏。
  • 使用ViewModel的扩展功能,例如SavedStateHandle来实现数据的状态保存和恢复。

通过合理地使用ViewModel来管理UI状态,可以使得MVVM架构更加清晰和可维护,提高应用的性能和稳定性。

使用Data Binding实现数据绑定

mvvm ui

Data Binding是一种用于在布局文件中绑定数据和事件的库,它可以将布局文件和数据模型绑定在一起,从而实现了UI和数据的自动更新和解耦。在MVVM架构中,Data Binding是一个强大的工具,可以使得View和ViewModel之间的通信更加简单和高效。

Data Binding的使用步骤包括以下几个步骤:

  1. 添加Data Binding依赖:在项目的build.gradle文件中添加Data Binding的依赖。
android {
    ...
    dataBinding {
        enabled = true
    }
}

  1. 创建数据模型:创建一个数据模型类,用于保存UI需要展示的数据。
data class User(val name: String, val age: Int)

  1. 创建布局文件:在布局文件中使用Data Binding的语法来绑定数据。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="user"
            type="com.example.viewmodel.User" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.age)}" />
    </LinearLayout>
</layout>

在布局文件中,我们使用标签来定义数据模型的变量,然后在UI控件中使用@{}语法来绑定数据。这样,当数据模型发生变化时,UI界面会自动更新。

  1. 创建Data Binding实例:在Activity或Fragment中创建Data Binding的实例,并将布局文件与数据模型进行绑定。
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.user = userViewModel.user

在上面的示例中,我们通过DataBindingUtil.setContentView()方法来将布局文件与Data Binding实例进行绑定,并将数据模型传递给Data Binding实例的user变量。

通过使用Data Binding,我们可以实现数据和UI的绑定,从而实现了UI的自动更新和解耦。同时,Data Binding还提供了其他强大的功能,例如双向绑定、表达式和事件处理等,可以进一步简化UI和数据的交互,提高开发效率。

以下是使用Data Binding的一些最佳实践:

  • 使用标签定义数据模型的变量,并在布局文件中使用@{}语法来绑定数据。
  • 使用DataBindingUtil类来创建Data Binding实例,并将布局文件与数据模型进行绑定。
  • 避免在布局文件中放置复杂的逻辑,将复杂的逻辑放在ViewModel中处理。

MVVM架构实践示例

mvvm

下面通过一个简单的示例来演示如何使用Jetpack组件实现MVVM架构,并展示如何使用LiveData、ViewModel和Data Binding来实现现代化的应用架构。

示例场景:
假设我们有一个简单的用户管理应用,需要展示用户的列表,并且可以点击列表项查看用户的详细信息。

创建数据模型:

  1. 首先,我们创建一个数据模型类User,用于表示用户的基本信息。
data class User(val id: Int, val name: String, val age: Int)

  1. 创建Repository:
    接着,我们创建一个Repository类UserRepository,用于从数据源获取用户数据。
class UserRepository {
    private val userList = mutableListOf<User>()

    init {
        // 模拟从数据源获取用户数据
        for (i in 1..10) {
            userList.add(User(i, "User $i", 20 + i))
        }
    }

    fun getUserList(): List<User> {
        return userList
    }

    fun getUserById(id: Int): User? {
        return userList.find { it.id == id }
    }
}

  1. 创建ViewModel:
    然后,我们创建一个ViewModel类UserViewModel,用于管理用户数据和UI状态。
class UserViewModel : ViewModel() {
    private val userRepository = UserRepository()
    private val _userList = MutableLiveData<List<User>>()
    private val _selectedUserId = MutableLiveData<Int>()

    val userList: LiveData<List<User>> get() = _userList
    val selectedUserId: LiveData<Int> get() = _selectedUserId

    init {
        // 初始化用户列表数据
        _userList.value = userRepository.getUserList()
    }

    fun selectUser(userId: Int) {
        _selectedUserId.value = userId
    }
}

在上面的示例中,我们使用了ViewModelLiveData来管理用户数据和UI状态。UserViewModel类中包含了一个MutableLiveData用于保存用户列表数据和选中的用户ID。同时,UserViewModel类中还提供了方法来更新用户数据和选中的用户ID。

  1. 创建布局文件:
    接着,我们创建一个布局文件activity_main.xml,用于展示用户列表和用户详细信息。
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="viewModel"
            type="com.example.viewmodel.UserViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ListView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:entries="@{viewModel.userList}"
            android:onItemClick="@{(parent, view, position, id) -> viewModel.selectUser(viewModel.userList[position].id)}" />

        <FrameLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="@{viewModel.getUserById(viewModel.selectedUserId)}" />
        </FrameLayout>
    </LinearLayout>
</layout>

在上面的布局文件中,我们使用了Data Binding的特性,通过标签声明了一个变量viewModel,类型为UserViewModel,用于将ViewModel与布局文件绑定。在布局中使用@{}语法,可以直接引用ViewModel中的数据和方法。

在布局中,我们使用了一个ListView来展示用户列表,通过android:entries属性绑定了viewModel.userList,将UserViewModel中的用户列表数据与ListView进行了绑定。同时,我们还通过android:onItemClick属性绑定了点击事件,将点击事件与viewModel.selectUser()方法绑定,以实现点击列表项时更新选中的用户ID。

另外,我们使用了一个FrameLayout来展示选中用户的详细信息,通过android:text属性绑定了viewModel.getUserById(viewModel.selectedUserId),将选中用户的详细信息与TextView进行了绑定。

  1. 创建Activity:
    接着,我们创建一个Activity类MainActivity,用于处理用户交互和更新UI。
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var userViewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
        binding.viewModel = userViewModel
        binding.lifecycleOwner = this
    }
}

在上面的示例中,我们使用了Data Binding的DataBindingUtil类来将布局文件与Activity进行绑定,并通过ViewModelProvider来获取UserViewModel的实例。我们将UserViewModel实例设置给布局文件的viewModel变量,同时设置lifecycleOwner为当前Activity,以便LiveData能够在合适的生命周期内更新UI。

通过以上的步骤,我们实现了一个简单的用户管理应用,并使用了MVVM架构、LiveData、ViewModel和Data Binding来实现现代化的应用架构。通过使用这些Jetpack组件,我们实现了数据的解耦,将UI逻辑和业务逻辑分离,使得应用的代码更加清晰、可维护和可测试。同时,Data Binding的特性也简化了UI和数据的绑定过程,提高了开发效率。

这只是一个简单的示例,实际应用中可能涉及到更复杂的业务逻辑和UI需求,但MVVM架构、LiveData、ViewModel和Data Binding这些Jetpack组件都可以帮助我们构建现代化的Android应用,并提供良好的架构设计和开发体验。在实际项目中使用这些组件时,需要根据具体的需求和情况进行灵活运用,以便更好地提高应用的性能和可维护性。

结论

jetpack组成

MVVM架构在Android应用开发中具有重要的作用,它通过将UI逻辑和业务逻辑分离,实现了解耦和模块化,使得应用更加易于维护和测试。同时,Jetpack组件作为Android官方推荐的组件库,为构建现代化的应用架构提供了强大的支持。

在使用MVVM架构和Jetpack组件时,以下是一些最佳实践和注意事项:

将UI逻辑和业务逻辑分离:MVVM架构的核心理念是将UI逻辑和业务逻辑分离,将UI视图与ViewModel进行绑定,通过LiveData实现数据的观察和更新。这样可以使得代码更加清晰、可维护和可测试。

使用ViewModel管理UI状态:ViewModel作为MVVM架构中的核心组件,负责管理UI状态和业务逻辑,可以通过LiveData来实现数据的观察和更新。ViewModel应该避免持有Context对象,以防止内存泄漏。

使用Data Binding实现数据绑定:Data Binding库可以简化UI和数据的绑定过程,减少了手动findViewById和设置监听器的代码。通过在布局文件中使用Data Binding的特性,可以实现UI和数据的解耦,提高开发效率。

遵循单一职责原则:在MVVM架构中,View负责展示UI,ViewModel负责处理业务逻辑和管理UI状态,Model负责处理数据。应该遵循单一职责原则,保持各组件的职责清晰,不将过多的逻辑放在单一组件中。

注意内存泄漏:在使用MVVM架构时,需要注意内存泄漏的问题,特别是在ViewModel中持有Context对象时,应该避免使用ApplicationContext,避免持有View的引用,以防止内存泄漏。

结束语:
mvvm

MVVM架构和Jetpack组件为Android应用开发提供了现代化的架构设计和开发体验。通过将UI逻辑和业务逻辑分离,使用ViewModel管理UI状态,以及使用Data Binding实现数据绑定,可以构建更加清晰、可维护和可测试的Android应用。鼓励读者尝试使用MVVM架构和Jetpack组件来构建更现代化的Android应用,提高应用的性能和开发效率。希望本文对读者了解MVVM架构和Jetpack组件的使用有所帮助。

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

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

相关文章

[考研数据结构] 第3章之队列的基本知识与操作

文章目录 队列的基本概念 队列的顺序存储 顺序队列 存储类型 基本操作 循序队列 存储类型 基本操作 循环队列判空与判满的三种解决方案 方法一&#xff1a;牺牲一个存储单元 方法二&#xff1a;类型增设记录型变量size 方法三&#xff1a;类型增设标志型变量tag 队…

嵌入式【协议篇】CAN协议原理

一、CAN协议介绍 1、简介 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。 其实可以简单把CAN通信理解成开一场电话会议,当一个人讲话时其他人就听(广播),当多个人同时讲话时则根据一定规则来决定谁先讲话谁后讲…

【音视频】 zlm的几个代理接口解释

目录 12、/index/api/addStreamProxy 30、/index/api/addStreamPusherProxy 14、/index/api/addFFmpegSource 24、/index/api/openRtpServer 27、/index/api/startSendRtp 参考 12、/index/api/addStreamProxy 拉流代理 &#xff1a; 194上在播放。 而10.30.2.6上加上这个…

FastDGCNN

Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data | IEEE Journals & Magazine | IEEE Xplore ​​​​​​​题目&#xff1a;Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data&#xff08;更快的动态图形CNN&#xff1a;对…

Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点

文章目录 前言改变 View 的属性&#xff0c;进行旋转、缩放、平移输出 View 的属性 使用 matrix 映射 view 变换后的外矩形前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响前(左)乘(preXxx) 的意义后(右)乘(postXxx) 结论 来张图 前言 Android View 通过平移、旋转、…

找PPT模板就上这5个网站~

分享几个可以永久免费下载PPT模板、素材的网站&#xff0c;上万个模板随便下载&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 网站素材非常全面&#xff0c;主要以设计类素材为主&#xff0c;办公类素材也很多&#x…

4、RSA终端指令

RSA总结 加密算法,都是数学知识对称加密(传统加密算法)RSA(三个人的名字)非对称加密(现代加密算法) 原根欧拉函数、欧拉定理(费马小定理)模反元素 m^(e * d) mod n ≡ m迪菲赫尔曼密钥交换RSA算法 RSA: 拆解两个(大)质数的乘积很难!所以RSA想对安全.加密: M ^e % N C解密: C…

前端学习:HTML头部、布局

目录 HTML头部 一、HTML 元素 二、head标签和header标签的不同 三、HTML 元素 四、HTML 元素 五、HTML 元素 六、 HTML 七、HTML元素 为搜索引擎定义关键词&#xff1a; 为网页定义描述内容&#xff1a; 每60秒刷新当前页面&#xff1a; 八、HTML 九、HTML头部元素…

Vue项目搭建流程

目录 1、通过命令创建 2、npm下载依赖 3、路由配置 4、配置组件 5、对axios进行二次封装 6、全局接口请求封装 7、配置跨域(反向代理) 1、通过命令创建 create vue 项目名 2、npm下载依赖 nmp i 依赖名版本号 axios1.2.1 echarts5.1.2 element-ui2.15.12 vue-router3…

56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载

文章目录 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载56.1 安装56.2 运行56.3 卸载 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载 56.1 安装 配置本地yum源&#xff0c;详细信息请参考《openEuler 22.03-LTS 搭建repo服务器》。 清除缓存。 # dnf clean…

【SpringBoot】1、SpringBoot整合JWT实现Token验证

这里写目录标题 1.单点登录1.1 单系统登录1.1.1 单系统登录流程(使用Session实现单系统登录) 1.2 多系统(单点)登录1.2.1 单点登录实现方案1.2.1.1 Session跨域1.2.1.2 Spring Session共享 1.3 Token机制1.3.1 传统身份认证1.3.2 基于Token的身份认证 1.4 JWT机制1.4.1 JWT数据…

Redis集群部署详解

文章目录 集群环境集群搭建测试集群故障转移集群扩容集群缩容 集群环境 集群介绍 1.什么是集群 所谓的集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态。 2.使用redis集群的必要性 单个redis存在不稳定…

9.6 数组的指针和指向数组的指针变量 - 3

9.6 数组的指针和指向数组的指针变量 - 3 一.回顾二维数组和多维数组的概念二.指向多维数组的指针和指针变量探究1.a:二维数组名&#xff0c;也是整个二维数组的首地址。我们可以认为是第0行的首地址是10002.a1 , a2 分别代表第一行首地址和第二行首地址。3.这表示a[0],a[1],a[…

Mapbox-gl.js v2.13.0 扩展支持4326,4490坐标系

mapbox-gl.js新版本中&#xff0c;支持多种projection 显示效果也不错&#xff0c;根据tiles grid可以看到&#xff0c;还是web_mercator的格网&#xff0c;基于图片做了一定的拉伸形变&#xff0c;想要加载4326的切片格网&#xff0c;依然无法实现。 后来在网上搜索加载4326切…

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)

目录 一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期 二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门 二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协…

【转行互联网】转行互联网必看答疑

课程 追忆寻梦-转行互联网必备知识 https://edu.csdn.net/course/detail/31180 2023年&#xff0c;迟来的编程私教服务 https://bbs.csdn.net/topics/613231237 优先 必读文章 初学者&#xff0c;打算改行学编程&#xff0c;怎么学习java&#xff1f;求指教。https://bb…

如何抓住IT行业最后的红利?网络安全为什么是风口行业?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

C语言指针及数组的运行原理

C语言指针及数组的运行原理 文章目录 C语言指针及数组的运行原理一. 指针&#xff08;汇编角度&#xff09;二. 数组&#xff08;汇编角度&#xff09;2.1 数组的定义2.2 指针与数组结合 三. 指令解释参考3.1 nop3.2 leave3.3 ret 这里涉及汇编&#xff0c;虚拟机这边采用的是6…

如何在 Google Cloud 上部署 EMQX 企业版

Google Cloud 的 IoT Core 产品将于 2023 年 8 月 16 日停止服务&#xff0c;随着这一日期的临近&#xff0c;许多用户正在为他们现有的物联网业务寻找新的解决方案&#xff0c;而 EMQX 企业版是实现这一目标的理想选择。 EMQX 企业版是一款大规模分布式 MQTT 消息服务平台&am…

【设计模式】深入浅出--外观模式

文章目录 前言一、外观模式介绍二、案例场景三、外观模式优缺点四、外观模式应用场景总结 前言 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别&#xff0c;如果是自己泡茶需要自行准备茶叶、茶具和开水&#xff0c;而去茶馆喝茶&#xff0c;最简单的方式就是跟茶馆服务员…