WPF Prims框架详解

news2025/3/5 2:05:23

文章目录

  • 前言
  • Prism基本使用
    • Prism选择,DryIoc还是Unity
    • Prism基本框架搭建
    • Prism动态更新
      • View和ViewModel对应关系
      • 参数动态更新
      • 函数动态绑定
    • prism新建项目模板
    • region
      • 使用事例
      • 测试是否限制空间
    • 消息订阅
      • 如何使用消息订阅
      • 使用建议
    • 路由导航
    • 对话框/弹窗功能
      • 实现代码

前言

Prims框架是WPF的一个框架,特点是集成了我们平常常用的开发模式,封装了很多常用的功能。例如消息通知,路由导航,Model绑定。

Prism基本使用

资料来源

WPF-Prism8.0核心教程(公益)

Prism选择,DryIoc还是Unity

根据网上的说明,DryIoc是更加效率更高的,但是我看Nuget下载数量里面,Unity下载数量比DryIoc高得多。具体没怎么用过,那就按照推荐用DryIoc好了。

Unity和DryIoc之间性能比较在这里插入图片描述

Prism基本框架搭建

在这里插入图片描述
在App.xaml里面,修改

App.xaml.cs

    /// <summary>
    /// 继承prism的PrismApplication类
    /// </summary>
    public partial class App : PrismApplication
    {
        //设置启动页
        protected override Window CreateShell()
        {
            //启动页为MainWindow
            return Container.Resolve<MainWindow>();

        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            
        }
    }

App.xaml

<!--xmlns:prism,引入prism命名空间-->
<!--prism:PrismApplication,继承prism下的PrismApplication类-->
<!--去掉StartupUrl,保证只有一个启动页-->
<prism:PrismApplication x:Class="PrismTest.App"
                        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                        xmlns:local="clr-namespace:PrismTest"
                        xmlns:prism="http://prismlibrary.com/">
</prism:PrismApplication>

Prism动态更新

View和ViewModel对应关系

在这里插入图片描述
View和ViewModel可以自动绑定,命名要求为。

  • Model:NameViewModel
  • View:Name/NameView(两者都可以)
    在View中添加入如下代码
xmlns:prism引入命名空间
prism:ViewModel设置自动绑定
可以不加,默认进行了绑定。
<Window ...
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True">

也可以在App.xaml里面强行绑定

在原文件件中取消绑定

app.xaml

        /// <summary>
        /// 路由管理
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //通过RegisterForNavigation进行强行绑定,强行让ViewA和ViewAViewModel进行绑定
            containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
            
        }

参数动态更新

	//继承BindableBase接口
    public class MyListBoxItem : BindableBase
    {
        private string text;
        public string Text
        {
            get { return text; }
            set {  SetProperty(ref text, value);}//此方法为Prism提供
        }
    }

可以输入propp加tab键,模板输入,提交写代码效率

在这里插入图片描述

函数动态绑定

函数动态绑定需要用到委托类型,如果委托不明白需要自己回去了解一下

viewModel


//声明委托
public DelegateCommand TestBtn { get; set; }
//构造函数
public MainWindowViewModel()
{
    //实例化委托
    TestBtn = new DelegateCommand(() =>
    {
        //执行内容
    });
}

view

使用Command引用委托,如果没有TestBtn委托也不报错
        <Button Content="测试方法"
                FontSize="100"
                Grid.Row="1"
                Command="{Binding TestBtn}"/>

prism新建项目模板

在扩展,管理扩展中安装
在这里插入图片描述
我们在新建程序的时候会有Prism模板框架

在这里插入图片描述

使用时会提示使用什么容器,这里推荐DryIoc容器

在这里插入图片描述

新建文件路径如下

在这里插入图片描述

region

Prism将界面继续划分,分为多个Region,在Region中添加元素。

在这里插入图片描述

和WPF用户组件的区别。

  • Region相当于划分了空区域,WPF是有内容的区域。
  • Region相当于WPF用户控件的上级,用于包含用户控件

使用事例

MainWindow.xaml

    <Grid>
        <!--声明Region,名称为ContentRegion,使用名称来进行注入-->
        <ContentControl prism:RegionManager.RegionName="ContentRegion" />
        
    </Grid>

UserControl1.xaml,用于放置在Region上面的用户控件

    <Grid>
        <TextBlock  Text="我是用户控件" FontSize="100"/>
    </Grid>

