sprintboot容器功能

容器

  • 容器功能
    • Spring注入组件的注解
      • @Component,@Controller,@Service,@Repository
      • 案例演示
    • @Configuration
      • 应用实例
        • 传统方式
        • 使用@Configuration
      • 注意事项和细节
    • @Import
      • 应用实例
    • @Conditional
      • @Conditional介绍
      • 应用实例
    • @ImportResource
      • 应用实例
    • 配置绑定
      • 应用实例
      • 注意事项和细节

在这里插入图片描述

容器功能

Spring注入组件的注解

@Component,@Controller,@Service,@Repository

说明:这些在Spring中的传统注解仍然有效,通过这些注解可以给容器注入组件。

案例演示

1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\A.java

@Repository
public class A {}

2.测试MainApp.java, 其它注解不再一一测试.

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);System.out.println("ok");//演示Spring中传统的注解依然可以使用 @controler @service @repositoryA aBean = ioc.getBean(A.class);System.out.println("aBean=" + aBean);}
}

@Configuration

应用实例

●@Configuration应用实例需求
说明: 演示在SpringBoot, 如何通过 @Configuration 创建配置类来注入组件.

传统方式

●回顾传统方式如何通过配置文件注入组件. 基于XML配置bean
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Monster.java

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsContructor
public class Monster {private Integer id;private String name;private Integer age;private String skill;
}

2.创建D:\idea_project\zzw_springboot\quickstart\src\main\resources\beans.xml创建容器配置文件的方式在SpringBoot中依然好使

<!--配置了Monster bean-->
<bean class="com.zzw.springboot.bean.Monster" id="monster"><property name="id" value="100"/><property name="name" value="孙悟空"/><property name="age" value="20"/><property name="skill" value="金箍棒"/>
</bean>

3.在springboot项目中,依然可以使用spring的配置bean/注入bean/获取bean方式

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//=====演示在springboot项目,依然可以使用spring的配置bean/注入bean/获取bean方式 start===ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");Monster monster = ac.getBean("monster" , Monster.class);System.out.println("monster=" + monster);//=====演示在springboot项目,依然可以使用spring的配置bean/注入bean/获取bean方式 end=====}
}
使用@Configuration

●使用SpringBoot的@Configuration添加组件
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig.java

配置文件和配置类都差不多, 但是在springboot中开发尽量用配置类来完成Bean的注入.

/*** 解读* 1.@Configuration 表示这是一个配置类,等价于配置文件* 2.程序员可以通过@Bean 注解注入bean对象到容器* 3.当一个类被 @Configuration 标识, 该类-Bean 也会注入到容器*/
@Configuration
public class BeanConfig {/*** 解读* 1.@Bean: 给容器添加组件, 就是一个Monster bean* 2.monster01(): 默认 你的方法名monster01 作为bean的名字/id* 3.Monster: 注入类型, 注入bean的类型时Monster* 4.new Monster(200, "牛魔王" , 500 , "芭蕉扇"); 注入到容器中具体的bean信息* 5.@Bean(name = "monster_nmw"): 在配置/注入 bean 指定名字/id monster_nmw* 6.默认是单例注入* 7.通过 @Scope("prototype") 可以每次返回新的对象, 指定bean对多例*///@Bean(name = "monster_aliasName")@Beanpublic Monster monster01() {return new Monster(200, "牛魔王" , 500 , "芭蕉扇");}
}

2.修改MainApp.java, 从配置文件/容器获取bean, 并完成测试
hashCode含义

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示在springboot项目中,@Configuration的使用 start===Monster monster01 = ioc.getBean("monster01" , Monster.class);Monster monster02 = ioc.getBean("monster01" , Monster.class);System.out.println("monster01=" + monster01 + " " + monster01.hashCode());System.out.println("monster02=" + monster02 + " " + monster02.hashCode());//=====演示在springboot项目中,@Configuration的使用 end=====}
}

3.也可以通过Debug来查看 ioc 容器是否存在 monster01 的 Bean实例

