Spring

Spring 源码之 SpringProperties 类简介 SpringProperties 是 Spring core 包中一个用于读取并加载Spring库级别属性的工具类,其读取的文件为classpath下的spring.properties文件。内部通过一个Properties对象维护读取到的属性,并对外暴露一些设置属性值或者获取属性值的的静态方法。在根据key获取属性值时,如果localProperties不存在,则从VM系统属性中获取。 阅读详情

Spring Framework

Spring 简介

Spring 框架即以 interface 21 框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0版本。创始人是 Rod Johnson。
Spring 是一个轻量级__控制反转(IoC)__和__面向切面(AOP)__的容器框架。
Spring 框架由 7 部分组成: Spring Core、 Spring AOP、 Spring ROM、 Spring DAO、 Spring Web、 Spring Context、 Spring Web MVC。
Spring 框架所需要的 Jar 包

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.3</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.3</version>
    </dependency>
</dependencies>

控制反转(IoC)

IoC 是 Inversion of Control 的缩写,多数书籍翻译成“控制反转”。1996年,Michael Mattson 在一篇有关探讨面向对象框架的文章中,首先提出了 IoC 这个概念。
IoC 理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。
对象获得依赖对象的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

控制反转(IoC)与依赖注入(DI)

2004年,Martin Fowler 探讨了一个问题,既然 IoC 是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由 IoC 容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现 IoC 的方法:注入。所谓依赖注入,就是由 IoC 容器在运行期间,动态地将某种依赖关系注入到对象之中。

所以,依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦。

IoC 中最基本的技术就是“反射(Reflection)”编程。

Spring 的 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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

注:

  1. 这个 id 属性是标识单个 bean 定义的字符串。
  2. 这个 class 属性定义 bean 的类型,需要使用完全限定的类名。

依赖注入(DI)的方式

基于构造函数的依赖注入
package cn.worstone.bean;

public class User {

    private String name;
    private int age;

    public User(){
        super();
    }

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

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  1. 构造函数参数解析

    <bean id="user" class="cn.worstone.bean.User" name="userBean">
        <constructor-arg type="int" value="26"></constructor-arg>
        <constructor-arg type="java.lang.String" value="XXX"></constructor-arg>
    </bean>
    
  2. 构造函数参数类型匹配

    <bean id="user" class="cn.worstone.bean.User" name="userBean">
        <constructor-arg index="1" value="26"></constructor-arg>
        <constructor-arg index="0" value="XXX"></constructor-arg>
    </bean>
    
基于 Setter 的依赖注入
package cn.worstone.bean;

import java.util.*;

public class User {

    private String name;
    private int age;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Map<String, String> cards;
    private Set<String> games;
    private Properties properties;

    public User(){
        super();
    }

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

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public void setHobbies(List<String> hobbies) {
        this.hobbies = hobbies;
    }

    public void setCards(Map<String, String> cards) {
        this.cards = cards;
    }

    public void setGames(Set<String> games) {
        this.games = games;
    }

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

}

package cn.worstone.bean;

public class Address {
    private String address;

    public void setAddress(String address) {
        this.address = address;
    }

}

<bean id="user" class="cn.worstone.bean.User" name="userBean">
    <property name="age" value="26"></property>
    <property name="name" value="孙传振"></property>
    <property name="address" ref="address"></property>
    <property name="books">
        <array>
            <value>《红楼梦》</value>
            <value>《水浒传》</value>
            <value>《西游记》</value>
            <value>《三国演义》</value>
        </array>
    </property>
    <property name="hobbies">
        <list>
            <value>绘画</value>
            <value>编程</value>
            <value>音乐</value>
            <value>跑步</value>
        </list>
    </property>
    <property name="cards">
        <map>
            <entry key="身份证" value="210381199502280000"></entry>
            <entry key="银行卡" value="690000000000000000"></entry>
        </map>
    </property>
    <property name="games">
        <set>
            <value>王者荣耀</value>
            <value>英雄联盟</value>
            <value>刺客信条</value>
        </set>
    </property>
    <property name="properties">
        <props>
            <prop key="username">first</prop>
            <prop key="password">19326</prop>
        </props>
    </property>
</bean>

<bean id="address" class="cn.worstone.bean.Address">
    <property name="address" value="辽宁省海城市"></property>
</bean>
XML 快捷方式
  1. 具有 p-namespace 的 XML 快捷方式