MainWindowViewModel.xaml

        //注册regionManager控件
        private readonly IRegionManager _regionManager;

        public MainWindowViewModel(IRegionManager regionManager)
        {
            this._regionManager = regionManager;
			//ContentRegion是窗口已声明的Region,使用字符串进行弱绑定
            regionManager.RegisterViewWithRegion("ContentRegion",typeof(UserControl1));
        }

生成效果
在这里插入图片描述

测试是否限制空间

在这里插入图片描述

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <!--声明Region,名称为ContentRegion,使用名称来进行注入-->
        <ContentControl prism:RegionManager.RegionName="ContentRegion" />
        
    </Grid>

实现效果

在这里插入图片描述

消息订阅

消息订阅是先订阅再发布有效,如果是先发布再订阅则无效。

如何使用消息订阅

 public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism Application";
                //声明委托
        public DelegateCommand TestBtn { get; set; }
        public DelegateCommand SendCommand { get; set; }
        private readonly IEventAggregator _eventAggregator;
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }
        //构造函数
        public MainWindowViewModel(IRegionManager regionManager,IEventAggregator eventAggregator)
        {

            //实例化委托
            //订阅
            TestBtn = new DelegateCommand(() =>
            {
                eventAggregator.GetEvent<MessageEvent>().Subscribe(OnMessageRecevied);
            });
			//发送
            SendCommand = new DelegateCommand(() =>
            {
            	//执行参数
                eventAggregator.GetEvent<MessageEvent>().Publish("Hello Event");
            });
            
            this._eventAggregator = eventAggregator;
        }


        public void OnMessageRecevied(string msg)
        {
            Title += msg + "\r\n";
        }


        

		//消息订阅类
        public class MessageEvent: PubSubEvent<string> {
        }
    }

注意
eventAggregator.GetEvent<MessageEvent>()。MessageEvent是我们自己定义的,相当于订阅的消息主题。

eventAggregator.GetEvent().

  • Subscribe(OnMessageRecevied);
    • OnMessageRecevied是处理函数
  • Publish(“Hello Event”)
    • "Hello Event"是入参,因为OnMessageRecevied(string msg)

取消订阅

eventAggregator.GetEvent<MessageEvent>().Unsubscribe(OnMessageRecevied);

使用建议

  • 注意,这个是全局使用的,所以一般用于页面通讯
    • 例如:AView。我就用AViewEvent。一个页面对应一个事件通知。
  • 由于带入的参数不一定,所以我们可以设置Dictionary为入参,通过key值过滤来设置对应的函数。通过NetJson来快速传参。

路由导航

路由导航和Region是搭配使用的,专门用于页面转化

  • 新建切换用的用户控件ViewA,ViewB,ViewC。ViewA,B,C内容有区分,这里省略
    在这里插入图片描述
  • 在App.xaml.cs中注册页面
        /// <summary>
        /// 路由管理
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //将ViewA,B,C添加到导航,这样才能进行路由管理
            containerRegistry.RegisterForNavigation<ViewA>("ViewA");
            containerRegistry.RegisterForNavigation<ViewB>();
            containerRegistry.RegisterForNavigation<ViewC>();
        }

  • 在MainView中添加委托事件
   <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <Button Content="ViewA"
                    Command="{Binding OpenACommand}" />
            <Button Content="ViewB"
                    Command="{Binding OpenBCommand}" />
            <Button Content="ViewC"
                    Command="{Binding OpenC_Command}" />
            <Button Content="上一页"
                    Command="{Binding GoBackCommand}" />
            <Button Content="下一页"
                    Command="{Binding GoForwordCommand}"/>
        </StackPanel>
        <!--这个Region是我们等会切换窗口信息的-->
        <ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
    </Grid>

在MainiView里面管理导航


