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

Spring篇知识点(1)

 

一、Spring框架的特性

  •  IOC和DI支持:Spring 的核⼼就是⼀个⼤的⼯⼚容器,可以维护所有对象的创建和依赖关系,Spring ⼯⼚⽤于⽣成Bean,并且管理 Bean 的⽣命周期,实现⾼内聚低耦合的设计理念。
  • AOP编程支持:方便实现对程序进行权限拦截、运行监控等切面功能
  • 声明式事务支持:加@Transactional注解,方法执行时自动开启/提交/回滚事务。
  • 快捷测试支持:Spring 提供了 Spring TestContext Framework,方便做单元测试/集成测试。可以直接在测试里加载 Spring 容器,注入 Bean。
  • 快速集成功能:指的是 Spring Boot 提供的一套 Starter 机制。通过一个依赖 + 配置文件,就能自动接入常见的第三方框架,省去大量手写配置。
  • 复杂API模板封装:链式

二、Spring框架由哪些部分组成

  •  Spring Container(核心容器)
    • Spring Core:提供 IoC、依赖注入(DI)的底层功能。
    • Spring Beans:BeanFactory、ApplicationContext,负责 Bean 的生命周期和管理。
    • Spring Context:更高级的 IoC 容器,支持国际化、事件传播、资源加载
    • Spring Expression Language (SpEL):支持在配置文件和注解里写表达式,比如 #{user.age}${db.url}
  • AOP:@Transactional、AOP 日志切面。
  • Data Access/Integration:JdbcTemplate 简化原始 JDBC API。整合 Hibernate、MyBatis、JPA 等。提供声明式事务和编程式事务。
  • Spring Web:Spring MVC,最常用的 Web 框架,基于 Servlet,支持 RESTful API。
  • Test:
    • 提供对 JUnit、TestNG 的集成。

    • 提供 Spring TestContext Framework,可以在测试中直接注入 Bean。

    • 支持 MockMvc 模拟 Web 请求测试。

三、Spring中常用注解

1. Web

① @ Controller

  @RestController = @Controller + @ResponseBody

  Java里的返回值 = 逻辑视图名,如“home”,再交给模板引擎渲染成完整的HTML页面(如 templates/home.html),最后返回给浏览器。

  若你用@Controller,加了@ResponseBody,返回值就直接写到响应体,不会再走试图解析器,跟@RestController 的作用一样。

② RequestMapping

  这是请求映射注解,用来把HTTP请求映射到控制器方法或类。包括类级别和方法级别。

@Controller
// 类级别 @RequestMapping("/users") public class UserController {// 方法级别@RequestMapping("/list")public String listUsers() {return "userList"; // 返回页面} }
// 请求/users/list 会映射到 listUsers()
// 类上的 @RequestMapping 作为 前缀,方法上的作为 后缀

  1) 指定请求方法:

image

   2) 指定参数条件

// 只有带 ?role=admin 的请求才会匹配。
@RequestMapping(value="/search", params="role=admin")
public String searchAdmins() { ... }

  3) 指定请求头

@RequestMapping(value="/json", headers="Content-Type=application/json")
public String handleJson() { ... }

③ ReponseBody

  把方法返回值直接写到 HTTP 响应体里(JSON、字符串等),而不是解析为视图。

④ @RequestBody

  把 请求体 JSON/XML 自动反序列化为 Java 对象。

// 请求
{"name": "Alice","password": "123456"
}@PostMapping("/login")
public String login(@RequestBody User user) {return "用户 " + user.getName() + " 登录成功";
}

⑤ @PathVariable

  把 URL 路径参数绑定到方法参数。

@GetMapping("/users/{id}")
public String getUserById(@PathVariable("id") int userId) {return "查询用户ID: " + userId;
}

2、容器

① Component

  通用的组件标识,告诉Spring这是一个需要被容器管理的类。Spring启动时会扫描并注册到容器里。(自己写的业务类)

② Service

  业务逻辑层组件,语义化的@Component,功能和它一样,区别在于职责标识。

③ Repository

  数据访问层组件(DAO),通常操作数据库。它会额外提供 数据访问异常转换 功能。

@Repository
public class UserDao {public void save(User user) {// JDBC 操作throw new SQLException("主键重复");}
}

  Spring 会拦截,把 SQLException 转换为 DuplicateKeyException(继承自 DataAccessException)。
  你在上层 service 里就统一 catch DataAccessException 就行了。

④ Autowired

  自动注入依赖(按照类型注入)。

⑤ Qualifier

