当前位置: 首页 > news >正文

Spring | 基础

1. IOC和DI

IOC:控制反转,其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了 IOC 之后,则是**容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。**这种行为也被称为查找的被动形式。

DI:依赖注入,IOC的另一种表述方式,即**组件以一些预先定义好的方式(setter方法)**接受来自容器的资源注入。

图解
可见,有了IOC容器之后,对象的创建都是在容器中进行,用户所要做的只是从容器中获取已经创建好的对象而已


2. 配置Bean

2.1 Bean 的配置方法

2.1.1 在 xml 文件中通过全类名(反射)来配置 Bean

<bean id="helloWorld2" class="edu.just.spring.beans.HelloWorld"></bean>

class: bean 的全类名, 通过反射的方式在 IOC 容器中创建 Bean, 所以要求 Bean 中必须有无参的构造器
id: 标识容器中的 bean. id 唯一.


2.1.2 在 xml 中通过静态工厂方法来配置 Bean
调用静态工厂方法创建 Bean 是将对象创建的过程封装到静态方法中,当客户端需要对象时,只需要简单地调用静态方法,而不用关心创建对象的细节

创建 Bean 实例

public class Car {private String brand;private String corp;private double price;public Car(String brand, String corp, double price) {this.brand = brand;this.corp = corp;this.price = price;}}
/*** 静态工厂方法: 只要调用某一个类的静态方法就可以返回 Bean 的实例*/
public class StaticCarFactory {private static Map<String, Car> cars = new HashMap<>();static {cars.put("audi", new Car("audi", "xixi", 2000));cars.put("ford", new Car("ford", "hello", 401111));}public static Car getCar(String name) {return cars.get(name);}}

配置 Bean:
class 属性:指向静态工厂方法的全类名
factory-method:指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数, 则用 constructor-arg 来配置参数

<bean id="car1" class="edu.just.spring.beans.factory.StaticCarFactory" factory-method="getCar"><constructor-arg value="audi"></constructor-arg>
</bean>

结果:

Car [brand=audi, corp=xixi, price=2000.0]

2.1.3 在 xml 中通过实例工厂方法配置 Bean
将对象的创建过程封装到另一个对象实例的方法中,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关系对象的创建细节

/*** 实例工厂方法: 实例工厂的方法, 即需要创建工厂本身, 在调用工厂的实例方法来返回 bean 的实例*/
public class InstanceCarFactory {private Map<String, Car> cars = null;public InstanceCarFactory() {cars = new HashMap<>();cars.put("audi", new Car("audi", "xixi", 20000));cars.put("ford", new Car("ford", "hha", 30000));}public Car getCar(String name) {return cars.get(name);}
}

配置 Bean:
factory-bean :指向实例工厂方法的 Bean
factory-method :指向实例工厂方法的名字
constructor-arg:如果工厂方法需要传入参数, 则用 constructor-arg 来配置参数

<!-- 配置工厂的实例 -->
<bean id="carFactory" class="edu.just.spring.beans.factory.InstanceCarFactory"></bean><bean id="car2" factory-bean="carFactory" factory-method="getCar"><constructor-arg value="ford"></constructor-arg>
</bean>

结果:

Car [brand=ford, corp=hha, price=30000.0]

2.1.4 实现 FactoryBean 接口配置 Bean

  • Spring 中有两种类型的 Bean,一种是普通 Bean,另一种是工厂 Bean,即 FactoryBean
  • 工厂 Bean 跟普通 Bean 不同,其返回的对象不是指定类的一个实例,而是该工厂 Bean 的 getObject 方法所返回的对象
//自定义的 FactoryBean 需要实现 FactoryBean 接口
public class CarFactoryBean implements FactoryBean<Car>{private String brand;public void setBrand(String brand) {this.brand = brand;}//返回 Bean 的对象@Overridepublic Car getObject() throws Exception {return new Car(brand, 500000);}//返回 Bean 的类型@Overridepublic Class<?> getObjectType() {return Car.class;}@Overridepublic boolean isSingleton() {return true;}
}

配置 Bean:
通过 FactoryBean 来配置 Bean 的实例
class:指向 FactoryBean 的全类名
property:配置 FactoryBean 的属性

但实际返回的实例却是 FactoryBean 的 getObject() 方法返回的实例

<bean id="carFactoryBean" class="edu.just.spring.beans.FactoryBean.CarFactoryBean"><property name="brand" value="audi"></property>
</bean>

结果:

Car [brand=audi, price=500000.0]