namespace PrismNavigation.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        /// <summary>
        /// 导航日志
        /// </summary>
        private IRegionNavigationJournal _journal;
        //Region,用于页面切换
        private readonly IRegionManager _regionManager;
        public DelegateCommand OpenACommand { get; set; }
        public DelegateCommand OpenBCommand { get; set; }
        public DelegateCommand OpenC_Command { get; set; }
        public DelegateCommand GoBackCommand { get; set; }
        public DelegateCommand GoForwordCommand { get; set; }


        public MainWindowViewModel(IRegionManager regionManager,IEventAggregator eventAggregator)
        {
            _regionManager = regionManager;
            OpenACommand = new DelegateCommand(OpenA);
            OpenBCommand = new DelegateCommand(OpenB);
            OpenC_Command = new DelegateCommand(OpenC);
            GoBackCommand = new DelegateCommand(GoBack);
            GoForwordCommand = new DelegateCommand(GoForword);

        }

        private void OpenA()
        {
            NavigationParameters para = new NavigationParameters
            {
                { "Value", "Hello Prism" }
            };
            //进行路由传参,ContentRegion是xmal中的Region名称,ViewA是在App.xmal中注册的名称,arg是日志回调,para是路由传递的参数
            _regionManager.RequestNavigate("ContentRegion", "ViewA", arg =>
            {
                ///获取导航日志
                _journal = arg.Context.NavigationService.Journal;
            }, para);

        }
        private void OpenB()
        {
            _regionManager.RequestNavigate("ContentRegion", "ViewB", arg =>
            {
                ///获取导航日志
                _journal = arg.Context.NavigationService.Journal;
            });

        }
        private void OpenC()
        {
            _regionManager.RequestNavigate("ContentRegion", "ViewC", arg =>
            {
                ///获取导航日志
                _journal = arg.Context.NavigationService.Journal;
            });

        }

        private void GoForword()
        {
            _journal.GoForward();
        }

        private void GoBack()
        {
            _journal.GoBack();
        }
    }
}

在ViewA中进行路由拦截

 public class ViewAViewModel :BindableBase, IConfirmNavigationRequest
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { SetProperty(ref _name, value); }
        }


        /// <summary>
        /// IConfirmNavigationRequest的路由离开拦截,
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <param name="continuationCallback"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            var res = true;
            if(MessageBox.Show("确认导航?","温馨提示",MessageBoxButton.YesNo) == MessageBoxResult.No)
            {
                res = false;
            }
            //如果res为true则拦截,true则放行
            continuationCallback?.Invoke(res);
        }

        /// <summary>
        /// 用于判断是否要重新创建新的事例,即是否保留之前的信息,True为重新创建。
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return true;
        }
        /// <summary>
        /// 离开页面时触发,一般用于取消事件监听
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnNavigatedFrom(NavigationContext navigationContext)
        {

        }
        /// <summary>
        /// 显示页面前触发,一般用于设置事件监听
        /// </summary>
        /// <param name="navigationContext"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            //拿到Key为Value的值,返回类型为string
            Name = navigationContext.Parameters.GetValue<string>("Value");
        }
    }

实现效果
在这里插入图片描述

简单介绍

  • 路由导航是Region导航,必须要先将WPF用户控件添加到Region中才能进行导航
  • 在注册时,可以添加别名
    • containerRegistry.RegisterForNavigation<ViewA>(“别名”);
_regionManager.RequestNavigate("ContentRegion", "别名");//原本是ViewA的,可以替换成别名

对话框/弹窗功能

Prism将对话框这个常用的功能进行了封装。虽然叫对话框,但其实是弹窗的功能效果。

实现代码

app.xaml中

        /// <summary>
        /// 路由管理
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
			.......
            //这里也能起别名
            containerRegistry.RegisterDialog<MsgView,MsgViewModel>("别名");   
        }

MainViewModel使用这个弹窗

public class MainWindowViewModel : BindableBase
    {
        private string _title = "Prism Application";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        /// <summary>
        /// 导航日志
        /// </summary>
        private IRegionNavigationJournal _journal;
        private readonly IRegionManager _regionManager;
        //注册弹窗服务
        private IDialogService _dialogService;
        public DelegateCommand OpenACommand { get; set; }

		//构造函数中传入对话框
        public MainWindowViewModel(IRegionManager regionManager,IEventAggregator eventAggregator,IDialogService dialogService)
        {
            _regionManager = regionManager;
            OpenACommand = new DelegateCommand(OpenA);
            GoForwordCommand = new DelegateCommand(GoForword);
            //使用对话框
            _dialogService = dialogService;

        }

        private void OpenA()
        {
        	//对话框传递的参数
            DialogParameters param = new DialogParameters();
            param.Add("Value", "paramTest");
            //打开名为MsgView的弹窗,并传递参数
            _dialogService.Show("MsgView", param, arg =>
            {
            	//弹窗关闭的回调函数,会有参数返回
                if(arg.Result == ButtonResult.OK)
                {
                    Debug.WriteLine("调试成功");
                }
            });
        }
    }

MsgView


    <Grid Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="30" />
            <RowDefinition />
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBox Grid.Row="1" Text="{Binding Title}" FontSize="20"/>
        <Label Content="{Binding Title}"/>
        <DockPanel Grid.Row="2" LastChildFill="False">
            <Button Content="取消" Width="60"
                    DockPanel.Dock="Right"
                    Command="{Binding CancelCommand}" />
            <Button Content="确定"
                    Width="60"
                    DockPanel.Dock="Right"
                    Command="{Binding SaveCommand}"/>

        </DockPanel>
    </Grid>