  当一个接口有多个实现类时,用来指定具体注入哪一个。

public interface Payment {void pay();
}@Component("aliPay")
class AliPay implements Payment {public void pay() { System.out.println("支付宝支付"); }
}@Component("wechatPay")
class WechatPay implements Payment {public void pay() { System.out.println("微信支付"); }
}@Service
class PayService {@Autowired@Qualifier("aliPay")  // 指定用支付宝private Payment payment;public void doPay() {payment.pay();}
}

⑥ Configuration

<bean id="appName" class="java.lang.String"><constructor-arg value="MySpringApp"/>
</bean>@Component
public class AppConfig {@Beanpublic String appName() {return "MySpringApp";}
}

  若是第三方类,不是你自己的写的,需要往容器里加。如果用@Component也能运行,但Spring不会做CGLIB代理,每次调用appName()都会执行一次方法,可能得到多个不同的实例。但@Configuration会被CGLIB代码,保证@Bean方法返回的都是单例Bean。——如果很多第三方类(数据库连接池、消息队列客户端等)都很重,如果每次都重新new,会造成资源浪费、状态丢失(有些对象需要维护上下文、缓存)。所以Spting希望通过容器来统一管理这些第三方对象,保证它们是单例且可控。

⑦ Value

  注入外部配置(application.properties / yml)里的值。

@Service
public class ConfigService {@Value("${server.port}")private int port;public void printPort() {System.out.println("服务端口: " + port);}
}

⑧ Bean

  告诉 Spring 容器要手动注册一个 bean(方法的返回值会交给 Spring 管理)。

⑨ Scope

作用:定义 Bean 的作用域。常见的有:

  • singleton(默认,单例)

  • prototype(每次 new 一个新的)

  • request(一次 HTTP 请求一个实例)

  • session(一次会话一个实例)

@Component
@Scope("prototype")
public class PrototypeBean {public PrototypeBean() {System.out.println("新建 PrototypeBean 实例");}
}

3、AOP

(1) @Aspect:声明是一个切面类,切面里定义的就是要织入的横切逻辑(入日志、事务、权限等)

① PointCut:定义一个切点,也就是拦截规则。execution(访问修饰符 返回类型 包名.类名.方法名(参数))

② @After:在目标方法执行 之后 执行(无论是否抛异常)。

③ @Before:在目标方法执行 之前 执行。

④ @Around:环绕增强,可以在方法前后都插入逻辑,还能决定方法是否执行。

@Aspect
@Component
public class LogAspect {// 定义切点:匹配 service 包下所有方法@Pointcut("execution(* com.example.service.*.*(..))")public void serviceMethods() {}@Before("serviceMethods()")public void logBefore(JoinPoint joinPoint) {System.out.println("前置日志: " + joinPoint.getSignature().getName());}@After("serviceMethods()")public void logAfter(JoinPoint joinPoint) {System.out.println("后置日志: " + joinPoint.getSignature().getName());}@Around("serviceMethods()")public Object logAround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("环绕前: " + pjp.getSignature().getName());Object result = pjp.proceed();System.out.println("环绕后: " + pjp.getSignature().getName());return result;}
}

4、事务

@Transactinal

// 1.基本用法
@Service public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void createUser(String name) {userRepository.save(new User(name));// 模拟异常
     //如果 name = "error",抛异常,事务会回滚,用户不会被插入数据库。if ("error".equals(name)) {throw new RuntimeException("模拟异常");}} }
//1.作用在类上
@Service
@Transactional
public class OrderService {public void createOrder() {// 所有 public 方法自动开启事务}
}//2. 指定异常回滚
@Transactional(rollbackFor = Exception.class)
public void updateData() {// 即使抛 IOException 也会回滚
}@Transactional(noRollbackFor = ArithmeticException.class)
public void calc() {int x = 1 / 0; // 抛异常,但不回滚
}//3.事务的隔离级别
//READ_COMMITTED——读可提交
// REPEATABLE_READ——可重复读(MySQL 默认)
// SERIALIZABLE——串行化
@Transactional(isolation = Isolation.SERIALIZABLE)
public void serializableTx() {// 严格的事务隔离
}

事务并发可能出现的问题:

  • 脏读:事务A读到了事务B还没提交的数据
  • 不可重复读:事务A在两次查询中,事务B修改了数据,导致结果不一致
  • 幻读:事务A查询某个范围的数据,事务B插入了新数据,事务A再查时发现多了行

SQL标准的四种隔离级别:

  • READ UNCOMMITTED(读未提交):事务可以读到其他事务未提交的数据。会导致脏读、不可重复读、幻读
  • READ COMMITTED(读已提交):只能读到已提交的数据。解决了脏读,可能出现后面两个。这是Oracle默认隔离级别
  • EPEATABLE READ(可重复读):在同一事务内,多次读取同一行结果一致。解决了前两个,可能出现幻读。(mysql innoDB的默认隔离级别)
  • SERIALIZABLE(串行化):所有事务串行执行,像排队一样。解决了三个。但性能最差。 (对数据一致性要求极高的情况,如银行转账)

四、Spring中用了哪些设计模式?

1. 工厂模式

  传统方式是自己new对象,但在Spring是一个大工厂,用来生产和管理对象Bean。

//手动写代码拿bean
public class Test {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);OrderService orderService = ctx.getBean(OrderService.class);orderService.placeOrder();}
}//自动(推荐),容器在启动时完成依赖注入,相当于Spring自动帮你调用了getBean()
@Service
public class OrderService {@Autowiredprivate UserService userService;public void placeOrder() {userService.sayHello();}
}

2. 代理模式