**2.1.5 基于注解的方式来配置 Bean** * [Spring | 基于注解配置Bean(一)](https://www.jianshu.com/p/46ddc6812295) * [Spring | 基于注解配置Bean(二)](https://www.jianshu.com/p/e0e780629c82)

2.2 ApplicationContext

在Spring IOC 容器读取 Bean 配置创建 Bean 实例之前,必须对它进行实例化。只有在容器实例化之后,才可以从 IOC 容器里获取 Bean 实例并使用。Spring 提供了两种类型的 IOC 容器实现

  • BeanFactory:IOC 容器的基本实现
  • ApplicationContext:提供了更多的高级特性,是 BeanFactory 的子接口

BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身
ApplicationContext 面向使用 Spring 框架的开发者,几乎所有应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory

public class Main {public static void main(String[] args) {//1. 创建 Spring 得 IOC 容器对象//ApplicationContext 代笔 IOC 容器//ClassPathXmlApplicationContext: 是 ApplicationContext 接口的实现类, 该实现类从类路径下来加载配置文件.ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//2. 对 IOC 容器中获取 Bean 实例//利用 id 定位到 IOC 容器中的 beanHelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld2");//利用类型返回 IOC 容器中的 Bean, 但要求 IOC 容器中必须只能有一个该类型的 Bean
//		HelloWorld helloWorld = ctx.getBean(HelloWorld.class);System.out.println(helloWorld);//		//3. 调用方法
//		helloWorld.hello();}
}

2.3 依赖注入的方式

**属性注入:**即通过 setter 方法注入 Bean 的属性值或依赖的对象。属性注入是实际应用中最常用的注入方式

<bean id="helloWorld2" class="edu.just.spring.beans.HelloWorld"><property name="name" value="Spring"></property>
</bean>

**构造器注入:**通过构造方法注入 Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化之后就可以使用。构造器注入在 `` 元素里面声明属性,`` 中没有 name 属性 ``` ```

2.4 注入属性值细节

字面值: 可用字符串表示的值,可以通过 <value>200</value> 元素标签或 value="nihao" 属性进行注入。
PS: 若字面值中包含特殊字符,可以使用 <![CDATA[]]>把字面值包裹

引用其他 Bean: 在 Bean 的配置文件中,可以通过 <ref> 元素或者 ref 属性为 Bean 的属性或者构造器参数指定对 Bean 的引用

<bean id="car1" class="edu.just.spring.beans.Car"></bean><bean id="person" class="edu.just.spring.beans.Person"><property name="name" value="Tom"></property><property name="age" value="25"></property><!-- 可以使用 property 的 ref 属性建立 bean 之间的引用关系 --><property name="car" ref="car1"></property><!-- 通过 ref 属性添加引用 --><property name="car"><ref bean="car1"/></property><!-- 内部 Bean, 不能被外部引用, 只能在内部使用 --><property name="car"><bean class="edu.just.spring.beans.Car"><constructor-arg value="Ford"></constructor-arg><constructor-arg value="Changan"></constructor-arg><constructor-arg value="200000"></constructor-arg></bean></property>
</bean>

内部 Bean: 内部 Bean 声明直接包含在 <poperty> 或者 <constructor-arg> 元素里,不需要设置任何 id 或 name 属性。同时内部 Bean 不能使用在其他任何地方

集合属性: 在 Spring 中可以通过一组内置的 xml 标签,如 <list><set><map>

  • list 标签
<!-- 测试如何配置集合属性 -->
<bean id="person3" class="edu.just.spring.beans.collections.Person"><property name="name" value="Mike"></property><property name="age" value="20"></property><property name="cars"><!-- 使用 list 节点为 List 类型的属性赋值 --><list><ref bean="car1"/><ref bean="car2"/><!-- 可以指定内部 Bean --><bean class="edu.just.spring.beans.Car"><constructor-arg value="Ford"></constructor-arg><constructor-arg value="Changan"></constructor-arg><constructor-arg value="200000"></constructor-arg></bean></list></property>
</bean>
  • map 标签
<!-- 配置 Map 属性值 -->
<bean id="newPerson" class="edu.just.spring.beans.collections.Person2"><property name="name" value="Rose"></property><property name="age" value="29"></property><property name="cars"><!-- 使用 map 节点 的 entry 子节点配置 Map 类型的成员变量 --><map><entry key="AA" value-ref="car1"></entry><entry key="BB" value-ref="car2"></entry></map></property>
</bean>
  • property 标签
<bean id="dataSource" class="edu.just.spring.beans.collections.DataSource"><property name="properties"><!-- 使用 props 和 prop 子节点为 Properties 属性赋值 --><props><prop key="user">root</prop><prop key="password">password</prop><prop key="jdbcUrl">jdbc:mysql:///test</prop><prop key="driverClass">com.mysql.jdbc.Driver</prop></props></property>
</bean>

使用utility scheme定义集合
使用基本的集合标签定义集合时,不能将集合作为独立的 Bean 定义,导致其他 Bean 无法引用该集合,所以无法在不同 Bean 直接共享集合

<!-- 配置独立的集合 bean, 以供多个 bean 进行引用 --><util:list id="cars"><ref bean="car1"/><ref bean="car2"/></util:list><bean id="person4" class="edu.just.spring.beans.collections.Person"><property name="name" value="Jack"></property><property name="age" value="100"></property><property name="cars" ref="cars"></property>
</bean>

使用 p 命名空间

<!-- 通过 p 命名空间为 bean 的属性赋值, 需要先导入 p 命名空间, 相对于传统的配置方式更加的简洁. -->
<bean id="person5" class="edu.just.spring.beans.collections.Person" p:name="luwenhe"p:age="20" p:cars-ref="car1"></bean>

2.5 自动装配

Spring IOC 容器可自动装配 Bean,需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式

可以使用 autowire 属性指定 自动装配 的方式.
byName: 根据 bean 的名字(id 的 值)和当前 bean 的 setter 风格的属性名进行自动装配,若有匹配的,则进行自动装配,若没有匹配的,则不装配
byType: 根据 bean 的类型和当前 bean 的属性的类型进行自动装配,若 IOC 容器中有 1 个以上的类型匹配的 bean,则抛出异常

缺点: 如果只希望装配个别属性时, autowire 就不够灵活,autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之。在实际项目中很少使用自动装配功能, 因为和自动装配功能所带来的好处比起来, 明确清晰的配置文档更加具有说服力

<bean id="person" class="edu.just.spring.beans.autowire.Person" p:name="Tim"autowire="byName"></bean><bean id="person" class="edu.just.spring.beans.autowire.Person" p:name="Tim"autowire="byType"></bean>

2.6 Bean 之间的关系:继承、依赖

  • 被继承的 Bean 成为父 Bean。继承这个父 Bean 的 Be’an 称为子 Bean
  • 子 Bean 继承父 Bean 的配置,也可以覆盖从父 Bean 继承过来的配置
  • 若只想把父 Bean 作为模板,可以设置 <bean> 的 abstract 属性为 true
  • 也可以忽略父 Bean 的 class 属性,让子 Bean 指定自己的类。此时 abstract 必须设置为 true
<!-- 抽象 bean: bean 的 abstract 属性为 true 的 bean. 这样的 bean 不能被 IOC 容器实例化, 只用来被继承配置 若某一个 bean 的 class 属性没有指定, 则该 bean 必须是一个抽象 bean
-->
<bean id="address" p:city="Beijing^^" p:street="WuDAOkOU" abstract="true"></bean><!-- bean 配置的继承: 使用 bean 的 parent 属性指定继承哪个 bean 的配置 -->
<bean id="address2" class="edu.just.spring.beans.autowire.Address"p:street="DaZhongSi" parent="address"></bean><bean id="car" class="edu.just.spring.beans.autowire.Car"p:brand="BenChi" p:price="100000"></bean><!-- 要求在配置 Person, 必须有一个关联的 car! 即 person 这个 bean 依赖于 Car 这个 bean -->
<bean id="person" class="edu.just.spring.beans.autowire.Person"p:name="Tom" p:address-ref="address2" depends-on="car"></bean>
  • Spring 允许用户通过 depend-on 属性设定 Bean 前置依赖的 Bean,前置依赖 Bean 会在本 Bean 实例化之前创建好

2.7 Bean 的作用域

Spring 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域

  • singleton: 默认值, 容器初始化时创建 bean 实例, 在整个容器的生命周期内只创建这一个 bean, 是单例的
  • prototype: 原型的, 容器初始化时不创建 bean 的实例, 而在每次请求时都创建一个新的 Bean 实例, 并返回
<bean id="car" class="edu.just.spring.beans.autowire.Car" scope="prototype"><property name="brand" value="Audi"></property><property name="price" value="20000"></property>
</bean>

2.8 使用外部属性文件

db.properties:

user=root
password=lwh011305
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/fileupload?useSSL=true

导入属性文件:

<!-- 导入属性文件 -->
<context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!-- 使用外部化属性文件的属性 --><property name="user" value="${user}"></property><property name="password" value="${password}"></property><property name="driverClass" value="${driverClass}"></property><property name="jdbcUrl" value="${jdbcUrl}"></property>
</bean>

2.9 Spring 表达式语言:SpEL

类似于 EL:SpEL 使用 #{...} 作为定界符,所以在大框号中的字符被认为是 SpEL

为属性赋一个字面量:

<bean id="address" class="edu.just.spring.beans.spel.Address"><!-- 使用 spel 为属性赋一个字面值 --><property name="city" value="#{'beijing'}"></property><property name="street" value="wudaokou"></property>
</bean>

使用 SpEL 引用类的静态属性:

<bean id="car" class="edu.just.spring.beans.spel.Car"><property name="brand" value="Audi"></property><property name="price" value="2000"></property><!-- 使用 Spel 引用类的静态属性 --><property name="tyrePerimeter" value="#{T(java.lang.Math).PI * 80}"></property>
</bean>

使用 SpEL 来引用其他 Bean

<bean id="person" class="edu.just.spring.beans.spel.Person"><property name="name" value="luwenhe"></property><!-- 使用 Spel 来引用其他的 Bean 的属性 --><property name="city" value="#{address.city}"></property><!-- 使用 Spel 来引用其他的 Bean --><property name="car" value="#{car}"></property><!-- 使用 Spel 中使用运算符 --><property name="info" value="#{car.price > 30000 ? '金领' : '白领'}"></property>
</bean>

2.10 IOC 容器中 Bean 的生命周期方法

Spring IOC 容器对 Bean 的生命周期进行管理的过程:

  • 通过构造器或者工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 调用 Bean 的初始化方法
  • Bean 可以使用了
  • 当容器关闭时,调用了 Bean 的销毁方法

创建 Bean 方法

public class Car {public Car() {System.out.println("Car's Constructor ... ");}private String brand;public void setBrand(String brand) {System.out.println("setBrand ... ");this.brand = brand;}public String getBrand() {return brand;}public void init() {System.out.println("init ... ");}public void destory() {System.out.println("destroy ... ");}@Overridepublic String toString() {return "Car [brand=" + brand + "]";}
}

为 Bean 设置属性值:init-methoddestory-method 属性为 Bean 指定初始化和销毁方法

<bean id="car1" class="edu.just.spring.beans.cycle.Car"init-method="init" destroy-method="destory"><property name="brand" value="Audi"></property>
</bean>

调用 Bean 的初始化方法

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");Car car = (Car) ctx.getBean("car1");
System.out.println(car);ctx.close();

输出:

Car's Constructor ... 
setBrand ... 
init ... 
Car [brand=Audi]
六月 28, 2018 5:24:15 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6438a396: startup date [Thu Jun 28 17:24:14 CST 2018]; root of context hierarchy
destroy ... 

创建 Bean 的后置处理器

  • Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外处理
  • Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理,而非单一实例
  • 需要实现 BeanPostProcessor 接口

Spring IOC 容器对 Bean 的生命周期进行管理的过程

  • 通过构造器或者工厂方法创建 Bean 实例
  • 为 Bean 的属性设置值和对其他 Bean 的引用
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
  • 调用 Bean 的初始化方法
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization 方法
  • Bean 可以使用
  • 当容器关闭时,调用 Bean 的销毁方法

实现 BeanPostProcessor 接口:
bean: bean 实例本身
beanName: IOC 容器配置的 bean 的名字.
返回值: 是实际上返回给用户的那个 Bean,注意:可以在以上两个方法中修改返回的 Bean,甚至返回一个新的 Bean

public Object postProcessBeforeInitialization(Object bean, String beanName):init-method 之前被调用
public Object postProcessAfterInitialization(Object bean, String beanName):init-method 之后被调用的实现

public class MyBeanPostProcessor implements BeanPostProcessor{@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessBeforeInitialization: " + bean + ", " + beanName);if("car".equals(beanName)) {//..}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization: " + bean + ", " + beanName);Car car = new Car();car.setBrand("Ford");return car;}
} 