public class MsgViewModel :BindableBase, IDialogAware
    {

        private string _title;
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        /// <summary>
        /// 用于弹窗关闭的回调函数
        /// </summary>
        public event Action<IDialogResult> RequestClose;

        public DelegateCommand SaveCommand { get; set; }

        public DelegateCommand CancelCommand { get; set; }

        public MsgViewModel() {
            SaveCommand = new DelegateCommand(() =>
            {
                DialogParameters keyValuePairs = new DialogParameters();
                keyValuePairs.Add("Value", Title);
                //执行弹窗关闭,并传入回调参数
                RequestClose?.Invoke(new DialogResult(ButtonResult.OK, keyValuePairs));
                
            });

            CancelCommand = new DelegateCommand(() =>
            {
                RequestClose?.Invoke(new DialogResult(ButtonResult.No));
            });
        }

        /// <summary>
        /// 能否打开窗口
        /// </summary>
        /// <returns></returns>
        public bool CanCloseDialog()
        {
            return true;
        }
        /// <summary>
        /// 关闭的方法
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        public void OnDialogClosed()
        {
            //throw new NotImplementedException();
        }
        /// <summary>
        /// 打开之前,接受弹窗传参
        /// </summary>
        /// <param name="parameters"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnDialogOpened(IDialogParameters parameters)
        {
            Title = parameters.GetValue<string>("Value");
        }
    }

在这里插入图片描述

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

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

相关文章

国内什么牌子的ipad手写笔好用?电容笔性价比高推荐

随着平板电脑在校园、办公室中的应用越来越广泛&#xff0c;需要一种具有良好性能的电容笔。苹果品牌原装的这支电容笔&#xff0c;虽然功能很强&#xff0c;但因为其的价格实在是太贵了&#xff0c;所以只是用来学习记笔记&#xff0c;实在是太浪费了。所以&#xff0c;哪个电…

JavaSwing+MySQL的飞机订票系统(内含oracle版本)

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88055544 JDK1.8 MySQL5.7 功能&#xff1a;接收客户端发来的数据、处理客户端发来的数据、发送数据包到客户端&#xff1b;客户端&#xff1a;查询所有航班的信息、查看自己所定的票、订票…

Day 60 小结

1.惰性学习&#xff08;消极学习&#xff09;&#xff1a;在训练数据集的时候不会创建目标函数&#xff0c;只是简单将训练样本存储。后期需要对新样本进行判断的时候分析新样本和已存储的样本之间的关系&#xff0c;并以此确定新样本的输出值。例如&#xff1a;knn算法。 2.急…