ioc->beanFactory->beanDefinitionMap->monster01
在这里插入图片描述

注意事项和细节

1.配置类本身也是组件, 因此也可以获取. 修改MainApp.java
配置类是CGLIB代理对象. 动态代理jdk的Proxy和Spring的CGlib

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示 配置类-bean也会注入到容器 start===BeanConfig beanConfig = ioc.getBean("beanConfig", BeanConfig.class);System.out.println("beanConfig=" + beanConfig + " " + beanConfig.hashCode());//=====演示 配置类-bean也会注入到容器 end=====}
}

2.SpringBoot2新增特性: proxyBeanMethods 指定 Full模式 和 Lite模式
1)修改D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig.java

/*** 第二部分解读* 1.proxyBeanMethods: 代理bean的方法* 2.Full(proxyBeanMethods = true): (默认)保证每个@Bean方法被调用多少次返回的组件都是单例的, 是代理方法* 3.Lite(proxyBeanMethods = false): 保证每个@Bean方法被调用多少次返回的组件都是新创建的, 是非代理方法* 4.特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效. 因此, 需要先获取BeanConfig 组件, 再调用方法* 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效* 5.如何选择: 组件依赖必须使用默认 Full模式, 如果不需要组件依赖则使用 Lite模式.* 6.Lite模式: 也称为轻量级模式, 因为不检测依赖关系, 所以运行速度快*/
@Configuration(proxyBeanMethods = false)
public class BeanConfig {}

2)修改MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示 @Configuration(proxyBeanMethods = xxx) start===//1.先得到BeanConfig组件BeanConfig beanConfig = ioc.getBean("beanConfig", BeanConfig.class);Monster monster_01 = beanConfig.monster01();Monster monster_02 = beanConfig.monster01();System.out.println("monster_01--" + monster_01 + " " + monster_01.hashCode());System.out.println("monster_02--" + monster_02 + " " + monster_02.hashCode());//特别说明: proxyBeanMethods 是在 调用@Bean方法 才生效. 因此, 需要先获取BeanConfig 组件, 再调用方法//1. 而不是直接通过 SpringBoot 主程序得到的容器来获取bean, 注意观察直接通过ioc.getBean() 获取Bean, proxyBeanMethods 值并没有生效Monster monster01 = ioc.getBean("monster01", Monster.class);Monster monster02 = ioc.getBean("monster01", Monster.class);System.out.println("monster01--" + monster01 + " " + monster01.hashCode());System.out.println("monster02--" + monster02 + " " + monster02.hashCode());//=====演示 @Configuration(proxyBeanMethods = xxx) end===}
}

3.配置类可以有多个, 就和Spring可以有多个ioc配置文件一个道理
1)创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\config\BeanConfig2.java

@Configuration
public class BeanConfig2 {@Beanpublic Monster monster02() {return new Monster(300, "太上老君" , 1000 , "炼丹炉");}
}

2)完成测试MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====测试可以有多个配置类 start===//两个配置类注入的Bean都生效Monster monster02 = ioc.getBean("monster02", Monster.class);Monster monster01 = ioc.getBean("monster01", Monster.class);System.out.println("monster02--" + monster02);System.out.println("monster01--" + monster01);//=====测试可以有多个配置类 end===}
}

@Import

应用实例

说明: 演示在SpringBoot, 如何通过 @Import 来注入组件
1.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Cat.javaD:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Dog.java

public class Dog {}public class Cat {}

2.修改BeanConfig.java, 通过@Import注入组件

/*** 解读* 1.@Import 源码 可以看到, 我们可以指定 class的数组, 可以注入指定类型的Bean* public @interface Import {*     Class<?>[] value();* }* 2.通过@Import 方式注入了组件, 默认组件 名字/id 就是对应类型的全类名*/
@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {}