配置 Bean

<!-- 配置 Bean 的后置处理器: 不需要配置 id, IOC 容器自动识别是一个 BeanPostProcessor -->
<bean class="edu.just.spring.beans.cycle.MyBeanPostProcessor"></bean>

输出:

Car's Constructor ... 
setBrand ... 
postProcessBeforeInitialization: Car [brand=Audi], car1
init ... 
postProcessAfterInitialization: Car [brand=Audi], car1
Car's Constructor ... 
setBrand ... 
Car [brand=Ford]
六月 28, 2018 5:53:28 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6438a396: startup date [Thu Jun 28 17:53:27 CST 2018]; root of context hierarchy
destroy ... 

2.11 泛型依赖注入

泛型依赖注入:子类之间的依赖关系由其父类泛型以及父类之间的依赖关系来确定,父类的泛型必须为同一类型

BaseRepository 类

public class BaseRepository<T> {}

*UserRepository 类:*标识持久层

@Repository
public class UserRepository extends BaseRepository<User>{}

BaseService 类: 通过 Autowired 自动装配 BaseRepository 实例

public class BaseService<T> {@Autowiredprotected BaseRepository<T> repository;public void add() {System.out.println("add ...");System.out.println(repository);}}

UserService 类: 通过父类的泛型实例,在 UserService 中已经注入了 UserRepository 实例