LeetCode:4. 寻找两个正序数组的中位数

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[4. 寻找两个正序数组的中位数](https://leetcode.cn/proble…

微信朋友圈同步你知道怎么设置吗?

微信关于朋友圈同步 其实没有什么其他方法 但是不想一直复制粘贴 繁琐又麻烦 对于要发布很多条的情况下 就很不方便 如果是有可以同步朋友圈的功能 我们可以先选择一个好友 然后设置好跟圈任务 好友发啥你就会跟TA发出一模一样的朋友圈

CEASC项目环境搭建(训练VisDrone数据集)

CEASC项目环境搭建&#xff08;训练VisDrone数据集&#xff09; 论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Du_Adaptive_Sparse_Convolutional_Networks_With_Global_Context_Enhancement_for_Faster_CVPR_2023_paper.pdf Code&#xff1a…

同比环比数据可视化

引言 数据分析和可视化在现代商业环境中变得越来越重要。随着数据的迅速增长&#xff0c;我们需要有效的工具来解释和理解这些数据。 数据可视化提供了一种直观的方式&#xff0c;帮助我们从海量数据中提取有意义的见解&#xff0c;以支持业务决策。 同比环比图作为一种常见的…

AI制图工具丨Midjourney产品功能介绍

了解如何使用Discord上的Midjourney Bot通过简单的文本提示创建自定义图像 Midjourney是一款AI制图工具&#xff0c;只要关键字&#xff0c;就能透过AI算法生成相对应的图片&#xff0c;只需要不到一分钟。 可以选择不同画家的艺术风格&#xff0c;例如安迪华荷、达芬奇、达利…

JavaScript中的JSON

一&#xff1a;分类  简单值&#xff1a;字符串、数值、布尔值和 null 可以在 JSON 中出现&#xff0c;就像在 JavaScript 中一样。特殊 值 undefined 不可以。 对象&#xff1a;第一种复杂数据类型&#xff0c;对象表示有序键/值对。每个值可以是简单值&#xff0c;也可以…

如何通过三级缓存解决 Spring 循环依赖

以下内容基于 Spring6.0.4。 这个其实是一个特别高频的面试题&#xff0c;松哥也一直很想和大家仔细来聊一聊这个话题&#xff0c;网上关于这块的文章很多&#xff0c;但是我一直觉得要把这个问题讲清楚还有点难度&#xff0c;今天我来试一试&#xff0c;看能不能和小伙伴们把…

一张证,三年月薪翻三倍!

18年9月&#xff0c;我获取了PMP&#xff08;项目管理&#xff09;认证&#xff0c;19年6月获取了PgMP&#xff08;项目集群管理&#xff09;认证。考证过程并不是很难&#xff0c;月薪却从1万突破3万&#xff0c;也找到了自己喜欢和擅长的工作领域&#xff0c;获益无穷。 什么…

Navicat 用户权限功能 | 预防 MySQL 删库风险

近期&#xff0c;我们后台收到一位用户的问询&#xff0c;有关于误删库的解决办法。对于企业来说&#xff0c;这可能是一个大事故&#xff01;但幸运的是&#xff0c;该用户在不久之前看了我们的 Navicat 自动备份功能文章&#xff0c;并且实施了数据库备份操作&#xff0c;所以…

如何下载SRA存放在AWS的原始数据

通常&#xff0c;我们都是利用prefetch从NCBI上获取数据&#xff0c;然后用fasterp-dump/fastq-dump 转成fastq。但遗憾的SRA的数据是原数据的有损压缩&#xff0c;比如说我19年参与发表的文章里单细胞数据上传的是3个文件&#xff0c;但是当时的faster-dump/fastq-dump只能拆出…

MongoDB源码安装

文章目录 MongoDB源码安装&#xff1a;注&#xff1a;下载&#xff1a;解压&#xff1a;创建数据目录&#xff1a;创建软链接&#xff1a;创建变量脚本&#xff1a;执行脚本&#xff1a;启动mongodb:检查&#xff1a;连接mongodb&#xff1a; MongoDB源码安装&#xff1a; 注&…

Flutter系列文章-Flutter基础

Flutter是Google推出的一种新的移动应用开发框架&#xff0c;允许开发者使用一套代码库同时开发Android和iOS应用。它的设计理念、框架结构、以及对Widget的使用&#xff0c;都让开发者能更有效率地创建高质量的应用。 一、Flutter设计理念 Flutter的设计理念是“一切皆为Wid…

安装hive数据仓库

部署hive数据库 环境准备 需要安装部署完成的Hadoop的环境如果不会搭建的可以参考&#xff1a; 安装mysql 卸载Centos7自带的mariadb rpm -qa|grep mariadbrpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodepsrpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64是使用…

ToT: 利用大语言模型进行有意识的问题解决(上)

ToT 摘要介绍利用大语言模型进行有意识的问题解决1. 思维分解2. 思维产生 G(p,s,k)3. 状态评估V(p,S)4. 搜索算法 实验相关工作讨论 原文&#xff1a; 摘要 语言模型正在迅速成为一般问题解决的部署&#xff0c;但在推理过程中仍然局限于 标记级别&#xff08;token-level&…

uniapp左右滑动切换月份

左右滑动触发事件 给组件绑定事件,主要利用组件的触摸开始和触摸结束事件来实现: <view @touchstart="touchStart" @touchend="touchEnd"> 2,声明初始化点击位置变量startX data() {return {list:[],pageNum:1,pageSize:10,//初始化点击位置…

手撕Spring06

概述 该章节通过各种Context解决上下文问题&#xff0c;使用模版方法的设计模式&#xff0c;并增加了bean实例化之前、beanc初始化前后的扩展点整体设计 知识点补充 类图 context context包下主要是传递上下文、调用core.io、beans等包下的实际功能完成&#xff0c;配置文件…

12.11 FS4412开发环境搭建

目录 开发边硬件资源介绍 地址映射表 硬件控制原理 load/store 地址映射表4个G包括 开发边硬件资源介绍 地址映射表 硬件控制原理 1.数据运算指令&#xff08;CPU内部&#xff09; 2.跳转指令&#xff08;CPU内部&#xff09; 3.load/store&#xff08;通过读写对硬件…