    使用 p-namespace,您可以使用 bean 元素的属性(而不是嵌套 <property/> 元素)来协作描述 bean 的属性值。
    需要添加 XML 文件约束

    xmlns:p="http://www.springframework.org/schema/p" 
    
    <bean id="user" class="cn.worstone.bean.User" name="userBean" p:age="26" p:address-ref="address">
    	<property name="name" value="XXX"></property>
    </bean>
    
  2. 具有 c-namespace 的 XML 快捷方式

    使用 c-namespace,您可以使用 bean 元素的属性(而不是嵌套 <constructor-arg/> 元素)来协作描述 bean 的属性值。
    需要添加 XML 文件约束

    xmlns:c="http://www.springframework.org/schema/c" 
    
    <bean id="user" class="cn.worstone.bean.User" name="userBean" c:age="26" c:name="XXX" c:address-ref="address">
        <constructor-arg name="age" value="26"></constructor-arg>
        <constructor-arg name="name" value="XXX"></constructor-arg>
        <constructor-arg name="address" ref="address"></constructor-arg>
    </bean>
    
    <bean id="user" class="cn.worstone.bean.User" name="userBean" c:_0="XXX" c:_1="26" c:_2-ref="address">
        <constructor-arg index="0" value="XXX"></constructor-arg>
        <constructor-arg index="1" value="26"></constructor-arg>
        <constructor-arg index="2" ref="address"></constructor-arg>
    </bean>
    

在 Spring 中使用 ApplicationContext 去获取 bean 的时候,在加载 xml 配置文件的时候,会创建配置文件中所有的 bean。

Bean Scopes

scopedescription
singleton将单个 bean 定义范围限定为单个对象实例。(默认值)
prototype将单个 bean 定义的作用域限定为任意数量的对象实例。
request将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义的后面创建的 bean 实例.仅在支持 web 的 Spring ApplicationContext 上下文中有效。
session将单个 bean 定义的范围限定为 HTTP Session 的生命周期。仅在支持 web 的 Spring ApplicationContext 上下文中有效。
application将单个 bean 定义的作用域限定为 ServletContext 的生命周期。仅在支持 web 的 Spring ApplicationContext 上下文中有效。
websocket将单个 bean 定义的作用域限定为 WebSocket 的生命周期。仅在支持 web 的 Spring ApplicationContext 上下文中有效。

Bean 生命周期回调

从Spring 2.5开始,可以使用三个方式来控制 bean 生命周期行为:

  1. 实现 InitializingBean 和 DisposableBean 回调接口。

  2. 自定义 init() 和 destroy() 方法。

  3. 通过 @PostConstruct 和 @PreDestroy 注解。

通常,@PostConstruct 和 @PreDestroy 注解被认为是在现代 Spring 应用程序中接收生命周期回调的最佳方式。使用这些注解意味着 bean 没有耦合到特定的 Spring 接口。如果不希望使用注解,但仍然要删除耦合,可以考虑使用 <bean/> 标签的 init-method 和 destroy-method 属性自定义 init() 和 destroy() 方法。

为同一个 bean 初始化方法的调用顺序为:

  1. 用注解 @PostConstruct 的方法
  2. 重写由 InitializingBean 回调接口定义的 afterPropertiesSet() 方法
  3. 自定义的 init() 方法

销毁方法的调用顺序相同:

  1. 用注解 @PreDestroy 的方法
  2. 重写由 DisposableBean 回调接口定义的 destroy() 方法
  3. 自定义的 destroy() 方法
初始化回调
  1. 自定义的 init() 方法
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {

    public void init() {
        // do some initialization work
    }
}
  1. 实现 InitializingBean 回调接口(该方法不推荐,会让 bean 耦合到 Spring 的接口中)
public class AnotherExampleBean implements InitializingBean {

    @Override
    public void afterPropertiesSet() {
        // do some initialization work
    }
}
销毁回调
  1. 自定义的 destroy() 方法
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {

    public void cleanup() {
        // do some destruction work (like releasing pooled connections)
    }
}
  1. 实现 DisposableBean 回调接口(该方法不推荐,会让 bean 耦合到 Spring 的接口中)
public class AnotherExampleBean implements DisposableBean {

    @Override
    public void destroy() {
        // do some destruction work (like releasing pooled connections)
    }
}
默认初始化方法和销毁方法

如果生命周期回调方法的名称在整个项目中标准化,所有开发人员都使用相同的方法名称并确保一致性。则可以将 Spring 容器配置为查找在每个 bean 初始化以及销毁时的回调方法名称。

public class DefaultUserService implements UserService {

    private UserDao userDao;

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

    // this is (unsurprisingly) the initialization callback method
    public void init() {
        if (this.userDao == null) {
            throw new IllegalStateException("The [userDao] property must be set.");
        }
    }
}
<beans default-init-method="init">
    <bean id="userService" class="com.something.DefaultUserService">
        <property name="userDao" ref="userDao" />
    </bean>
</beans>

<beans/> 标签的 default-init-method 属性使 Spring IoC 容器将 bean 中的init() 方法识别为 bean 初始化回调的方法。在创建和组装 bean 时,如果 bean 有 init() 方法,则会在适当的时间调用它。

也可以使用 <beans/> 标签的 default-destroy-method 属性,以类似的方式(在XML中)配置 destroy() 方法。

自动装配

Spring容器可以自动装配协作bean之间的关系。您可以通过检查的内容,让Spring为您的bean自动解决协作者(其他bean)ApplicationContext。自动装配具有以下优点:

  • 自动装配可以大大减少指定属性或构造函数参数的需要。
  • 随着对象的发展,自动装配可以更新配置。例如,如果您需要向类中添加依赖项,则无需修改配置即可自动满足该依赖项。因此,自动装配在开发过程中特别有用,而不必担心在代码库变得更稳定时切换到显式接线的选择。

使用基于XML的配置元数据时,您可以使用元素的autowire属性为 bean定义指定自动装配模式<bean/>。自动装配功能具有四种模式。您可以为每个bean指定自动装配,因此可以选择要自动装配的装配。下表描述了四种自动装配模式:

模式解释
no(默认)无自动装配。Bean引用必须由ref元素定义。对于大型部署,不建议更改默认设置,因为明确指定协作者可提供更大的控制力和清晰度。在某种程度上,它记录了系统的结构。
byName按属性名称自动布线。Spring寻找与需要自动装配的属性同名的bean。例如,如果一个bean定义被设置为按名称自动装配,并且包含一个master属性(即它具有一个 setMaster(..)方法),那么Spring将查找一个名为的bean定义,master并使用它来设置该属性。
byType如果容器中恰好存在一个该属性类型的bean,则使该属性自动装配。如果存在多个错误,则将引发致命异常,这表明您可能无法byType对该bean使用自动装配。如果没有匹配的bean,则什么都不会发生(未设置该属性)。
constructor类似于byType但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个bean,则将引发致命错误。

使用byType或constructor自动装配模式,您可以装配阵列和键入的集合。在这种情况下,将提供容器中与期望类型匹配的所有自动装配候选,以满足相关性。Map如果期望的密钥类型为,则可以自动连接强类型实例String。自动装配Map 实例的值包括与期望类型匹配的所有Bean实例,并且 Map实例的键包含相应的Bean名称。

自动接线的局限性和缺点

当在项目中一致使用自动装配时,自动装配效果最佳。如果通常不使用自动装配,则可能使开发人员仅使用自动装配来连接一个或两个bean定义感到困惑。

考虑自动装配的局限性和缺点:

  • 显式依赖项property和constructor-arg设置始终会覆盖自动装配。您不能自动装配简单的属性,例如基元 Strings,和Classes(以及此类简单属性的数组)。此限制是设计使然。
  • 自动装配不如显式接线精确。尽管如前所述,Spring还是谨慎地避免在可能导致意外结果的含糊不清的情况下进行猜测。Spring管理的对象之间的关系不再明确记录。
  • 接线信息可能不适用于可能会从Spring容器生成文档的工具。
  • 容器中的多个bean定义可能与要自动装配的setter方法或构造函数参数指定的类型匹配。对于数组,集合或 Map实例,这不一定是问题。但是,对于需要单个值的依赖项,不会任意解决此歧义。如果没有唯一的bean定义可用,则会引发异常。

在后一种情况下,您有几种选择:

  • 放弃自动布线,转而使用明确的布线。
  • 通过将其autowire-candidate属性设置为来避免自动装配bean定义。false
  • 通过将primary其<bean/>元素的属性设置为,将单个Bean定义指定为主要候选者 true。
  • 通过基于注释的配置实现更细粒度的控件。

基于注释的容器配置

在配置Spring时,注释是否比XML更好?

基于注释的配置的引入提出了一个问题,即这种方法是否比XML“更好”。简短的答案是“取决于情况”。长的答案是每种方法都有其优缺点,通常,由开发人员决定哪种策略更适合他们。由于定义方式的不同,注释在声明中提供了很多上下文,从而使配置更短,更简洁。但是,XML擅长连接组件而不接触其源代码或重新编译它们。一些开发人员更喜欢将布线放置在靠近源的位置,而另一些开发人员则认为带注释的类不再是POJO,而且,配置变得分散并且难以控制。

无论选择如何,Spring都可以容纳这两种样式,甚至可以将它们混合在一起。值得指出的是,通过其JavaConfig选项,Spring允许以非侵入方式使用注释,而无需接触目标组件的源代码

Spring Boot系列十三 Spring Boot集成RabbitMQ 1. 概述之前我有一系列关于RabbitMQ文章介绍了RabbitMQ的用法,本篇我们介绍如何在Spring Boot中集成RabbitMQ。本篇主要内容如下: 在Spring boot中消息的发送和接收的两种方式的demo 配置使用MessageConverter对消息序列化 2. Demo工程公共部分介绍工程名称:rabbitmq需要在我们的工程中的pom.xml引入新jar <!-- spri 阅读详情

相关推荐

Java Spring、Spring MVC、Spring Boot 和 Spring Cloud 的关系与区别

本文详细介绍了 Java 开发中常用的 Spring 系列框架及其关系。Spring 是核心框架,提供控制反转(IoC)和面向切面编程(AOP)等基础功能。Spring MVC 是 Spring 的模块,专注于 Web 开发,采用 MVC 设计模式。Spring Boot 简化了 Spring 应用的初始搭建和开发,提供默认配置和嵌入式服务器。Spring Cloud 基于 Spring Boot,扩展了分布式系统开发的能力,提供服务发现、熔断器等功能。这些框架共同构成了强大的 Java 开发生态系统,满足

C_V_Better的博客 1307

搭建Spring开发环境并编写第一个Spring小程序

本文详细介绍了两种搭建Spring开发环境的方法:自动配置方式和手动配置方式。自动配置方式通过MyEclipse工具实现,适合初学者;手动配置方式需要下载Spring软件包并手动添加JAR文件,灵活性更高。文章通过创建动物接口实现和人接口实现两个示例项目,分别演示了两种配置方式的具体步骤,包括创建项目、添加Spring支持、配置JAR包位置、编写测试代码等。最后指出自动配置简单快捷,手动配置则更灵活,建议初学者使用类路径方式查找配置文件。两种方法各有所长,开发者可根据实际需求选择合适的配置方式。

ywl470812087的博客 11万+

Spring MVC 与 Spring Boot 的差异到底在哪?

本文深入对比了传统SpringMVC与SpringBoot的核心差异。作者结合开发经验,从配置方式(XML到自动配置)、依赖管理(手动引入到Starter)、部署模式(外置Tomcat到内嵌容器)、外部化配置等方面进行剖析,指出SpringBoot通过自动配置砍掉了80%的模板代码,但同时也可能带来配置冲突等问题。文章强调SpringBoot并非替代SpringMVC,而是其"脚手架",底层仍依赖DispatcherServlet等核心组件。

无 595

最新的Spring官网如何下载Spring框架

最新的Spring官网如何下载Spring框架。特此写一篇简单的教程,供大家分享。 1. 首先打开Spring官网 https://spring.io/ 2. 点击页头 PROGECTS 选项 3. 打开 SPRING FRAMEWORK 一项 4. 点击页面中的GitHub 图标 5. 在文章中部,有一个Downloading A...

脑壳疼 5119

Spring 容器

/ 标记该类为Spring Bean,容器会自动扫描并创建实例@Component// 标记该类为Spring配置类// 指定扫描的包,容器会自动识别包下的@Component/@Service/@Repository/@Controller等注解的类Spring 容器是管理 Bean 的核心组件,负责 Bean 的创建、依赖注入和全生命周期管理,核心价值是解耦;实际开发中优先使用(而非基础的),主流方式是基于注解配置类(

weixin_53050448的博客 650

使用IntelliJ IDEA中的Spring Initializr来快速构建Spring Boot/Cloud工程

我相信许多初学者都看了Spring Boot和Spring Cloud相关的博文中,都会涉及Spring Boot工程的创建的问题。而一般所看到的都是使用IntelliJ IDEA 工具来创建,并且方便许多,而创建的方式多种多样之前我是通过Maven来手工构建,也可以通过SPRING INITIALIZR页面工具来创建,相信每一个人都有自己喜欢而熟练的方式。接下来介绍嵌入在的IntelliJ

_William_Cheung的博客 3万+

Spring Boot、Spring Cloud实现原理

Spring、Spring Boot、Spring Cloud实现原理

tszc95的博客 554

FLUENT UDF编译及蒸发冷凝相关问题

蒸发冷凝与相间传质

weixin_48029137的博客 1万+

spring

在应用开发中用的非常多, @Component注解是一个通用注解,可以用在于任何类上。包括普通java类,业务逻辑组件,持久化对象等等。通过@Component注解spring自动创建该类的实例注入SpringIOC容器中。@Bean是用于配置类中声明一个Bean的,它通常是用于配置类的方法上面,表示把这个方法的返回对象注册到Spring IOC容器中。通过@Bean自定义Bean的创建和初始化过程,包括指定Bean的名称、作用域、依赖关系等。1.用途不同@Component用于标识普通的类。

黑冰[̲̅V̲̅I̲̅P̅] 818

【亲测好用】解决Windows系统Vscode终端无法使用yarn报错无法加载文件

我明明使用`npm i -g yarn ` 安装成功了 甚至在文件夹处 CMD 也可以看到yarn 的版本 甚至在Vscode中又重新安装了一遍yarn 为什么还是报错呢?

Aeporn的博客 888

Linux PE vs WinPE:为何麒麟系统修复需要专属工具?

本文探讨了Linux PE与WinPE在修复国产麒麟系统时的关键差异,强调了专属工具的必要性。通过分析文件系统兼容性、引导修复、硬件适配和安全合规等方面,揭示了通用PE工具的局限性,并提供了构建专属修复工具链的实用方案,确保系统维护的高效与安全。

weixin_29290863的博客 1063

通过Spring官网下载Spring jar包

这几天刚接触Spring框架,算是在入门阶段吧,对于初学者来说学习Spring框架其中有很多准备工作需要去做的,就比如今天我要讲的如何下载Spring中需要的一些jar包。 【第一步】 打开Spring官网:https://spring.io,点击PROJECTS,如下所示 【第二步】 点击SPRING FRAMEWORK图标 【第三步】 点击SPRING FRAMEWORK图...

1116

SDRAM控制器——添加读写FIFO

用FIFO实现数据缓存

H19981118的博客 2628

如何下载Spring框架

首先进入Spring官网:https://spring.io/ 点击PROJECTS   找到SPRING FRAMEWORK 并点击  因为是托管在github上的,所以点击github标志  找到Spring Framework Artifacts 找到Spring仓库连接  点击Artifacts选项 然后找到菜单下的 libs-release-local...

liutao2001的博客 2万+

8.5/Q1,Charls最新高分文章解读!

8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。

gsky_sci的博客 1017

2024年09月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

小杨购物 【题目描述】 小杨有n元钱用于购物。商品A的单价是a元,商品B的单价是b元。 小杨想购买相同数量的商品A和商品B。 默认小猫角色和白色背景,编写程序请你帮小杨计算出他最多能够购买多少个商品A和商品B。 【输入描述】 新建变量“n”用于存储小杨购物的金额。 新建变量“a”用于存储商品A的价格。 新建变量“b”用于存储商品B的价格。 1≤n,a,b≤100000 如下图所示: 图片 【输出描述】 新建变量“result”用于存储小杨最多购买商品A和商品B的个数。 如下图所示:

人生就是一个不断学习的过程 498

Spring8大模块

Spring8大模块

SSSSSSch的博客 979

Debezium报错处理系列之二十一:Unable to connect: Communications link failure.The driver has not received any

Debezium报错系列之二十一:Unable to connect: Communications link failure.The driver has not received any。

zhengzaifeidelushang的博客 547

Spring系列——两万字长文教会你Spring (超详细!!!)

到此,我们学习完了 Spring 框架,包括: Spring 体系结构 Spring Bean Spring AOP Spring JDBC Spring 事务管理 写此文章是为了做个笔记,等以后自己忘记了可以回头快速上手。同时也分享给小伙伴们,希望我们都能越来越好,不会就学 B 站,不懂就问 AI,总好过自己两耳不闻窗外事的独自琢磨。 最后认识一下吧,笔者叫`北迁`,hhh~~。

weixin_63009611的博客 1181

YOLOv12改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1030

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java-24 深入浅出 Spring 全景:从起源到 Spring 6 一文打通 IoC / AOP / 发展史

Spring 是面向 Java 平台的分层 Full-Stack 轻量级开源框架,以控制反转(IoC)和面向切面编程(AOP)为核心理念,简化企业级应用开发。本文系统讲解 Spring 的发展历程:2003 年 Rod Johnson 推出雏形,2004 年 3 月发布 1.0 正式版,2006 年 Spring 2.0 引入 XML Schema 命名空间,2009 年 12 月 Spring 3.0 基于 Java 5 并引入 SpEL,2013 年 12 月 Spring 4.0 全面支持 Java

谢谢你的喜欢 我们一起无限进步 5189

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Spring5(1) —— Spring简介

0.什么是SPRING Spring : 春天 —>给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架(SPRING框架的前身) 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版 很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学 Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术 1.链接 S

Jzandth的博客 288

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

「Java开发指南」如何使用Spring注释器实现Spring控制器?(二)

本教程将引导开发者如何使用Spring Annotator实现Spring控制器,欢迎下载最新版IDE体验!

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1128
上一篇: Spring MVC
下一篇: Tomcat 体系结构
LiveForCode
博客等级 码龄5年 2粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值