@Service
public class UserService extends BaseService<User>{}

输出:

add ...
edu.just.spring.beans.generic.di.UserRepository@799d4f69

相关文章:

Spring | 基础

1. IOC和DI IOC&#xff1a;控制反转&#xff0c;其思想是反转资源获取的方向&#xff0c;传统的资源查找方式要求组件向容器发起请求查找资源&#xff0c;作为回应&#xff0c;容器适时的返回资源。而应用了 IOC 之后&#xff0c;则是**容器主动地将资源推送给它所管理的组件…...

windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式

提示&#xff1a;文章写完后windows7安装sql server 2000安装步骤 及安装过程中遇到的问题和解决方式&#xff0c; 文章目录一、ms sql server 2000是什么&#xff1f;版本简介&#xff1a;**特点&#xff1a;****优点&#xff1a;**二、步骤1.下载安装包及Sq4补丁包2.安装 ms …...

Python 开发-批量 FofaSRC 提取POC 验证

数据来源 学习内容和目的&#xff1a; ---Request 爬虫技术&#xff0c;lxml 数据提取&#xff0c;异常护理&#xff0c;Fofa 等使用说明---掌握利用公开或 0day 漏洞进行批量化的收集及验证脚本开发Python 开发-某漏洞 POC 验证批量脚本---glassfish存在任意文件读取在默认4…...