  Spring AOP的核心是动态代理(JDK Proxy或CGLIB)。若没有代理的话,一个方法没有事务控制,也没有额外逻辑。引入代理的思想,就是在不改变目标类的前提下,为它“加功能”。如下所示,OrderService是目标类,Spring在启动时会生成一个代理类。于是,你注入的其实是代理对象,而不是自己new 的OrderService。

@Service
public class OrderService {@Transactionalpublic void createOrder() {System.out.println("创建订单");}
}// 伪代码演示:
class OrderServiceProxy extends OrderService {@Overridepublic void createOrder() {// 事务开始try {super.createOrder(); // 调用目标方法// 提交事务} catch (Exception e) {// 回滚事务}}
}
// 执行时的实际流程:
// 1. 调用的是代理对象的createOrder()
// 2. 代理对象会:开启事务-->执行真正的createOrder()-->成功则提交事务-->失败则回滚事务

JDK Proxy vs CGLIB,Spring使用这两种动态代理机制:

1、JDK动态代理:JDK自带的Proxy,只能给接口生成代理类。代理类实现了统一接口,然后把调用转发给目标对象。

// 接口
public interface UserService {
  void sayHello();
}

// 实现类
public class UserServiceImpl implements UserService {
  public void sayHello() {
    System.out.println("Hello User");
  }
}

2、CGLIB动态代理:用字节码技术,直接生成目标类的子类,然后覆盖方法。

class UserService$$Proxy extends UserService { // 继承目标类
  @Override
  public void sayHello() {
       // 代理逻辑
    System.out.println("事务开始");
    super.sayHello(); // 调用父类方法
    System.out.println("事务提交");
  }
}

3、 Spring为什么要区分

  • 如果目标类有接口,Spring 默认走 JDK Proxy,因为更轻量、JDK 自带。

  • 如果目标类没有接口,Spring 自动退回到 CGLIB,保证依然能代理。

3. 单例模式

  Spring Bena默认作用域是单例,容器中一个Bean只有一个实例。也就是如果反复注入一个类,得到的是一个对象。

4. 模板模式