3.修改MainApp.java, 完成测试

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====测试@Import 使用 start===Dog dogBean = ioc.getBean(Dog.class);Cat catBean = ioc.getBean(Cat.class);System.out.println("dogBean---" + dogBean);System.out.println("catBean---" + catBean);//=====测试@Import 使用 end===}
}

@Conditional

@Conditional介绍

1.条件装配: 满足Conditional指定的条件, 则进行组件注入
在这里插入图片描述

2.@Conditional 是一个根注解, 下面有很多扩展注解

在这里插入图片描述

应用实例

1.要求: 演示在SpringBoot, 如何通过 @ConditionalOnBean 来注入组件
2.只有在容器中有 name=monster_nmw 组件时, 才注入 dog01.

@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {@Bean//@Bean(name = "monster_nmw")public Monster monster01() {return new Monster(200, "牛魔王", 500, "芭蕉扇");}@Beanpublic Dog dog01() {return new Dog();}
}

3.先测试下, 当前是否能注入 dog01

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====测试@ConditionalOnBean 使用 start===Dog dog01 = ioc.getBean("dog01", Dog.class);System.out.println("dog01---" + dog01);//=====测试@ConditionalOnBean 使用 end===}
}

4.修改BeanConfig.java, 加入@ConditionalBean条件约束, 并完成测试

@Import(value = {Dog.class, Cat.class})
@Configuration
public class BeanConfig {@Bean//@Bean(name = "monster_nmw")public Monster monster01() {return new Monster(200, "牛魔王", 500, "芭蕉扇");}@Bean(name = "monster_nmw")public Cat cat01() {return new Cat();}@Bean/*** 解读* 1.@ConditionalOnBean(name = "monster_nmw") 表示* 2.当容器中有一个Bean, 名字是monster_nmw(类型不做约束), 就注入dog01这个Dog bean* 3.如果没有 名字是 monster_nmw 的Bean, 就不注入dog01这个Dog bean.* 4.还有很多其它的条件约束注解, 小伙伴可以自己测试** 5.@ConditionalOnMissingBean(name = "monster_nmw") 表示在容器中* , 没有 名字/id 为 monster_nmw 的Bean, 才注入dog01这个Bean** 6.@Conditional根注解及其扩展注解, 也可以修饰类* @ConditionalOnBean(name = "monster_nmw")* public class BeanConfig {}* 表示对该配置类的所有要注入的组件, 都进行条件约束.*/@ConditionalOnBean(name = "monster_nmw")//@ConditionalOnMissingBean(name = "monster_nmw")public Dog dog01() {return new Dog();}
}

@ImportResource

作用: 原生配置文件引入, 也就是可以直接导入Spring 传统的beans.xml, 可以认为是SpringBoot 对 Spring 容器文件的兼容.

应用实例

1.需求: 将 beans.xml 导入到 BeanConfig.java 配置类, 并测试是否可以获得 beans.xml 注入/配置 的组件
在这里插入图片描述

2.修改BeanConfig.java 或者 创建新的BeanConfig3.java(建议创建新的配置类)来测试, 使用 @ImportResource 导入beans.xml,beans02.xml(复制beans.xml的配置,改改数据)

@Configuration
//导入beans.xml, 就可以获取到beans.xml 中配置的bean
@ImportResource(locations = {"classpath:beans.xml", "classpath:beans02.xml"})
public class BeanConfig3 {
}

3.修改MainApp.java