Linux系统中部署软件

目录 1.Mysql 2.Redis 3.ZooKeeper 声明 致谢 1.Mysql 参考&#xff1a;CentOS7安装MySQL 补充&#xff1a; ① 执行&#xff1a;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 再执行&#xff1a;yum -y install mysql-community-server ② mysql…...

PHP常用框架介绍与比较

HP是一种广泛应用于Web开发的编程语言。随着互联网的快速发展,PHP的应用场景变得越来越广泛,从简单的网站到复杂的Web应用程序都可以使用PHP来开发。为了更好地组织和管理PHP代码,开发人员经常会使用框架来提高开发效率和代码质量。 本文将介绍一些常用的PHP框架,并进行简…...

Umi + React + Ant Design Pro 项目实践(一)—— 项目搭建

学习一下 Umi、 Ant Design 和 Ant Design Pro 从 0 开始创建一个简单应用。 首先&#xff0c;新建项目目录&#xff1a; 在项目目录 D:\react\demo 中&#xff0c;安装 Umi 脚手架&#xff1a; yarn create umi # npm create umi安装成功&#xff1a; 接下来&#xff0c;…...

MySQL知识点总结(1)

目录 1、sql、DB、DBMS分别是什么&#xff0c;他们之间的关系&#xff1f; 2、什么是表&#xff1f; 3、SQL语句怎么分类呢&#xff1f; 4、导入数据 5、什么是sql脚本呢&#xff1f; 6、删除数据库 7、查看表结构 8、表中的数据 10、查看创建表的语句 11、简单的查询…...

day45第九章动态规划(二刷)

今日任务 70.爬楼梯(进阶)322.零钱兑换279.完全平方数 70.爬楼梯(进阶) 题目链接&#xff1a; https://leetcode.cn/problems/climbing-stairs/description/ 题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…...

第十四届蓝桥杯第三期模拟赛原题与详解

​​​​​​​ 文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描…...

client打包升级

目录 前言 一、client如何打包升级&#xff1f; 二、使用步骤 1.先进行改版本 2.执行打包升级命令 总结 前言 本文章主要记录一下&#xff0c;日常开发中&#xff0c;常需要进行打包升级的步骤。 一、client如何打包升级&#xff1f; # 升级发布版本 ## 修改版本 * 父p…...

