SSM框架,Spring-ioc的学习(下)
拓展:在xml文件中读取外部配置文件
例:若要导入外部配置文件jdbc.properties
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<http://www.springframework.org/schema/beans>"xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"xmlns:context="<http://www.springframework.org/schema/context>"xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd> <http://www.springframework.org/schema/context> <https://www.springframework.org/schema/context/spring-context.xsd>">
<!-- 导入外部属性文件 --><context:property-placeholder location="classpath:jdbc.properties,classpath:其他配置文件,……" /><!-- 配置数据源 --><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${atguigu.url}"/><property name="driverClassName" value="${atguigu.driver}"/><property name="username" value="${atguigu.username}"/><property name="password" value="${atguigu.password}"/></bean><!-- 配置 JdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!-- 装配数据源 --><property name="dataSource" ref="druidDataSource"/></bean>
</beans>
使用注解的方式进行配置bean
关于注解
注解与xml配置文件一样,注解本身不能运行,注解本身只做一个标记,注解的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体的操作。即一切的操作都是Java代码执行的,xml和注解只是告诉框架中的代码如何执行
关于扫描
Spring为了知道那些地方有那些注解,就需要通过扫描的方式,来进行检测。然后根据扫描的方式进行后续操作。
组件的注解配置
Spring的以下注解,将其标注在Java类上,将它们定义成Spring的Bean
| 注解 | 说明 |
|---|---|
| @Component | 该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。 |
| @Repository | 该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
| @Service | 该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
| @Controller | 该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
在类上使用以上注解后,相应的bean的id值默认为首字母小写后的类名,class就是此类的路径
@Component和三个注解(@Repository、@Service、@Controller)对于组件管理来说没有区别,只是起了三个新的名字,以便于区别组件
配置文件确定扫描范围
配置自动扫描的包
使用 context:component-scan 标签,在其base-package属性中写上要自动扫描的包,例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="<http://www.springframework.org/schema/beans>"xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>"xmlns:context="<http://www.springframework.org/schema/context>"xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd> <http://www.springframework.org/schema/context> <https://www.springframework.org/schema/context/spring-context.xsd>"><!-- 配置自动扫描的包 --><!-- 1.包要精准,提高性能!2.会扫描指定的包和子包内容3.多个包可以使用,分割 例如: com.atguigu.controller,com.atguigu.service等--><context:component-scan base-package="com.atguigu.components"/></beans>
- 自动扫描包时也会扫描其所有的子包
- 可以指定多个包,多个包之间使用逗号分割
排除自动扫描的范围
将context:component-scan变为双标签,在其中使用context:exclude-filter标签进行排除自动扫描的范围,然后指定其type属性和exrpession属性
- type属性:指定排除的方式,annotation表示根据注解方式排除
- expression属性:指定排除规则的表达式,对于注解来说,写入指定的类的路径名即可
例:
<!-- 情况三:指定不扫描的组件 -->
<context:component-scan base-package="com.atguigu.components"><!-- context:exclude-filter标签:指定排除规则 --><!-- type属性:指定根据什么来进行排除,annotation取值表示根据注解来排除 --><!-- expression属性:指定排除规则的表达式,对于注解来说指定全类名即可 --><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
锁定自动扫描的范围
要指定包中的某个注解,只扫描它,就要锁定其范围
将context:component-scan变为双标签,在context:component-scan标签中加上use-default-filters属性,将属性值为false。让其指定包的所有注解先不生效。
在context:component-scan双标签中使用context:include-filter标签进行锁定自动扫描的范围,然后指定其type属性和exrpession属性
- type属性:指定锁定的方式,annotation表示根据注解方式锁定
- expression属性:指定锁定规则的表达式,对于注解来说,写入指定的类的路径名即可
关于组件bean的id值
- 若不指定,则默认id值为将首字母小写后的类名
- 可以在注解后加上括号,在其中指定其value属性,value属性的值就是组件的id值
- 若注解后的括号中只对value属性进行赋值,则可以省略value=,直接写value值的字符串
@Controller(value = "tianDog")
public class SoldierController {
}
@Service("smallDog")
public class SoldierService {
}
周期方法和作用域的注解
周期方法注解
周期方法的要求同样是:权限修饰符为public,返回值类型为void,无形参列表
- 在初始化方法上加上注解:@PostConstruct
- 在销毁方法上写上注解:@PreDestory
public class BeanOne {//周期方法要求: 方法命名随意,但是要求方法必须是 public void 无形参列表@PostConstruct //注解制指定初始化方法public void init() {// 初始化逻辑}
}
public class BeanTwo {@PreDestroy //注解指定销毁方法public void cleanup() {// 释放资源逻辑}
}
注:销毁方法要正常关闭ioc才会执行,即将获取到ioc使用close方法关闭,单例的bean在ioc容器close时会自动销毁并调用销毁方法,多例的bean在ioc容器close时不会自动销毁不会调用销毁方法
作用域配置注解
作用域知识点见Spring-ioc的学习(上)
在类上加上Scope注解,在Scope注解的括号内指定其scopeName属性
- 单例为scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON
- scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE
di注入的注解
自动装配注解:@Autowired
用法:直接在成员变量上标记此注解,也可以在构造器、set方法上标记,以注入组件对象
此注解的功能是:先在ioc容器中查找符合类型的组件对象,再将查找到的组件对象赋值给当前属性,以完成组件注入的功能
例:
@Service("smallDog")
public class SoldierService {
//在成员变量上标记@Autowiredprivate SoldierDao soldierDao;public void getMessage() {soldierDao.getMessage();}
}
@Controller(value = "tianDog")
public class SoldierController {private SoldierService soldierService;
//在构造器上标注@Autowiredpublic SoldierController(SoldierService soldierService) {this.soldierService = soldierService;}……
}
@Controller(value = "tianDog")
public class SoldierController {private SoldierService soldierService;//在set方法上标注@Autowiredpublic void setSoldierService(SoldierService soldierService) {this.soldierService = soldierService;}……
}
注:参与自动装配的组件都需要在ioc容器中
该注解执行步骤:
- 首先根据所需要的组件类型到 IOC 容器中查找
- 能够找到唯一的 bean:直接执行装配
- 如果完全找不到匹配这个类型的 bean:装配失败
- 和所需类型匹配的 bean 不止一个
- 没有 @Qualifier 注解:根据 @Autowired 标记位置成员变量的变量名作为 bean 的 id 进行匹配
- 能够找到:执行装配
- 找不到:装配失败
- 使用 @Qualifier 注解:根据 @Qualifier 注解中指定的名称作为 bean 的id进行匹配
- 能够找到:执行装配
- 找不到:装配失败
佛系装配(不推荐使用):给 @Autowired 注解设置 required = false 属性,即给对应的要注入的变量赋值为null值
关于@Qualifier的使用
在相应的要注入的变量上标记@Autowired注解的同时,加上@Qualifier注解。在@Qualitier注解内写上value属性,value属性的值就是要找的组件的id的值。
例:
@Controller(value = "tianDog")
public class SoldierController {@Autowired@Qualifier(value = "maomiService222")//会根据id值为maomiService222的组件注入// 根据面向接口编程思想,使用接口类型引入Service组件private ISoldierService soldierService;
注:@Qualifier注解不能单独使用,要配合Autowired注解使用
还可以使用@Resource(name=”……”)注解,就是@Qualifier和Autowired注解的组合体,但是项目要导入jsr-250依赖,依赖导入如下:
<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version>
</dependency>
注入基本类型数据
注入基本类型数据的步骤是,在要注入的变量上方写Value注解,直接在括号中写上其要注入的值即可(用字符串形式)
@Value("liergou")
private String name;
@Value("19")
private String age;
使用注解配置成员变量的优点是可以使用${……}的方式来注入properties配置文件的信息
此处导入properties文件的方式和文章开头的步骤一样:
<!-- 导入外部属性文件 --><context:property-placeholder location="classpath:jdbc.properties,classpath:其他配置文件,……" />
@Component
public class CommonComponent {/*** 情况1: ${key} 取外部配置key对应的值!* 情况2: ${key:defaultValue} 没有key,可以给与默认值*/@Value("${catalog:hahaha}")private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
在${ }中的配置文件中的变量后加上 : ,意思是若变量不存在,就默认为:后面的值
FactoryBean的注解配置
FactoryBean类内部的代码还是照常,只要在此类上方加上@Component、@Controller、@Service、@Repository注解即可
@Component
public class JavaBeanFactoryBean implements FactoryBean<JavaBean> {@Overridepublic JavaBean getObject() throws Exception {JavaBean javaBean = new JavaBean();return javaBean;}@Overridepublic Class<?> getObjectType() {return JavaBean.class;}
}
配置类方式管理Bean
Spring 完全注解配置(Fully Annotation-based Configuration)是指通过 Java配置类 代码来配置 Spring 应用程序,使用注解来替代原本在 XML 配置文件中的配置。相对于 XML 配置,完全注解配置具有更强的类型安全性和更好的可读性。
步骤
- 在配置类上添加注解@Configuration,代表此类是配置类
- 使用@ComponentScan注解,完成包扫描注解配置,在其中的value属性或basepackages属性中指定包路径,如果有多个包路径,使用{ }括号将所有包路径括起来,包路径之间用逗号隔开
- 使用@PropertySource注解,引用外部的配置文件,在value属性中指定配置文件的路径即可,可以有多个,格式为value=”classpath: …… , classpath: …… , ……”
- 声明第三方依赖的Bean组件
例:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;//标注当前类是配置类,替代application.xml
@Configuration
//使用注解读取外部配置,替代 <context:property-placeholder标签
@PropertySource("classpath:application.properties,classpath:jdbc.properties")
//使用@ComponentScan注解,可以配置扫描包,替代<context:component-scan标签
@ComponentScan(basePackages = {"com.ergou.components","com.ergou.service"})
public class MyConfiguration {}
创建ioc容器:
①
// AnnotationConfigApplicationContext 根据配置类创建 IOC 容器对象
ApplicationContext iocContainerAnnotation =
new AnnotationConfigApplicationContext(MyConfiguration.class);
②
// AnnotationConfigApplicationContext-IOC容器对象
ApplicationContext iocContainerAnnotation =
new AnnotationConfigApplicationContext();
//外部设置配置类
iocContainerAnnotation.register(MyConfiguration.class);
//刷新后方可生效!!
iocContainerAnnotation.refresh();
@Bean注解的使用
步骤:
- 方法的返回值类型为目标组件的的类型或其类型的接口、父类的类型
- 方法名为bean组件的id值
- 在方法体中自定义实例化过程即可
- 在方法上加上@Bean注解
例:
//标注当前类是配置类,替代application.xml
@Configuration
//使用注解读取外部配置,替代 <context:property-placeholder标签
@PropertySource("classpath:jdbc.properties")
//使用@ComponentScan注解,可以配置扫描包,替代<context:component-scan标签
@ComponentScan(basePackages = {"com.ergou.ioc_01"})
public class JavaConfiguration {@Value("${ergou.url}")private String url;@Value("${ergou.driver}")private String driver;@Value("${ergou.username}")private String username;@Value("${ergou.password}")private String password;
/***方法的返回值类型为目标组件的的类型或其类型的接口、父类的类型
*方法名为bean组件的id值
*在方法体中自定义实例化过程即可
*在方法上加上@Bean注解
* @return*/
@Beanpublic DruidDataSource dataSource(){DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setUrl(url);druidDataSource.setDriverClassName(driver);druidDataSource.setUsername(username);druidDataSource.setPassword(password);return druidDataSource;}
}
关于bean的id值
默认为当前方法的方法名
手动指定id值:在@Bean注解中加上value属性(或name属性),在其中指定id值即可
@Configuration
public class AppConfig {@Bean("myThing") //指定名称public Thing thing() {return new Thing();}
}
关于周期方法
在配置类中写相应的初始化方法和销毁方法,然后在@Bean注解中,initMethod属性中写初始化方法的方法名,在destoryMethod属性中写销毁方法的方法名。
例:
public class BeanOne {public void init() {// initialization logic}
}public class BeanTwo {public void cleanup() {// destruction logic}
}@Configuration
public class AppConfig {@Bean(initMethod = "init")public BeanOne beanOne() {return new BeanOne();}@Bean(destroyMethod = "cleanup")public BeanTwo beanTwo() {return new BeanTwo();}
}
关于作用域
在对应的bean的方法上加上Scope注解,在Scope注解的括号内指定其scopeName属性
- 单例为scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON
- scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE
@Bean@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)public DruidDataSource dataSource(){DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setUrl(url);druidDataSource.setDriverClassName(driver);druidDataSource.setUsername(username);druidDataSource.setPassword(password);return druidDataSource;}
调用其他的组件
- 如果要调用的组件也是@Bean注解的方法配置的bean组件,则可以直接调用其bean对应的@Bean注解后的方法
@Bean
public JdbcTemplate jdbcTemplate(){JdbcTemplate jdbcTemplate = new JdbcTemplate();//调用了上面的DataSource类型的组件jdbcTemplate.setDataSource(dataSource());return jdbcTemplate;
}
- 在@Bean注解的方法的形参列表中写上一个想要调用的的组件类型的变量,方法体中调用时调用的就是相应类型的组件。(可以有多个)
@Bean
//形参为DataSource类型的变量,变量名为dataSource,意思是方法体中调用dataSource变量,调用的就是DataSource类型的组件
public JdbcTemplate jdbcTemplate(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();
//调用dataSource组件
jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;
}
如果对应类型有多个组件,则选择组件id值与变量名一致的组件(要保证要有一个组件的id值与变量名一致)
@Import注解的使用
@Import注解用来从另一个配置类中加载@bean定义的bean组件,在@Import注解后的括号中写相应类的class实例即可
@Configuration
public class ConfigA {@Beanpublic A a() {return new A();}
}
@Configuration
@Import(ConfigA.class)
public class ConfigB {@Beanpublic B b() {return new B();}
}
也可以传入多个外部的配置类,用{}括起来,例:
@Configuration
@Import({JavaConfiguration.class,JavaConfigurationB.class})
public class JavaConfigurationA {
}
整合Spring5-Test5搭建测试环境
-
整合测试环境作用
好处1:不需要自己创建IOC容器对象了
好处2:任何需要的bean都可以在测试类中直接享受自动装配
-
导入相关依赖
<!--junit5测试--> <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.0.6</version><scope>test</scope> </dependency> -
整合测试注解使用
//@SpringJUnitConfig(locations = {"classpath:spring-context.xml"}) //指定配置文件xml @SpringJUnitConfig(value = {BeanConfig.class}) //指定配置类 public class Junit5IntegrationTest {@Autowiredprivate User user;@Testpublic void testJunit5() {System.out.println(user);} }
相关文章:
SSM框架,Spring-ioc的学习(下)
拓展:在xml文件中读取外部配置文件 例:若要导入外部配置文件jdbc.properties <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"<http://www.springframework.org/schema/beans>"xmlns:xsi"&l…...
【AIGC】Stable Diffusion的模型微调
为什么要做模型微调 模型微调可以在现有模型的基础上,让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。Stable Diffusion 模型的微调方法通常依赖于您要微调的具体任务和数据。 下面是一个通用的微调过程的概述: 准备数据集…...
VNCTF 2024 Web方向 WP
Checkin 题目描述:Welcome to VNCTF 2024~ long time no see. 开题,是前端小游戏 源码里面发现一个16进制编码字符串 解码后是flag CutePath 题目描述:源自一次现实渗透 开题 当前页面没啥好看的,先爆破密码登录试试。爆破无果…...
第11章 GUI
11.1 Swing概述 Swing是Java语言开发图形化界面的一个工具包。它以抽象窗口工具包(AWT)为基础,使跨平台应用程序可以使用可插拔的外观风格。Swing拥有丰富的库和组件,使用非常灵活,开发人员只用很少的代码就可以创建出…...
综合项目---博客
一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…...
leetcode(矩阵)74. 搜索二维矩阵(C++详细解释)DAY7
文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中…...
超详细||YOLOv8基础教程(环境搭建,训练,测试,部署看一篇就够)(在推理视频中添加FPS信息)
一、YOLOv8环境搭建 这篇文章将跳过基础的深度学习环境的搭建,如果没有完成的可以看我的这篇博客:超详细||深度学习环境搭建记录cudaanacondapytorchpycharm-CSDN博客 1. 在github上下载源码: GitHub - ultralytics/ultralytics: NEW - YO…...
LeetCode171. Excel Sheet Column Number
文章目录 一、题目二、题解 一、题目 Given a string columnTitle that represents the column title as appears in an Excel sheet, return its corresponding column number. For example: A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … Exa…...
pycharm创建py文件,自动带# -*- coding:utf-8 -*-
File–Settings...
希捷与索尼集团合作生产HAMR写头激光二极管
最近有报道指出,希捷(Seagate)在生产其采用热辅助磁记录(HAMR)技术的大容量硬盘时,并非所有组件都在内部制造。根据日经新闻的一份新报告,希捷已与索尼集团合作,由索尼为其HAMR写头生…...
电脑竖屏显示了怎么回复原状
电脑屏幕变成这样 怎么恢复原状? 1、登录系统 2、在桌面上空白点击鼠标右键 3、在右键菜单中选择“屏幕分辨率”,左键点击打开 4、在窗口中“方向”位置选择“横向” 5、保存设置win7桌面即可恢复到正常状态...
Elasticsearch从入门到精通
目录 🧂1.简单介绍 🥓2.安装与下载 🌭3.安装启动es 🍿4.安装启动kibana 🥞5.初步检索 🧈6.进阶检索 🫓7.Elasticsearch整合 1.简单介绍🚗🚗🚗 Elat…...
Halcon 相机标定
文章目录 算子单相机标定单相机标定畸变的矫正 算子 gen_caltab 生成标定文件 gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile :) 算子来制作一个标定板XNum 每行黑色标志圆点的数量。YNum 每列黑色标志圆点的数…...
【JavaScript】深浅拷贝
JavaScript中复制对象有深拷贝和浅拷贝两种方式 浅拷贝:浅拷贝只复制对象的第一层属性,而不复制嵌套对象的引用。这意味着如果原始对象包含嵌套对象,浅拷贝后的对象仍然会共享这些嵌套对象的引用。可以使用`Object.assign()`或展开运算符(`...`)来进行浅拷贝。 // 浅拷贝示…...
CH32V3xx RT-Thread RS485实现modbus rtu master
目录 1、串口配置1.1 串口初始化1.2 uart DMA 初始化1.1.3 发送函数2、agile modbus3、应用测试4、遇到的问题本文通过ch32v3xx的串口 + RS485收发器实现modbus rtu master设备。此工程中移植的RT-Thread Nano系统,详情可参看本专栏前几篇文章。 1、串口配置 串口使用重映射后…...
当网站遭到DDOS攻击怎么办?
一般网站进行上线后会经常遭到攻击,有一些攻击不怎么容易被发现,当大规模的攻击来临时,会给企业造成巨大的损失,使网站的业务下线并且访问异常,出现很多的问题。 其中DDOS攻击是最高频的一种网络攻击方式,那…...
ES6中的数组解构赋值【详解】
文章目录 1.数组的解构赋值1.1 基本用法1.2 默认值1.3更多对象解构赋值 1.数组的解构赋值 1.1 基本用法 ES6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为结构。 let [a, b, c] [1, 2, 3];如果解构不成功,…...
error An unexpected error occurred: “https://registry.npm.taobao.org
背景: 想使用yarn命令结果报错 问题原因: 原来证书到期了 http://registry.npm.taobao.org/ 把这个放到浏览器搜索的时候自动换成https://registry.npmmirror.com/ 方案: npm cache clean --forcenpm config set registry https://registry…...
react中commit工作流程
整个React工作流程可以分为两大阶段: Render阶段 Schecule Reconcile Commit阶段 注意,Render阶段是在内存中运行的,这意味者可以被打断,而commit阶段一旦开始同步执行直到完成。 Renderer工作的阶段被称为commit阶段。commit阶…...
C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构
#include<iostream> using namespace std; //多态 //动物类 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字,变成虚函数,那么编译器在编译的时候就不能确定函数调用了。 virtual void speak() { …...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...
【前端实战】如何让用户回到上次阅读的位置?
目录 【前端实战】如何让用户回到上次阅读的位置? 一、总体思路 1、核心目标 2、涉及到的技术 二、实现方案详解 1、基础方法:监听滚动,记录 scrollTop(不推荐) 2、Intersection Observer 插入探针元素 3、基…...
DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
基于深度学习YOLOv11的盲人障碍物目标检测:开启盲人出行新纪元 在全球范围内,盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步,许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中ÿ…...
