【精简】Spring笔记

news2024/9/21 14:37:38

文章目录

    • 跳转链接(学习路线)及前言(更新中)
  • 快速入门
  • 配置文件详解
  • 依赖注入(bean实例化)
  • 自动装配
  • 集合注入
  • 使用spring加载properties文件
  • 容器
  • 注解开发
  • bean管理
  • 注解开发依赖注入
  • 第三方bean
    • 整合mybatis
    • 整合junit
  • AOP
    • 入门案例
    • 切入点表达式
    • 通知类型
    • 获取数据
  • 事务
    • 事务角色
    • 事务属性

跳转链接(学习路线)及前言(更新中)

后端
Java

MySql

jdbc

javaEE/javaSE

Tomcat

Servlet

[JSP]

Spring

SpringMVC

SpringBoot

SpringCloud

zookeeper、kafka、ActiveMQ、RabbitMQ、RocketMQ、Lucene

增强
设计模式、数据结构与算法、Docker、Linux

前端
html

css

javascript

javascriptDOM操作

JQuery

ajax

vue

react

安卓

嵌入式

快速入门

引入maven依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
    </dependencies>

创建xml文件用于配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

添加配置项

 <bean id="userDao" class="com.shuxin.dao.impl.UserDaoImpl"></bean>	

创建一个main方法

        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserDao userDao = (UserDao) app.getBean("userDao");
        userDao.save();

配置文件详解

bean范围配置,scope属性

取值说明
singleton默认的、单例的
prototype多例的
requestWEB项目中,Spring创建一个Bean的对象,将对象存入到request域中
sessionWEB项目中,Spring创建一个Bean的对象,将对象存入到session域中
global sessionWEB项目中,应该在Portlet环境,如果没有Portlet环境那么globalSession相当于session

销毁和初始化方法(生命周期)

在对应bean中创建init和destory方法,在xml配置这两个方法以用于初始化和销毁

    <bean id="userDao" class="com.shuxin.dao.impl.UserDaoImpl" init-method="init" destroy-method="destory"></bean>

ClassPathXmlApplicationContext类中有个方法,有个方法,registerShutdownHook()注册关闭钩子,关闭容器

如果大量配置这种方法会很麻烦,这里有一个简化的使用方法

public class UserService implements InitializingBean, DisposableBean {

  private   UserDao userDao;

    // ...
    
    @Override
    public void destroy() throws Exception {
        // ...
    }

    @Override
    public void afterPropertiesSet() throws Exception {
	   // ...	
    }
}

别名配置

<bean id="userDao" name="dao" class="com.shuxin.dao.impl.UserDaoImpl"></bean>

依赖注入(bean实例化)

实例化的三种方式

1、无参构造方法实例化

也就是默认的方法,上面使用的都是

2、静态工厂实例化(了解)

在这里,静态类,接口和静态工厂是等价的

需要一个工厂类,工厂类必须有静态方法,并且返回一个需要被实例化的类

public class StaticFactory {

    public static UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

配置文件写工厂类

<bean id="factory" class="com.shuxin.factory.StaticFactory"></bean>
<bean id="userDao" class="com.shuxin.factory.StaticFactory" factory-method="getUserDao"></bean>
<!-- 				那个类是工厂类?  						 那个方法是造对象的? -->

3、实例工厂实例化bean(了解)

这里的getUserDao非静态的,所以需要创建工厂的实例(对象),再使用该实例来调用造对象的方法,来获取到返回值。

public class StaticFactory {

    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}
    <bean id="factory" class="com.shuxin.factory.StaticFactory"></bean>

    <bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>
 		<!-- 用哪个bean造对象?				用哪个方法造对象? -->

4、Factory(是第三种方式的完善版 掌握)

public class FactoryBean implements org.springframework.beans.factory.FactoryBean<UserDao> {

//    代替第三种方法,固定创建对象的方法的名字
    @Override
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return UserDao.class;
    }
    
    //这是第三个方法,这里控制该对象是否为单例
        @Override
    public boolean isSingleton() {
//        这是单例的,false为多例的(非单例)
        return true;
    }
}
<!-- 这种方式配置bean,那么配置文件内就会变得简单 -->
<bean id="userDao" class="com.shuxin.factory.FactoryBean">
					  <!-- 这里填factory的名称 -->


将Dao层注入到Service层

setter方式

	<!-- application.xml -->

	<bean id="userDao" class="com.shuxin.dao.impl.UserDaoImpl">

    </bean>

    <bean id="userService" class="com.shuxin.service.UserService">
        <property name="userDaolll" ref="userDao"></property>
    </bean>