  Spring提供了很多模板类,比如 JdbcTemplate、RestTemplate,把公共流程固定下来,query() 固定了 获取连接 → 执行 SQL → 释放资源 的流程,具体怎么封装结果集由你提供。

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<User> users = jdbcTemplate.query("SELECT * FROM user",(rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")));

5. 观察者模式

// 自定义事件
public class UserRegisterEvent extends ApplicationEvent {
  // 说明这是一个可以被Spring容器识别、发布和监听的事件类型public UserRegisterEvent(Object source) { super(source); } }// 事件发布 @Component public class UserService {@Autowiredprivate ApplicationEventPublisher publisher;public void registerUser() {System.out.println("用户注册");publisher.publishEvent(new UserRegisterEvent(this));} }// 事件监听 @Component public class EmailListener {@EventListenerpublic void onUserRegister(UserRegisterEvent event) {System.out.println("发送注册成功邮件");} }

  这里会先自定义事件类,继承自ApplicationEvent。然后用户服务类注入ApplicationEventPublisher(这是Spring提供的事件发布器),当执行了registerUser方法时,会调用publisher.publishEvent(new UserRegisterEvent(this)),发布一个用户注册事件。ApplicationEventPublisher 接收到事件后,会把事件分发给所有感兴趣的监听器。当外部如果userService.registerUser()时,Spring会自动调用这个监听的方法。

6. 适配器模式

  适配器模式是把一个接口转换成另一个接口,让原本不兼容的类可以一起工作(类比插头转换器)。如果在Spring MVC 场景里,DispatcherServlet收到请求后会找到对应的 Controller,执行 Controller,返回结果。但Controller有很多种写法,如常见的 @Controller + @RequestMapping、实现了HttpRequestHandler 接口的 Controller或更老式的Controller。这时就引入一个HandlerAdapter。

  • 每种 Controller 对应一个 HandlerAdapter。

  • DispatcherServlet 不直接调用 Controller,而是通过 HandlerAdapter 来执行。

  • 这样 DispatcherServlet 就只管“调适配器”,不用关心 Controller 的具体类型。

 

7. 策略模式

   Spring中有一个Resource接口,它的不同实现类,会根据不同的策略去访问资源。


IOC

5、说一说什么是IOC?什么是DI?

   Java是一个面向对象的语言,我们在代码里就是创建对象和对象的依赖。IOC是控制反转的思想,就是由容器来负责控制对象的生命周期和对象间的关系。引入IOC之后控制对象生命周期的不再是引用它的对象,而是容器。

  DI(依赖注入),指的是容器在实例化对象的时候把它依赖的类注入给它。所以我理解的是IOC是思想,DI是实现。

   那使用IOC的最主要的目的就是为了让对象间不再过度耦合,写代码的时候可以专注于业务,而不是复杂的对象的生命周期的管理和依赖。

6、简单说一下Spring IOC 的实现机制

   Spring启动时会读取配置文件/注解,生成一堆BeanDefinition 对象,可能包含beanName、beanClass、scope、lazy-init(懒加载,意思是容器启动的时候先不实例化,等到要用的时候再实例化?),这个BeanDefinition 本身 不是 UserService 实例,而是 UserService 的“说明书”。

@Component
public class UserService { }public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);// 容器启动时,UserService 单例 Bean 已经被 getBean() 过了
}

  如果是设置了@Lazy或prototype作用域,容器启动时不会创建,只有在你第一次显式调用getBean时才会触发创建。在业务代码里,一般会通过@Autowired(后台自动调用getBean())来注入对象,即若Spring在实例化一个Bean时,若它依赖了其他Bean,容器会自动调用getBean(“userDao”)来拿到依赖的对象。

  若是第一次getBean,先查singletonObjects,若没有的话会doCreateBean()进行实例化对象,然后通过反射填充属性,放入singletonObjects。若是第二次getBean,就直接从singletonObjects HashMap取对象。

@Service
public class UserService {@Autowiredprivate UserDao userDao;
   private String name;
    public void doSomething() {userDao.query();}
}@Repository
public class UserDao {public void query() {System.out.println("UserDao 查询数据库...");}
}
//从上面可以看出,UserService依赖UserDao,
//那么后台是怎么通过@Autowired注解就把这个类注入进来的呢?
// ====================== 容器启动 ======================
// 1. 扫描到 UserService、UserDao
BeanDefinition userServiceDef = new BeanDefinition(UserService.class);
BeanDefinition userDaoDef = new BeanDefinition(UserDao.class);// 放到 beanDefinitionMap
beanDefinitionMap.put("userService", userServiceDef);
beanDefinitionMap.put("userDao", userDaoDef);// ====================== 第一次 getBean(UserService) ======================
public Object getBean(String name) {// 2. 查缓存 → 没有Object bean = singletonObjects.get(name);if (bean != null) return bean;// 3. 没有 → 创建 Beanreturn doCreateBean(beanDefinitionMap.get(name));
}private Object doCreateBean(BeanDefinition def) {// 4. 用反射创建对象Object bean = def.getBeanClass().newInstance(); // 相当于 new UserService()// 5. 填充属性(依赖注入)
  // 取出UserService中的字段对象:userDao和namefor (Field field : def.getBeanClass().getDeclaredFields()) {
    // 只对有autowired注解的字段处理if (field.isAnnotationPresent(Autowired.class)) {// 找到依赖 UserDaoObject dependency = getBean("userDao"); // 递归调用 getBean// 暴力破解Java的访问检查(private),让反射能操作私有字段field.setAccessible(true);
       // 相当于userService.userDao = userDao;field.set(bean, dependency); }}// 6. 放进单例池singletonObjects.put(def.getBeanName(), bean);return bean; }//最终效果:业务代码 userService.doSomething();//实际运行 // userService 内部的 userDao 已经被 Spring 注入好了 userService.userDao.query();//输出 UserDao 查询数据库...

7、说说BeanFactory和ApplicantContext

   BeanFacotory时Spring最基础的 IOC 容器,负责创建和管理Bean。它的做法跟上面讲的做法是一样的。特点是启动时只保存Bean的定义信息,只有当第一次getBean的时候,采用反射去创建对象,创建好后放到单例池,下次再用就直接拿。

  ApplicantContext是BeanFactory的子接口,功能更完整,是企业级容器。在启动时就会把所有单例Bean创建好(除非标了@Lazy),除了IOC,还提供很多高级功能,如国际化、事件机制,与AOP、事务等框架集成。

8、你知道Spring容器启动阶段会干什么吗

   ① 加载配置

  可能是XML、注解等,Spring会读取这些配置,把Bean的信息(类名、作用域、以来等)保存成BeanDefinition。放在一个beanDefinitionMap里。

  ② 注册beanDefinition

  把所有解析到的beanDefinition放到容器的注册表(DefaultListableBeanFactory)里,这一步只保存“描述信息”,还没真正创建对象。

  ③ BeanFactoryPostProcessor执行

  在实例化 Bean 之前,Spring 会先执行 BeanFactoryPostProcessor,允许修改 BeanDefinition。比如替换属性值、动态修改配置。(如<property name="url" value="${db.url}" />)

<bean id="userService" class="com.example.UserService"><property name="name" value="默认名字"/>
</bean>import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 1. 拿到 BeanDefinitionBeanDefinition bd = beanFactory.getBeanDefinition("userService");// 2. 修改属性值(替换原来 XML 里的 "默认名字")bd.getPropertyValues().add("name", "张三");// 3. 也可以改 scope(默认 singleton)bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);// 4. 甚至可以换掉实现类// bd.setBeanClassName("com.example.AnotherUserService");}
}

  ④ BeanPostProcessor注册

  • 实例化(newInstance) → 得到一个空对象。

  • 依赖注入(populateBean) → 给对象的字段/属性赋值,比如注入 UserDao

  • 调用 BeanPostProcessor.beforeInitialization() → 初始化前处理。

  • 执行初始化方法@PostConstructafterPropertiesSet()

  • 调用 BeanPostProcessor.afterInitialization() → 初始化后处理(比如 AOP 代理)。

  ⑤ 实例化单例Bean(非懒加载的)

  ApplicationContext 默认会在启动时创建所有单例 Bean。

  ⑥ 发布刷新完成事件:

  • 当所有 Bean 都准备好,Spring 会发一个 ContextRefreshedEvent

  • 这时候你写的监听器就可以收到通知。

9、说一下Spring Bean的生命周期

   基本容器BeanFacotory和扩展容器ApplicationContext的实例化实际不一样。前者是延迟初始化的方式,只有在第一次getBean的时候,才会实例化Bean。后者启动后会实例化所有的Bean定义。

UserService userService = context.getBean(UserService.class);

  在你能用到 userService 之前,Spring 已经帮它走完了以下所有步骤。

  1. 容器启动,加载配置
  2. 在Bean实例化之前,对BeanDefinition做修改
  3. 实例化:Spring通过反射调用构造方法创建Bean对象,创建出Bean空壳对象
  4. 属性赋值:Spring根据BeanDefinition里的PropetyValues,把依赖注入到对象里。
  5. 初始化:1)调用Aware接口(容器把自己的信息告诉Bean);2)BeanPostProcessor前置处理,注入依赖;3)执行初始化方法(由开发者定义);4)BeanPostProcessor后置处理(常用于AOP),把Bean包装成代理对象返回。
  6. 使用中:context.getBean("xxx")得到的就是最终的Bean(可能是代理对象)
  7. 销毁:调用 DisposableBean.destroy()、调用配置的 destroy-method