Blazor_WASM之3:项目结构

Blazor_WASM之3&#xff1a;项目结构 Blazor WebAssembly项目模板可选两种&#xff0c;Blazor WebAssemblyAPP及Blazor WebAssemblyAPP-Empty 如果使用Blazor WebAssemblyAPP模板&#xff0c;则应用将填充以下内容&#xff1a; 一个 FetchData 组件的演示代码&#xff0c;该…...

OperWrt 包管理系统02

文章目录 OperWrt 包管理系统OPKG简介OPKG的工作原理OPKG命令介绍软件包的更新、安装、卸载和升级等功能软件包的信息查询OPKG配置文件说明OPKG包结构(.ipk)OPKG演示案例OperWrt 包管理系统 OPKG简介 OPKG(Open/OpenWrt Package)是一个轻量快速的软件包管理系统,是 IPKG…...

人人都学会APP开发 提高就业竞争力 简单实用APP应用 安卓浏览器APP 企业内部通用APP制作 制造业通用APP

安卓从2009年开始流程于手机、平板&#xff0c;已经是不争的非常强大生产力工具&#xff0c;更为社会创造非常高的价值&#xff0c;现在已经是202X年&#xff0c;已经十几年的发展&#xff0c;安卓平台已经无所不在。因此建议人人都学学APP制作&#xff0c;简易入门&#xff0c…...

【自然语言处理】从词袋模型到Transformer家族的变迁之路

从词袋模型到Transformer家族的变迁之路模型名称年份描述Bag of Words1954即 BOW 模型&#xff0c;计算文档中每个单词出现的次数&#xff0c;并将它们用作特征。TF-IDF1972对 BOW 进行修正&#xff0c;使得稀有词得分高&#xff0c;常见词得分低。Word2Vec2013每个词都映射到一…...

LIME: Low-light Image Enhancement viaIllumination Map Estimation

Abstract当人们在低光条件下拍摄图像时&#xff0c;图像通常会受到低能见度的影响。除了降低图像的视觉美感外&#xff0c;这种不良的质量还可能显著降低许多主要为高质量输入而设计的计算机视觉和多媒体算法的性能。在本文中&#xff0c;我们提出了一种简单而有效的微光图像增…...

源码指标编写1000问4

4.问: 哪位老师把他改成分析家的,组合公式&#xff1a;猎庄敢死队别样红(凤翔) {猎庄敢死队} rsv:(c-llv(l,9))/(hhv(h,9)-llv(l,9))100; stickline(1,50,50,1,0),pointdot,Linethick2,colorff00; k:sma(rsv,3,1); d:sma(k,3,1); rsv1:(hhv(h,9.8)-c)/(hhv(h,9.8)-llv(l,9.8))1…...

Golang中GC和三色屏障机制【Golang面试必考】

文章目录Go v1.3 标记—清楚(mark and sweep)方法Go V1.5 三色标记法三色标记过程无STW的问题强弱三色不变式插入写屏障Go V1.8的三色标记法混合写屏障机制混合写屏障场景场景1:对象被一个堆对象删除引用&#xff0c;成为栈对象的下游场景2:对象被一个栈对象删除引用&#xff0…...

MOS FET继电器(无机械触点继电器)设计输入侧电源时的电流值概念

设计输入侧电源时的问题 机械式继电器、MOS FET继电器分别具有不同的特长。基于对MOS FET继电器所具小型及长寿命、静音动作等优势的需求&#xff0c;目前已经出现了所用机械式继电器向MOS FET继电器转化的趋势。 但是&#xff0c;由于机械式继电器与MOS FET继电器在产品结构…...

5. 驱动开发

文章目录一、驱动开发1.1 前言1.2 何谓驱动框架1.3 内核驱动框架中LED的基本情况1.3.1 相关文件1.3.2 九鼎移植的内核中led驱动1.3.3 案例分析驱动框架的使用1.3.4 典型的驱动开发行业现状1.4 初步分析led驱动框架源码1.4.1 涉及到的文件1.4.2 subsys_initcall1.4.3 led_class_…...

模板方法模式详解

模板方法模式&#xff08;行为模式&#xff09; 1. 模板方法模式介绍 父类定义算法骨架&#xff0c;细节的具体实现延迟到子类子类只是定义某些自己的个性化处理&#xff0c;但不改变执行顺序 2. 好处 减少代码冗余&#xff0c;共性抽取后算法流程更加清晰与规范降低流程性…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...