// UserDaoImpl.java
public class UserDaoImpl{
    public void fun(){
          System.out.println("这是UserDaoImpl内的fun方法");
    }
}

// UserService.java
public class UserService{
    private UserDao userDaolll;
    
    public void fun(){
        userDaolll.fun();
         System.out.println("这是UserService内的fun方法");
    }
    
    //需要注意设置set方法
        public void setUserDaolll(UserDao userDaolll) {
        this.userDaolll = userDaolll;
        }
}

构造器方式

public class UserService implements {

  private   UserDao userDao;

    public UserService(UserDao userDao111) {
        this.userDao = userDao111;
    }
 }
  <bean id="userDao" class="com.shuxin.dao.impl.UserDaoImpl">

    </bean>

    <bean id="userService" class="com.shuxin.service.UserService">
<!--        <property name="userDaolll" ref="userDao"></property>-->
        <constructor-arg name="userDao111" ref="userDao"></constructor-arg>
    </bean>

自动装配

按类型装配

    <bean id="userService" class="com.shuxin.service.UserService">
        <constructor-arg type="int" value="18"></constructor-arg>
        <constructor-arg type="java.lang.String" value="zhangsan"></constructor-arg>
    </bean>
public class UserService {

    private int age;
    private String name;

    public UserService(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

按参数位置装配

    <bean id="userService" class="com.shuxin.service.UserService">
        <constructor-arg index="0" value="18"></constructor-arg>
        <constructor-arg index="1" value="zhangsan"></constructor-arg>
    </bean>
public class UserService {

    private int age;
    private String name;

    public UserService(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

强制性依赖使用构造器的方式,setter方法有概率不执行,所以必须初始化的类使用构造器的方式,可选的依赖使用stter注入。

倡导使用构造器,第三方框架大部分使用构造器注入方式,有必要时,使用两种,根据实际情况。

自己开发模块使用setter注入,因为不常写构造器。

自动装配

1、按类型(常用)

2、按名称

3、按构造方法

4、不启用自动装配

1、

    <bean id="userDao" class="com.shuxin.dao.impl.UserDaoImpl" />

    <bean id="userService" class="com.shuxin.service.UserService" autowire="byType" />
public class UserService {

    UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

按类型匹配,该类型的bean必须唯一,并且可以不写被装配的id属性

 <bean class="com.shuxin.dao.impl.UserDaoImpl" />

2、

    <bean id="userDao" class="com.shuxin.dao.impl.UserDaoImpl" />

    <bean id="userService" class="com.shuxin.service.UserService" autowire="byName" />
public class UserService {

    UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

按照UserService类的成员变量userDao的名来匹配,(更准确的说是按照set方法后的这个名字匹配)

自动装配不能用于简单类型

自动装配的优先级低于setter注入和构造器注入

集合注入

   <bean name="listTest" class="com.shuxin.demo.ListTest">
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>shuxinxin</value>
                <value>123</value>
                <value>hello</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>ssss</value>
                <value>ssss</value>
                <value>abc</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="1" value="avbc"></entry>
                <entry key="2" value="abc"></entry>
                <entry key="3" value="shuxin"></entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="country">China</prop>
                <prop key="country">beijing</prop>
                <prop key="country">nanjing</prop>
            </props>
        </property>
    </bean>
public class ListTest {

    private int[] array;

    private List<String> list;

    private Set<String> set;

    private Map<String,String>map;

    private Properties properties;


    public ListTest() {
    }



    public void setArray(int[] array) {
        this.array = array;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }
}

使用spring加载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
               http://www.springframework.org/schema/beans/spring-context.xsd
">
    
    
    
    <context:property-placeholder location="jdbc.properties"></context:property-placeholder>
    <!-- system-properties-mode="NEVER"不加载系统属性   加载多个  推荐使用classpath:*.properties  使用第三方jar包的话,使用classpath*:*.properties(不仅从该工程读,还可以从依赖中读) -->
     <context:property-placeholder location="jdbc.properties,jdbc2.properties,*.properties,classpath:*.properties" system-properties-mode="NEVER"></context:property-placeholder>

    <bean class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/shuxin
jdbc.username=root
jdbc.password=root

容器

使用文件加载xml配置文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

        ApplicationContext  ctx = new FileSystemXmlApplicationContext("D:\\data\\tomcat\\mysbtis1\\springioc\\src\\main\\resources\\applicationContext.xml");

按类型获取bean

        UserService bean = ctx.getBean(UserService.class);
        bean.fun();

注解开发

<?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
               http://www.springframework.org/schema/context/spring-context.xsd
">


    <context:component-scan base-package="com.shuxin.service"></context:component-scan>
</beans>
@Component("ComponentBean")
// 这里不指定名称的话,访问时使用类型来访问
public class ComponentBean {
     public void save(){
         System.out.println("ComponetBean");
     }
}

纯注解

        
// 调用
		ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService bean = ctx.getBean(UserService.class);
        bean.fun();
// 新建一个配置类


// 设定当前类为配置类
@Configuration

// 设定扫描路径  多个写法  @ComponentScan({"com.shuxin","com.xxx",...})
@ComponentScan("com.shuxin")
public class SpringConfig {


}

bean管理

作用范围

控制单例非单例

@Scope默认为单例

@Scope(“singleton”)单例

@Scope(“prototyoe”)非单例

生命周期

@Component
@Scope("prototype")
public class UserService {


    @PostConstruct
    public void init(){

    }
    @PreDestroy
    public void destory(){

    }
    
    public void fun(){
        System.out.println("sdfsdfsdf");
    }
}
// pom.xml 高于11版本的jdk使用这个依赖
<dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
    </dependency>

注解开发依赖注入

注解开发依赖注入(自动装配)

@Component
public class UserService {

    @Autowired
    private UserDao userDao;
    
    
    public void fun(){
        userDao.save();
    }
}


// 如果有多个实现可以为其命名
@Repository("userDao1")
@Component("userDao1")
// 使用这个注解指定转配的实现类
    @Qualifier("userDao1")

简单类型

@Value("xiadada")

private String name;

从外部properties取值

1、在配置类添加注解,引入配置文件

@PropertySource("classpath:value.properties")
name="xiadada"

2、使用时

  @Value("${name}")
    private String name;

第三方bean

//@Configuration
public class JdbcConfig {
    //    获得管理的bean对象
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/java");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
}



@Configuration
//@ComponentScan("com.shuxin.config")
@Import(JdbcConfig.class)  // 支持数组
public class SpringConfig {


}

整合mybatis

MybatiesConfig。java
public class MybatiesConfig {

    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setTypeAliasesPackage("com.shuxin.pojo");
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.shuxin.dao");
        return mapperScannerConfigurer;
    }
}


SpringConfig。java
@Configuration
@ComponentScan("com.shuxin")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatiesConfig.class})
public class SpringConfig {
}

JdbcConfig。java
public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Bean
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }
}

整合junit

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
    </dependencies>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class TestSSS {

    @Autowired
    private BookService bookService;

    @Test
    public void testBookService(){
        bookService.fun();
    }

}

简单类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

引用类型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AOP

入门案例

1、导入坐标

aop的包默认导入(spring包的依赖)

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.20</version>
        </dependency>

2、制作连接点方法

3、制作共性功能

4、定义切入点

5、绑定切入点与通知的关系(切面)

@Component
@Aspect
public class MyAop {
    @Pointcut("execution(void com.shuxin.service.TestWan.fun())")
    private void fun(){}


//    共性功能
    @Before("fun()")
    public void commonFun(){
        System.out.println(System.currentTimeMillis());
    }
}
@Configuration
@ComponentScan("com.shuxin")
@EnableAspectJAutoProxy
public class SpringConfig {
}

切入点表达式

execution(void com.shuxin.service.TestWan.fun())

动作关键字:描述切入点的行为动作,例如execution表示执行到指定切入点

访问修饰符:public,private等,可以省略

返回值

包名

类/接口名

方法名

参数

异常名:方法定义中抛出指定异常,可以省略


“ * ” 单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现

execution(public * com.shuxin.*.UserService.find* (*) )

匹配com.shuxin包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法


“ … ” 多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写

execution(public User com..UserService.findById(..)

匹配com包下的任意包中的UserService类或接口中所有名称为findByld的方法


专用于匹配子类类型

execution(* *..*Service+.*(..))

注意:

所有代码按照标准规范开发,否则以下技巧全部失效

描述切入点通常描述接口,而不描述实现类

访问控制修饰符针对接口开发均采用public描述(可省略访问控制修饰符描述)

返回值类型对于增删改类使用精准类型,加速匹配,对于查询类使用“通配快速描述

包名书写尽量不使用 … 匹配,效率过低,常用做单个包描述匹配,或精准匹配

接口名/类名书写名称与模块相关的采用匹配,例如UserService书写成Service,绑定业务层接口名

方法名书写以动词进行精准匹配,名词采用*匹配,例如getByld书写成getBy*,selectAll书写成selectAll

参数规则较为复杂,根据业务方法灵活调整

通常不使用异常作为匹配规则

通知类型

前置通知

@Before("fun()")
    public void commonFun(){
        System.out.println(System.currentTimeMillis());
    }

后置通知

@After("fun()")

环绕通知(重点)

    @Around("fun()")
    public Object commonFun(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("在前执行");
        Object ret = pjp.proceed();
        System.out.println("在后执行");
        return ret;  //或者返回原来本该返回的返回值,这里是ret(proceed方法返回原来的值)
    }

对有返回值的方法,需要在下面将return写上(会将return覆盖掉,在proceed方法返回原来的值)

注意

环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行

对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Obiect类型

原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object

由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象

返回后通知(了解)

设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法正常执行完毕后运行

 @AfterReturning("fun()")
    public void commonFun(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("不抛异常才会在末尾执行");
    }

抛出异常后通知(了解)

设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法运行抛出异常后执行

@AfterThrowing("fun()")
    public void commonFun(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("抛异常才会在末尾执行");
    }

获取数据

获取切入点参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知

ProceedJointPoint:适用于环绕通知

获取切入点方法返回值

返回后通知

环绕通知

获取切入点方法运行异常信息

抛出异常后通知

环绕通知

事务

在需要添加事务的方法上添加注解,注意最好放到接口上

@Transactional
    public void transfer(int out,int in,Double money);

在jdbcConfig配置类添加

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }

在SpringConfig配置类添加注解

@EnableTransactionManagement
public class SpringConfig {
}

事务角色

事务管理员

发起事务方,在spring中通常指代业务层开启事务方法

事务协调员

加入事务方,在spring中通常指代数据层方法,也可以是业务层方法

事务属性

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

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

相关文章

【git分支管理策略】如何高效的管理好代码版本

目录 1.分支管理策略 2.我用的分支管理策略 3.一些常见问题 1.分支管理策略 分支管理策略就是一些经过实践后总结出来的可靠的分支管理的办法&#xff0c;让分支之间能科学合理、高效的进行协作&#xff0c;帮助我们在整个开发流程中合理的管理好代码版本。 目前有两套Git…

奇偶校验|ECC内存|海明码

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;本篇文章给大家介绍数据出错和有什么方法能减少出错。 单比特翻转 由于硬件故障或其他原因&#xff0c;内存或其他存储设备中的单个比特位发生随机变化的现象。 例如&#xff0c;原本存储为1的位可能变为0&#xff0c;或…

放弃 Rust 选择 Zig,Xata 团队推出 pgzx —— 计划使用 Zig 开发基于 PG 的分布式数据库

Summary Xata 公司在基于 PostgresSQL 开发自己的分布式数据库&#xff0c;出于 Zig 和 C 语言以及 PostgreSQL 的 API 有更好的互操作性的考虑&#xff0c;他们选择了 Zig 而非当红炸子鸡语言 Rust。他们的博客文章中对 pgzx 进行了介绍。让我们来看下他们对 Zig 和 Rust 语言…

创建多节点 k8s 集群

主机IP系统master192.168.2.15ubuntu20.04 x64 2C 4GWorker1192.168.2.16ubuntu20.04 x64 2C 4GWorker1192.168.2.18ubuntu20.04 x64 2C 4G 使用 iterm2 连接四台服务器 command shift i 同时操作 初始化配置 关闭防火墙 systemctl stop firewalld systemctl disable firewa…

Qt篇——Qt无法翻译tr()里面的字符串

最近遇到使用Qt语言家翻译功能时&#xff0c;ui界面中的中文都能够翻译成英文&#xff0c;但是tr("测试")这种动态设置给控件的中文&#xff0c;无法翻译&#xff08;lang_English.ts文件中的翻译已经正确添加了tr()字符串的翻译&#xff09;。 上网搜了很多资料&am…

Redis(十八)Redlock算法

文章目录 自研锁逻辑lock加锁关键逻辑 Redlock红锁算法自研锁存在的问题Redlock算法设计理念RedisonRedisson使用案例Redisson源码分析多机案例 自研锁逻辑 按照JUC里面java.util.concurrent.locks.Lock接规范编写 lock加锁关键逻辑 加锁的Lua脚本&#xff0c;通过redis里面的…

vue3+vite - 报错 import.meta.glob() can only accept string literals.(详细解决方案)

报错说明 在vue3+vite项目中,解决报错: [plugin:vite:import-analysis] import.meta.glob() can only accept string literals. 如果我们报错差不多,就可以完美搞定这个错误。 解决教程 这个错误,是因为

【笔记】MJ Prompt

参数 --chaos 10 or --c 10, 0-10, defalut 0 --quality 1 or --q, 0.25-1, defalut 1 --iw 2, 0.5-2, --stylize 100 or --s 100, 0-1000, defalut 100 --cref URL --cw 100, 0-100stylize 风格化&#xff0c;MJ不同的出图模式&#xff0c;有默认的艺术风格&#xff0c;该值…

TCP协议中的传输控制机制图文详解「重传机制」「流量控制」「拥塞控制」

目录 TCP重传机制 超时重传 快速重传 SACK 方法 Duplicate SACK TCP 流量控制 滑动窗口 累积确认 窗口大小由哪一方决定&#xff1f; 接收窗口和发送窗口的大小是相等的吗&#xff1f; 流量控制 窗口关闭的后果 糊涂窗口综合症 TCP拥塞处理 为什么要有拥塞控制呀&#xff0c;不…

LinkedIn账号为什么被封?被封后如何解决?

近期会有一些小伙伴说自己遇到了帐号无法登录的情况&#xff0c;其实出现领英帐号被封号(被限制登录)主要会有两类情况&#xff0c;今天就给大家分享一下如果被封该如何解决&#xff0c;强烈建议收藏。 在电脑领英官网或者手机领英APP上&#xff0c;输入领英帐号密码点击登录后…

力扣● 84.柱状图中最大的矩形

84.柱状图中最大的矩形 需要找到元素i的上一个更小的元素leftmin和下一个更小的元素rightmin&#xff0c;这样leftmin和rightmin之间的元素都比当前元素i更大&#xff0c;那么矩形的宽就是中间的这些元素&#xff1a;可以从leftmin1延伸到rightmin-1&#xff0c;长即为height[i…

rancher2.6部署

rancher2.6部署 1、准备环境镜像 2、部署3、密码获取密码设置新密码 4、设置语言5、导入已有集群 1、准备 环境 docker-ce-20.10.23-3.el8.x86_64.rpm以及依赖rpm kubernetes&#xff1a;v1.23.17 镜像 &#xff08;rancher和k8s有个版本对应关系&#xff0c;rancher2.5就不…

走进redisson

这里作者将大家走进redisson&#xff0c;读完这篇相信加深你对redisson的获取锁&#xff0c;重入&#xff0c;超时&#xff0c;看门狗&#xff0c;发布订阅等原理和功能的理解。 本文将深入原理代码&#xff0c;给出每行代码的意义以及最后的效果&#xff0c;过程有些枯燥&…

Python 指南-最短路径(Dijkstra 算法):

Dijkstra 算法可在 Python 库 OSMNX 中实现&#xff0c;可用于查找两个位置之间按距离或时间加权的最短路径。该算法使用 OpenStreetMap (OSM) 网络来驾驶、步行或骑自行车&#xff0c;并在后台使用 Python 库 NETWORKX 查找路线。 编码练习 正如我提到的&#xff0c;我将做一…

MySQL数据库 @@transaction_isolation参数的查询及修改

在应用开发过程中&#xff0c;可能会检查mysql数据库初始化参数符合要求。 遇到这种情况就要进行相应的调整。 1、查询参数信息 select transaction_isolation; 2、找到配置文件 &#xff0c;以window系统为例。 修改前先关闭MySQL数据库服务 对应需要修改的参数&#xff…

C语言看完我这篇最详细文件操作,你不会也得会!!!

1.使用文件 我们写的程序的数据是存储在电脑内存中&#xff0c;如果程序退出&#xff0c;内存就会被回收&#xff0c;数据就丢失&#xff0c;内存更具有一些实时性&#xff0c;等再次运行程序的数据的&#xff0c;数据就消失了&#xff0c;如果想要持久化的保存&#xff0c;可以…

LangChain-Chatchat

文章目录 关于 LangChain-Chatchat特性说明实现原理文档处理流程技术路线图&#xff08;截止0.2.10&#xff09; 使用 关于 LangChain-Chatchat Langchain-Chatchat&#xff08;原Langchain-ChatGLM&#xff09;基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答。 gith…

[自研开源] 数据集成之分批传输 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 本篇基于…

STM32F4x7标准库移植LWIP

项目背景 使用GD芯片的我们&#xff0c;都会去参考ST的代码。可是呢&#xff0c;有一个很大的问题就是&#xff0c;ST早就提供HAL库了&#xff0c;而目前GD还只有标准库。在移植LWIP的时候&#xff0c;会有很多不便。 好在天无绝人之路&#xff0c;找到了一份ST的官方例程&am…