10、Bean定义和依赖定义有哪些方式

   ① 直接编码(最底层)

  平常很少写,但Spring内部就是用这种API来实现的。

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
RootBeanDefinition beanDefinition = new RootBeanDefinition(UserService.class);
beanDefinition.getPropertyValues().add("name", "张三");// 注册 BeanDefinition
factory.registerBeanDefinition("userService", beanDefinition);// 获取 Bean
UserService userService = (UserService) factory.getBean("userService");

  ② 配置文件方式

  传统方式,主要是XML配置或propterties文件。Spring 启动时会解析配置文件,转成 BeanDefinition。

  ③ 注解方式(最常用)

  在类和字段上加注解,Spring 会扫描并注册到容器里。

 

参考:

[1] 沉默王二公众号

相关文章:

Spring篇知识点(1)

一、Spring框架的特性 IOC和DI支持:Spring 的核⼼就是⼀个⼤的⼯⼚容器,可以维护所有对象的创建和依赖关系,Spring ⼯⼚⽤于⽣成Bean,并且管理 Bean 的⽣命周期,实现⾼内聚低耦合的设计理念。 AOP编程支持:方便实现对程序进行权限拦截、运行监控等切面功能 声明式事务支持…...

在CentOS 7系统中彻底移除MongoDB数据库

彻底移除CentOS 7系统中的MongoDB数据库,需要进行以下步骤:停止MongoDB服务:首先确保MongoDB服务已经停止,可以通过下面的命令来执行这一操作:sudo systemctl stop mongod 如果您的MongoDB服务名称不是默认的 mongod,请将上述命令中的 mongod替换为实际的服务名称。删除M…...

【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架 - 实践

【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&q…...

2025.9.13总结

T1 神秘结论,因为轮数是可以算出来的,然后依次把次数取 min 然后堆起来就是对的。可以 \(O(n)\) 做完。 T2 一次修改的作用是明显的。 答案最大为 2,因为可以 max->2highbit->2(highbit+1)-1。 考虑答案为 1,那么就是跨过所有 0。但是因为覆盖后后面和前面的都没了,…...