@SpringBootApplication(scanBasePackages = "com.zzw")
public class MainApp {public static void main(String[] args) {//启动springboot应用程序/项目ApplicationContext ioc = SpringApplication.run(MainApp.class, args);//=====演示@ImportResource 使用 start===Monster monster = ioc.getBean("monster", Monster.class);System.out.println("monster---" + monster);System.out.println("monster bean 是否存在-" + ioc.containsBean("monster"));Monster monster03 = ioc.getBean("monster03", Monster.class);System.out.println("monster03---" + monster03);System.out.println("monster03 bean 是否存在-" + ioc.containsBean("monster03"));//=====演示@ImportResource 使用 end===}
}

配置绑定

一句话:使用Java读取到SpringBoot 核心配置文件 application.properties 的内容,并且把它封装到JavaBean中.

应用实例

1.需求: 将application.properties指定的 k-v 和 JavaBean 绑定

2.application.properties增加配置

#1.设置Furn的属性k-v
#2.前面的furn01 是用于指定/区分不同的绑定对象, 这样可以在绑定Furn bean属性值时
#, 通过furn01 前缀进行区分
#3.furn01.id 中的id 就是你要绑定的 Furn bean的属性名
furn01.id=100
furn01.name=phone
furn01.price=6000

3.创建D:\idea_project\zzw_springboot\quickstart\src\main\java\com\zzw\springboot\bean\Furn.java

@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "furn01")
public class Furn {private Integer id;private String name;private BigDecimal price;
}

4.修改HiController, 完成自动装配

@Controller
public class HiController {//装配到HiController@Resourceprivate Furn furn;@RequestMapping("/furn")@ResponseBodypublic Furn furn() {return furn;}
}

5.启动SpringBoot 主程序, 完成测试
在这里插入图片描述

5.配置绑定还有第2种方式, 这里也演示一下, 效果一样.
注意: 注销 @Component 需要在 BeanConfig.java(说明: 也可以是其它配置类) 配置 @EnableConfigurationProperties(Furn.class), 否则会提示错误
在这里插入图片描述

/*** @EnableConfigurationProperties({Furn.class})解读* 1.开启Furn配置绑定功能* 2.把Furn组件自动 注册/注入 到容器中*/
@EnableConfigurationProperties({Furn.class})
public class BeanConfig {}

注意事项和细节

1.如果 application.properties 有中文, 需要转成 unicode 编码写入, 否则会出现乱码. 在线Unicode转中文
以前学SpringMVC创建国际化文件的时候遇到过

furn01.id=100
furn01.name=\u5bb6\u5c45
furn01.price=6000

2.使用 @ConfigurationProperties(prefix=“furn01”) 会提示以下信息, 但是不会影响使用
在这里插入图片描述

3.解决 @ConfigurationProperties(prefix=“furn01”) 提示信息, 在 pom.xml 增加依赖, 即可

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

在这里插入图片描述

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

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

相关文章

【微信小程序开发实战项目】——如何去申请腾讯地图账号和在微信公众平台,配置request路径和添加地图插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【算法-力扣】73.矩阵置零,一文彻底搞懂!

目录 一、题目描述 二、解题思路 三、参考答案 一、题目描述 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 进阶&#xff1a; 一个直观的解决方案是使用 O(mn) 的额外空间&#x…

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索

文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…

远程连接路由器:方法大全与优缺点解析

远程连接路由器的方式主要有以下几种&#xff0c;以下是每种方式的详细说明及其优缺点&#xff1a; 使用Web浏览器登录 方法&#xff1a;通过配置路由器的远程管理功能&#xff0c;允许用户通过互联网浏览器访问路由器的管理界面。用户只需输入路由器的公网IP地址或域名&#…

Flutter系列:关于ensureInitialized()

Flutter系列 关于ensureInitialized() - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28…

【数据结构】遍历二叉树(递归思想)-->赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 二叉树遍历是指按照一定的顺序访问二叉树中的每个节点&#xff0c;使得每个节点恰好被访问一次。遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其他运算的基础。 一、二叉树遍历概念 二叉树遍历分类 …

C#.Net筑基-类型系统①基础

C#.Net的BCL提供了丰富的类型&#xff0c;最基础的是值类型、引用类型&#xff0c;而他们的共同&#xff08;隐私&#xff09;祖先是 System.Object&#xff08;万物之源&#xff09;&#xff0c;所以任何类型都可以转换为Object。 01、数据类型汇总 C#.NET 类型结构总结如下图…

项目采购管理

