当前位置: 首页 > 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;共性抽取后算法流程更加清晰与规范降低流程性…...

关于 Lightweight process container,ChatGPT的答案

晓楚 Can you give me a list of process container? As an AI language model, I can provide you with a list of popular process containers, which are as follows: Docker Kubernetes Apache Mesos LXC OpenVZ systemd-nspawn rkt (Rocket) Linux Containers (LXC) Ga…...

机器学习和深度学习的综述

机器学习和深度学习的综述 1.1.1人工智能、机器学习、深度学习的关系 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是最宽泛的概念&#xff0c;是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。由于这个定义…...

Synopsys Sentaurus TCAD系列教程之--Sprocess(SmallMOS_2D3D) 解析

SmallMOS_2D3D解析 #header## STI depth set sti_depth 0.15 ## Half STI width set sti_width sti_width ## Half gate length set gate_len <lg/2> ## SD length (from center) set sd_len [expr $gate_len0.05]#endheader## X lines line x location 0.0 spacing 0.…...

好使!NAS中傻瓜式配置反向代理及SSL证书,提升网络安全性!

对于有NAS或者有个人主机的朋友来说&#xff0c;将机器映射到外网是基本操作。 但是一般来说&#xff0c;能直接从外网访问的往往仅有80和443端口。事实上&#xff0c;运营商一般把家庭宽带的这两个端口都封了&#xff0c;所以如果我们想要从外网访问自己家中机器部署的服务&a…...

数据结构队列-先进先出

一&#xff0c;概述 队列这个概念非常好理解。你可以把它想象成排队买票&#xff0c;先来的先买&#xff0c;后来的人只能站末尾&#xff0c;不允许插队。先进者先出&#xff0c;这就是典型的“队列”。 二&#xff0c;顺序队列和链式队列 队列和栈一样&#xff0c;也是一种…...

CentOS 7使用TiUP部署TiDB

本文主要是根据官方文档指导&#xff0c;结合实际主机情况&#xff0c;在Cent OS7上使用TiUP在线部署TiDB。 环境说明 类型操作系统版本配置中控机Deepin 20.34核CPU6G内存40G硬盘TiDB部署机Cent OS 7.38核CPU48G内存100硬盘网络情况中控机与外网相连&#xff0c;中控机与部署…...

java单元测试批处理数据模板【亿点点日志配合分页以及多线程处理】

文章目录引入相关资料环境准备分页查询处理&#xff0c;减少单次批量处理的数据量级补充亿点点日志&#xff0c;更易观察多线程优化查询_切数据版多线程_每个线程都分页处理引入 都说后端开发能顶半个运维&#xff0c;我们经常需要对大量输出进行需求调整&#xff0c;很多时候…...

【数据结构】模拟实现 堆

堆数据结构是一种数组对象&#xff0c;它可以被看作一颗完全二叉树的结构&#xff08;数组是完全二叉树&#xff09;&#xff0c;堆是一种静态结构。堆分为最大堆和最小堆。最大堆&#xff1a;每个父结点都大于孩子结点。最小堆&#xff1a;每个父结点都小于孩子结点。堆的优势…...

Go语言学习的第三天--上部分(基础用法)

前两天经过不断度娘&#xff0c;与对up主的跟踪学习了解了go的历史&#xff0c;今天开始了go的基础&#xff01;&#xff01;本章主要是go 的注释、变量及常量的梳理一、注释不管什么语言都有自己的注释&#xff0c;go也不例外 &#xff01;&#xff01;单行注释 // 多行注释 …...

linux面试基础篇

题目目录1.简述DNS分离解析的工作原理&#xff0c;关键配置2.apache有几种工作模式&#xff0c;分别简述两种工作模式及其优缺点&#xff1f;3.写出172.0.0.38/27 的网络id与广播地址4.写出下列服务使用的传输层协议&#xff08;TCP/UDP&#xff09;及默认端口5.在局域网想获得…...

域名购买查询/seo权重优化

Algorithm 直接插入排序 算法概述&#xff1a; 把前面的数组排好序&#xff0c;后面的元素插入到排好序的数组中。 实现思路&#xff1a; 把数组分为有序和无序两部分&#xff0c;分别用下标去指向&#xff08;有序&#xff08;j&#xff09;&#xff0c; 无序&#xff08…...

免费英文网站建设/网络营销与直播电商专升本

把数组排成最小的数(三十二) 题目描述 输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。例如输入数组{3&#xff0c;32&#xff0c;321}&#xff0c;则打印出这三个数字能排成的最小数字为321323。 代码…...

个性网站制作/百度搜索引擎推广步骤

我有一个表单验证问题。下面是提交时发生的逻辑(至少是其中的一部分)。在for循环中&#xff0c;我们检查一个站点访问者可以注册的可能事件数组。如果用户没有检查任何事件(这些是复选框&#xff0c;因为用户可以注册多个事件)&#xff0c;我们应该在下面输入第二条if语句&…...

网站建设一个月做十单/网站入口百度

1 &#xff0c;启动 zookeeper 命令 &#xff1a;( ) 2 &#xff0c;查看 zookeeper 启动状态命令 &#xff1a;( ) 3 &#xff0c;停止 zookeeper 命令 &#xff1a;( ) 4 &#xff0c;动手题 &#xff1a;请编写老师在课上写的 3 个 shell 脚本&#xff0c;一键启动集群&…...

河源建设用地竞拍网站/百度最新秒收录方法2023

一&#xff0c;Activity的主要作用 Activity位于src目录下面&#xff0c;创建的Activity继承Activity类&#xff0c;并且要重写onCreate方法。可以把Activity理解成.net里面的Form,只不过.net里面的Form上面的控件是可见的&#xff0c;是我们托拉拽上去的&#xff0c;而Activit…...

wordpress完整迁移/网络营销案例及分析

今日因旅游时间紧张仅通过一道题&#xff1a;1029&#xff08;本题是IOI98的题目&#xff09; 今天没有充足时间刷题&#xff0c;明天必会补上转载于:https://www.cnblogs.com/wangximing/p/11094514.html...