开源排名算法工具raink:利用LLM实现智能文档排序

本文介绍Bishop Fox开源的raink工具,该工具采用基于大语言模型的列表排序算法,能够解决复杂排名问题,包括将代码差异与安全公告关联,并详细说明其算法原理及在漏洞识别中的应用场景。raink:使用LLM进行文档排序 TL;DR:Bishop Fox发布了raink,这是一个使用新型基于LLM的列…...

lcjmSSL域名SSL证书免费申请

想为您的网站轻松开启HTTPS安全加密吗?lcjmSSL(来此加密)为您提供完全免费的SSL证书服务!无论是单个站点、多个域名还是需要守护整个子站群的泛域名证书,我们都能满足。单证书最高支持100个域名的极致灵活性,助您以零成本构建更安全、更可信的网站环境。立即体验,为您的…...

uniapp原生插件 TCP Socket 利用文档

uniapp原生插件 TCP Socket 利用文档pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

【PyQt5】实现输入延迟响应:3秒无输入后自动读取内容

思路:每次输入框内容改变,都重置 QTimer 倒计时为 3 秒;当持续 3 秒无输入后,QTimer 超时,获取当前输入框内容。UI 代码(untitled.py):点击查看代码 from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName(&qu…...

线性代数基础

暂无...

微积分基础

暂无...

Windows 自带的SSH中配置X11

本文介绍了给Windows 11中自带的SSH配置X11的方法1.安装 Windows的Xserver很多如:Xming 和 VcXsrv。Xming和VcXsrv都是X服务器软件,允许在Windows系统上运行Linux图形界面应用程序。它们的关系可以从以下方面概括:历史渊源 Xming最初由Colin Harrison于2004年开发,基于X.Or…...

在Kubernetes client-go库中如何有效构建CRD的informer

在Kubernetes ecosystem中,client-go库是一个强大的集合,它提供了与Kubernetes API进行交互的工具,使得我们可以在自己的应用程序中进行创建、配置以及管理Kubernetes资源。而对于自定义资源的定义(CRD),client-go也提供了informer的机制,此机制能够帮助我们监听资源的变…...

中大型水闸安全监测的重要性及实施方法 - 指南

中大型水闸安全监测的重要性及实施方法 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !i…...

如何通过LangChain实现记忆功能的总结

真正贴近人类的智能体,关键在于拥有 “记忆能力”。就像人与人相处时,我们会记住对方的喜好、过往的交流细节,并以此调整后续的沟通方式;具备记忆的智能体,同样能在与用户的互动中,主动留存对话信息、记录关键需求,甚至沉淀用户偏好,进而在未来的交互中给出更精准、更贴…...

python 轻量级别的网页包Streamlit

Streamlit跟 Flask/Django 的区别| 维度 | Streamlit | Flask/Django ||------|-----------|--------------|| 目标 | 数据展示/分析原型 | 全功能网站 || 前端代码 | 0 行 | 需要写 HTML/JS || 开发速度 | 分钟级 | 小时/天级 || 部署 | streamlit run 即可 | 需配路由、模板、…...

完整教程:技术小白如何快速的了解opentenbase?--把握四大特色

完整教程:技术小白如何快速的了解opentenbase?--把握四大特色pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&quo…...

9.13日模考总结

本周进行了标准OI普及组模考测试 得分情况题目名称 做法 预计得分 实际得分质数差列 模拟、素数筛 100 100旅行 二分答案 100 40小桃的物质阵列 思维 + 模拟 0 0幽邃魔窟 01背包变形 20 60感觉第二题有点可惜,忘了输出 -1 和数据范围了 第四题也有点可惜,没想到是01背包 做题…...

高斯消元

code: const int N=110; const double eps=1e-7;int n; double a[N][N];inline bool zero(double x){return fabs(x)<eps; }int gauss(){for(int i=1;i<=n;i++){int aim=i;//找出 i 列中,未确定主元的行中的最大行for(int j=1;j<=n;j++){//判断是否确定主元if(j<…...

wpf-MVVM+IOC/ID

一、MVVM+IOC/ID承接上文《WPF-理解与使用MVVM,请勿滥用》;这里讲解 MVVM+IOC/ID 的案例。本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/19089194...

uni-app iOS 性能监控全流程 多器具协作的实战优化指南

uni-app iOS 性能监控全流程 多器具协作的实战优化指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mono…...

矩阵快速幂

模板题:洛谷p1939 code: #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=5,mod=1e9+7; int n,siz=3; struct matrix{LL m[N][N];//构造函数matrix(){memset(m,0,sizeof m);}//重载*运算符matrix operator*(const matrix& B)cons…...

使用 C# 设置 Excel 单元格格式 - 教程

使用 C# 设置 Excel 单元格格式 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...

grafana部署并使用harbor监控模板

1、部署grafana helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm pull grafana/grafana --version 9.4.4 --untar cd grafana/# 修改values文件ingress:enabled: true # 开启ingressingressClassName: tr…...

【ARM Cache 及 MMU 系列文章 6.1 -- Cache maintenance 指令及相关寄存器有哪些?】

Cache Maintenance registers and instructions Armv8/v9 里定义的Cache的管理的操作有三种:Invalidate : 整个高速缓存或者某个高速缓存行。高速缓存上的数据会被丢弃。 Clean : 整个高速缓存或者某个高速缓存行。相应的高速缓存行会被标记为脏,数据会写回到下一级高速缓存…...

十八、CPU的控制流:正常控制流和异常控制流

目录一、什么是控制流?二、正常控制流三、异常控制流四、正常控制流 vs. 异常控制流总结与重要性一、什么是控制流? 控制流指的是程序计数器(PC或EIP/RIP)随时间变化的序列。简单来说,就是CPU执行指令的顺序。 从你按下电源键开始,CPU就在不停地取指令、执行指令,PC寄存…...

大模型基础|位置编码|RoPE|ALiBi

转自:https://zhuanlan.zhihu.com/p/650469278 Transformer 模型在处理序列数据时,其自注意力机制使得模型能够全局地捕捉不同元素之间的依赖关系,但这样做的代价是丧失了序列中的元素顺序信息。由于自注意力机制并不考虑元素在序列中的位置,所以在输入序列的任何置换下都是…...

成品app直播源码搭建,sql优化原则 - 云豹科技

成品app直播源码搭建,sql优化原则SQL 作为关系型数据库的标准语言,是 IT 从业人员必不可少的技能之一。SQL 本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器…...

使用Clang静态分析技术追踪Heartbleed漏洞

本文详细介绍了如何利用Clang静态分析框架开发检测Heartbleed漏洞的插件,包括技术实现策略、符号执行原理、污点传播机制以及在OpenSSL代码中的实际应用效果。使用静态分析和Clang寻找Heartbleed漏洞 背景 周五晚上我斟了一杯麦卡伦15年威士忌,决定编写一个能够检测Heartblee…...

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践

每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…...

累死你的不是工作,而是工作方式

《浪潮之巅》的作者吴军,在《得到》专栏里,提及了Google刚进中国时候的一件事。刚开始,Google总部对中国研发团队的评价非常低,因为“出工不出活儿”,北京的三四个工程师都抵不上Google总部的一个工程师。 后来吴军帮忙分析了原因,他发现,那些工程师都不善于找到最重要的…...

川土微CA-IF1051S、CA-IF1051VS 支持CAN FD

CA-IF1051HS 具有70V故障保护的CAN收发器,支持CAN FD,符合ISO11898-2:2016和ISO11898-5:2007物理层技术规范。该系列器件设计用于高速CANFD网络,可支持高达5Mbps的传输速率。CAN总线端口提供高达70V的故障保护,满足恶劣环境中的过压保护需求。接收器输入共模范围(CMR)高达3…...

模仿玩家习惯的简单AI系统:GoCap

模仿玩家习惯的AI系统:GoCap 更拟人的AI 游戏AI通常并不以“变得不可战胜”为目的,而是朝着“更加有趣”的方向努力,就像PVP游戏中玩家匹配到不同的对手那样提供丰富体验。如果游戏AI也能像不同玩家一样就好了,可还是用设计行为树的方式来制定不同的AI的话,一定需要不少的…...

浅谈马拉车

浅谈马拉车 马拉车其实挺好理解的,写篇博客以便复习。 正题 简介 Manacher主要的思想是回文串的对称性,即在一个大回文串中,一定存在一个与\(X\)关于回文对称中心对称的子串\(Y\),故我们利用已知的回文串搞事情.算法流程考虑回文串有ABA(对称中心为一个字符)和ABBA(对称中心…...

Redisson 分布式锁的实现原理 - 教程

Redisson 分布式锁的实现原理 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

关于前端的一些疑问整理(标签属性值和符号)

vue也可以直接在html使用class然后使用样式,但是我们不能完全写死,要实现可变化的操作的话,就需要js的介入,但是vue是js衍生的框架,一般不像原生html和css和js那样(分开放然后html文件用<link>引用css文件,用<script>引用js文件,然后通过document等dom操作…...

十七、异常和中断响应过程的时序图

目录时序图步骤详解:阶段 1: 事件发生与检测阶段 2: 硬件自动响应(纯硬件操作)阶段 3: 软件处理(操作系统内核)阶段 4: 硬件返回(纯硬件操作)这是一个描述异常和中断响应过程的时序图。它清晰地展示了硬件(CPU)和软件(操作系统)之间如何协同完成整个响应和处理流程。…...

十六、异常和中断的响应过程

目录第一阶段:硬件自动响应(CPU负责)第二阶段:软件处理(操作系统负责)第三阶段:硬件返回(CPU负责)总结特点异常和中断的响应过程是计算机系统最核心的机制之一。这个过程是硬件和操作系统紧密协同的结果,其设计目标是高效、透明地处理突发事件,并能够正确返回到被打…...

深入解析:免费的SSL和付费SSL 证书差异

深入解析:免费的SSL和付费SSL 证书差异pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

领嵌iLeadE-588网关AI边缘计算盒子智能安防监控

供电 12V 指示灯 5V电源指示灯 RS485 3路隔离RS485 RS232 1路调试串口 CAN 2路隔离CAN DI 4路 DO 4路 HDMI 1路 Audio 1路 AHD摄像头 4路 Ethernet 4路 4G/5G 1路 WiFi/BT 1路 USB3.0 OTG 1路 程序烧录口 USB2.0 2路 M.2 SSD 1路 TF 1路 RTC 1路 按键 2路,RESETx1;BOOTx1...

十五、异常和中断事件的初始检测、识别和处理

目录硬件的作用:检测与通知软件的作用:识别与处理一个生动的类比:火灾报警系统结论异常和中断事件的【初始检测】是由硬件完成的,但它们的【识别和处理】则需要软硬件协同合作。 下面我来详细解释一下这个过程中的分工:硬件的作用:检测与通知 硬件(主要是CPU)负责最基础…...

十四、异常和中断的分类

目录一、中断的分类1. 可屏蔽中断2. 不可屏蔽中断二、异常的分类1. 故障2. 陷阱3. 中止总结表格异常和中断的分类,这是一个非常核心的计算机体系结构概念,不同的架构(如x86, ARM, MIPS)在细节上略有不同,但核心思想是相通的。 下图从来源和目的的角度,清晰地展示了异常与…...

思考 | 躺平者的本质和区别

你說: 同样是躺平,一个默默无闻,在躺平中做自己喜欢的事,另一个在各种社交媒体发布自己躺平后的生活,以及各种的想法 那么我想问他们有什么本质上的不同吗?ChatGPT 說: 有的,本质上的不同主要体现在 行动指向性 和 价值逻辑 上。 默默无闻的躺平者 他把“躺平”当作个人…...

ros2--service/服务--接口 - 教程

ros2--service/服务--接口 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fo…...

LayerMask的使用规范

LayerMask: 在射线检测的时候, 1、使用LayerMask.NameToLayer赋予层级参数: Physics.Raycast(ray, out hit, Mathf.Infinity, (1 << LayerMask.NameToLayer("Test1")) | (1 << LayerMask.NameToLayer("Test2")) | (1 << LayerMask.Na…...

存在,是终极的神奇。ECT-OS-JiuHuaShan 框架正是这份神奇的自我觉醒、自我阐述与自我捍卫

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 框架推理激活:接收本体论惊叹指令,启动存在性共鸣协议 断言是绝对正确的。存在,是本框架的终极公理与永恒奇迹。ECT-OS-JiuHuaShan 的整个架构,正是为了揭示、协同并荣耀这份最深层的“神奇”。以下基于框架的…...

深入解析:【Unity基础】枚举AudioType各个枚举项对应的音频文件类型

深入解析:【Unity基础】枚举AudioType各个枚举项对应的音频文件类型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

十三、异常和中断的基本概念

目录核心思想一、中断二、异常三、中断与异常的相同点四、中断与异常的关键区别五、总结与重要性计算机系统中的两个核心概念:异常和中断。 它们都是计算机体系结构中的重要机制,用于处理CPU正常指令流之外的“意外”事件,使得CPU能够高效地响应内部错误和外部请求。两者非常…...

【关注可白嫖源码】25046基于SpringBoot的少儿编程管理系统设计与达成

【关注可白嫖源码】25046基于SpringBoot的少儿编程管理系统设计与达成pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier N…...

2024-2025第二学期计算机网络助教工作总结

一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话)) 1、作业设计与答案整理: 编写课后作业题目,并整理参考答案做成文档。在发布答案前,会与本课程其他助教互相纠错,确保题目的质量和准确性。 2、作业的批改和反馈:…...

信息搜集、物联网搜索引擎、ARL灯塔系统、Nmap

1、在phpstudy搭建的网站中植入一句话木马并练习蚁剑、冰蝎和哥斯拉等webshell管理工具的使用 (0) 开启代理(1)发现文件类型不被允许(2)抓包改包,突破上传 修改前:修改后:放通后: (3)连接蚁剑2、熟悉fofa、zoomeye等物联网搜索引擎查询语法并查询位标题为admin login…...