目录 1.概述 2.三个子过程 2.1.规划采购管理 2.2.实施采购 2.3.控制采购 2.4.归属过程组 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 需求识别和分析 3.2.2. 制定采购计划 3.2.3. 发布采购请求 3.2.4. 供应商评估与选择 3.2.5. 合同签订 3.2.6. 采购…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

YouTube583美元账户做到一千多万美元,125万粉的顶级交易员

油管125万粉丝的Ross Cameron,一位把583美元账户做到一千多万美元。他说他曾经也是像无头苍蝇一样交易,最终凄惨爆仓,也就是在爆仓之后,他终于开始沉下心来研究交易策略,终于终于,他有一天找到了交易模型,并用它执行至今。 Ross Cameron无疑是最成功的日内交易员之一,而…

The Google File System 论文阅读

2003年USENIX&#xff0c;出自谷歌&#xff0c;开启分布式大数据时代的三篇论文之一 总体设计 假设 硬件损坏是常态&#xff0c;而非意外。例如磁盘损坏&#xff0c;断电&#xff0c;断网。所以持续的监控&#xff0c;错误诊断&#xff0c;错误恢复要纳入系统设计之中文件很…

【文档智能 RAG】RAG增强之路-智能文档解析关键技术难点及PDF解析工具PDFlux

前言 在私域知识问答和企业知识工程领域&#xff0c;结合Retrieval-Augmented Generation&#xff08;RAG&#xff09;模型和大型语言模型&#xff08;LLM&#xff09;已成为主流方法。然而&#xff0c;企业中存在着大量的PDF文件&#xff0c;PDF解析的低准确性显著影响了基于…

open-amv开发环境搭建

open-amv是基于rv1103主控芯片的视觉开发板子 1.板子使用 板子使用type c作为调试口&#xff0c;同时供电&#xff0c;请在电脑上下载adb&#xff0c;当板子通过tpye c与电脑连接后&#xff0c;执行命令adb shell就会进入到板子的linux系统命令行。 2.编译环境 2.1 搭建doc…

ipad协议已更新

mmtls 24算法&#xff0c;by golang 其他/v1/other POST/v1/other/GetPeopleNearby 查看附近的人 POST/v1/other/GetQrCode 获取二维码 同步消息/v1/ws GET/v1/ws/GetSyncMsg 同步消息&#xff0c;ws协议 消息/v1/message POST/v1/message/AddMessageMgr 添加要发送…

什么是无杂散动态范围 (SFDR)?为什么 SFDR 很重要?

有多种不同的规格可用于表征电路线性度。SFDR 指标是一种常用的规范。该指标定义为所需信号幅度与感兴趣带宽内杂散的比率&#xff08;图 1&#xff09;。 图 1. 显示 SFDR 指标的图表。 对于 ADC&#xff0c;SFDR 展示了 ADC 如何在存在大信号的情况下同时处理小信号。作为一个…

如何阅读?从阅读中学阅读—《海绵阅读法》

大家好&#xff0c;我是老三&#xff0c;最近读了《海绵阅读法&#xff1a;如何吸收一本书的精华》&#xff0c;第一次阅读教如何阅读的书&#xff0c;整理一番读书笔记&#xff0c;分享给大家。 读书动机 我前一阵子写了篇文章&#xff0c;2024Q1&#xff0c;盘点我看过的54本…

[Java基本语法] 逻辑控制与方法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代&#xff0c;创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画&#xff0c;却又苦于找不到合适的画师或高昂的费用而望而却步&#xff1f;现在&#xff0c;这一切都将成为现实&#xff01; 进入首助编辑高手的AI魔法智绘图板块…

你能不能手敲出Spring框架?

Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念&#xff0c;反而不是其本身的技术。技术上今天可以有Spring春天&#xff0c;明天就可以有Autumn秋天。 核心理念有多重要&#xff1f;就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B&#xff0c;这是一个具有划时代意义的模型&#xff0c;它使用了高达 98% 的合成数据进行训练&#xff0c;并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型&#xff0c;支持 4K 上下文窗口、50 …