(二)Spring自动装配

ATE自动化测试设备:硬件与软件的完美协同 本文深入解析了ATE自动化测试设备如何通过硬件与软件的完美协同,实现高效、精准的电子产品测试。文章详细阐述了ATE系统的硬件架构(如测试控制器、仪器模块、开关矩阵)与软件层次(如测试管理、仪器控制、数据分析),并结合实战案例,揭示了软硬件协同设计在提升测试效率与可靠性中的关键作用。 阅读详情

Spring自动装配

为了减少XML的配置数量。Spring提供了几种技巧来解决这一问题:

自动装配(autowiring): 有助于减少<property>元素和<constroctor-arg>元素,让Spring自动识别如何装配Bean的依赖关系

自动检测(autodiscovery): 让Spring自动识别那些类需要被配置成Spring Bean,从而减少对<bean>元素的使用

<!--more-->

自动装配Bean属性

4种类型的自动装配

  • byName: 把与Bean的属性具有相同名字(或ID)的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字相匹配的Bean,该属性不进行装配。

  • byType: 把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。若没有相匹配的Bean,则不装配。

  • constructor: 把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean的构造器的对应入参中。

  • autodetect: 首先尝试用constructor进行自动装配,若失败就再次尝试用byType进行自动装配。

byName自动装配

通过byName元素Spring可以实现自动查找其他Bean中是否有相同的属性名称,有则进行装配。体会下面的案例:

EmpService.java

package demo2;
public class EmpService {
    //注入Dao
    private EmpDao empDao;
    public void setEmpDao(EmpDao empDao) {
        System.out.println("EmpService --> EmpDao");
        this.empDao = empDao;
    }
}

EmpDao.java

package demo2;
public class EmpDao {
}

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
          http://www.springframework.org/schema/beans/spring-beans.xsd">
          
    <bean id="empService" class="demo2.EmpService" autowire="byName"/>
    <bean id="empDao" class="demo2.EmpDao"/>
</beans>

Test测试类

@Test
public void run(){
    //加载Spring上下文
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    ac.getBean("empService");
}

打印结果:

情况一:如果通过之前的方式通过ref来注入一个引用Bean呢?我们改变上述spring.xml中的代码:

<bean id="empDao" class="demo2.EmpDao"/>
<bean id="empService" class="demo2.empService">
    <property name="empDao" ref="empDao"/>
</bean>

结果和上述相同。

情况二:如果我们改变EmpService.java中empDao的数据类型

package demo2;
public class EmpService {
    //注入Dao
    private String empDao;
    public void setEmpDao(String empDao) {
        System.out.println("EmpService --> EmpDao");
        this.empDao = empDao;
    }
}

打印结果:

观察发现autowire="byName"自动装配的含义就是:

​ 若BeanA中存在与BeanB的idid="empDao"相同的属性(且存在setter方法)private EmpDao empDao;Spring就能自动进行装配。

​ 那么,开始我一直疑惑这个byName注入不是查找的bean名称和另一个bean的属性名称相同就能注入吗,其实并不是。首先我们要明白注入是注入另一个类或接口什么的,Spring让这两个bean之间产生了联系,即我们定义一个普通类型的参数private String empDao,即使名称和另一个Bean相同empDao,但是它只是一个属性,怎么能让一个普通的参数注入到另一个Bean中呢?(注意这里我是在自动注入的前提下说的,当然是可以实现注入的)。

缺点: byName的缺点就是首先要存在这个和另一个Bean的id相同的属性,其次,如果多个Bean中都存在这个属性,那Spring都会将这些Bean装配进去。如下案例:

新创建一个UserDao.java

package demo2;
public class EmpDao {
}

EmpService.java

package demo2;
public class EmpService {
    //注入Dao
    private EmpDao empDao;
    public void setEmpDao(EmpDao empDao) {
        System.out.println("EmpService --> EmpDao");
        this.empDao = empDao;
    }
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        System.out.println("EmpService --> UserDao");
        this.userDao = userDao;
    }
}

在spring.xml中注入该Bean:

<bean id="userDao" class="demo2.UserDao"/>

观察结果:

如上就体现了这中注入方法的缺陷,就是如果多个Bean的id名称都和另一个bean的属性有相同的,那么Spring会全部注入。

byType自动装配

byType自动装配的方法和byName装配方式类似,区别在于byType找的是相同的数据类型,而byName找的是相同的名称。

EmpService.java

package demo2;
public class EmpService {
    //注入Dao
    private EmpDao emp;
    public void setEmpDao(EmpDao emp) {
        System.out.println("EmpService --> EmpDao");
        this.emp = emp;
    }
}

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
          http://www.springframework.org/schema/beans/spring-beans.xsd">
          
    <bean id="empService" class="demo2.EmpService" autowire="byType"/>
    <bean id="empDao" class="demo2.EmpDao"/>
</beans>

Test测试类

@Test
public void run(){
    //加载Spring上下文
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    ac.getBean("empService");
}

打印结果:

观察:上面EmpDaobean的id是empDao,但EmpService中存在的属性是private EmpDao emp;,注意不是empDao,那么当我们配置了autowire="byType"后,因为数据类型相同,Spring仍可将EmpDao注入到EmpService中。

缺点

​ 如果Spring找到了多个Bean的,他们的类型与需要自动装配的属性的类型都匹配,那么Spring会抛出异常,而不是选择注入哪个。如下情况:

其他不变,我们在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
          http://www.springframework.org/schema/beans/spring-beans.xsd">
          
    <bean id="empService" class="demo2.EmpService" autowire="byType"/>
    <bean id="empDao" class="demo2.EmpDao"/>
    <bean id="dao" class="demo2.EmpDao"/>
</beans>

打印结果:

可以看到,当我们在spring.xml中注入两个类型相同的Bean(当然名称不能相同),此时就会报错。

为解决这一错误,Spring提供了pimary和autowire-candidate两个属性。

  • 为自动装配标识一个首选Bean,使用primary属性,如果设置primary="true"那么该Bean会被优先选择。但Spring却给每一个<bean>默认都配置了primary="true"属性,也就是此时每个Bean都是首选的,而你想指定哪个Bean是首选就必须设置其他Bean都是primary="false"候选。所以说:primary属性仅对标识的首选Bean有意义。如果想解决上面多个Bean都符合情况造成的报错,必须引入下面属性:

  • 即为想被忽略注入的<bean>配置autowire-candidate="false"属性,这样Spring在进行装配时就会忽略autowire-candidate="false"标识的Bean。

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
          http://www.springframework.org/schema/beans/spring-beans.xsd">
          
    <bean id="empService" class="demo2.EmpService" autowire="byType"/>
    <bean id="empDao" class="demo2.EmpDao"/>
    <bean id="dao" class="demo2.EmpDao" autowire-candidate="false"/>
</beans>
constructor自动装配

如果要通过构造器来装配Bean,那我们可以移除<constructor-arg>元素,采用Spring自动注入的方式:(注意这里我们改变了以上的代码逻辑,增加了一个Emp接口,让EmpDao和UserDao都继承这个接口)

Emp.java

package demo2;
public interface Emp {
}

EmpDao.java

package demo2;
public class EmpDao implements Emp {
}

UserDao.java

package demo2;
public class UserDao implements Emp {
}

EmpService.java

package demo2;
public class EmpService {
    private Emp emp;
    public void setEmp(Emp emp) {
        System.out.println("执行...");
        this.emp = emp;
    }
    public EmpService(Emp emp) {
        System.out.println("这是构造参数...");
        this.emp = emp;
    }
}

同时这种方式也存在和byType一样的缺点:

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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd">
          
    <bean id="empService" class="demo2.EmpService" autowire="constructor"/>
    <bean id="empDao" class="demo2.EmpDao"/>
    <bean id="userDao" class="demo2.UserDao"/>
</beans>

结果仍报错:

最佳自动装配—>由Spring决定怎么装配
<bean id="empService" class="demo2.EmpService" autowire="autodetect"/>
默认自动装配
<beans ....
    default-autowire="xxx"       
>

使用注解自动装配

从Spring2.5开始可以使用注解实现自动装配,注解装配和使用XML中的autowire本身没有太大区别,但是注解装配可以实现更小颗粒度的装配。但是Spring默认是禁用注解装配的,所以我们首先要在spring.xml中启用注解装配。最简单的方式就是启用Spring的context命名空间配置中的<context:annotation-config>元素,如下:

<?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-3.0.xsd">
    <context:annotation-config/>
</beans>

Spring3支持几种不同的自动装配注解:

  • Spring自带的@Autowired注解

  • JSR-330的@Inject注解

  • JSR-250的@Resource注解

使用@Autowired

如下案例:

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"
       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-3.0.xsd">
​
    <context:annotation-config/>
    <bean id="empService" class="demo2.EmpService"/>
    <bean id="empDao" class="demo2.EmpDao"/>
</beans>

EmpService.java

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
public class EmpService {
    private Emp emp;
    @Autowired
    public void setEmp(Emp emp) {
        System.out.println("执行...");
        this.emp = emp;
    }
    public void play(){
        emp.play();
    }
}

Emp.java

package demo2;
public interface Emp {
    void play();
}

EmpDao.java

package demo2;
public class EmpDao implements Emp {
    public void play() {
        System.out.println("EmpDao: play...");
    }
}

Test测试类

@Test
public void run(){
    //加载Spring上下文
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
    EmpService es = (EmpService) ac.getBean("empService");
    es.play();
}

除了上面标记在setter方法上,还可以直接标记到私有属性上:

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
public class EmpService {
    @Autowired
    private Emp emp;
    public void setEmp(Emp emp) {
        System.out.println("执行...");
        this.emp = emp;
    }
    public void play(){
        emp.play();
    }
}

可以看到,使用这种方式仍可以完成注入,并且我们发现将@Autowired直接标记到私有属性上,并不会执行setter方法,但是仍完成了注入,这其实就是@Autowired的一大优势,它简化了setter方法的书写,采用Java的反射机制完成的注入。

缺点:采用@Autowired注解注入固然方便,但是也存在缺点,即被标注的属性或参数必须是可注入的,如下列情况,我们将emp的数据类型改变(注意这里要注释掉play方法,因为数据类型改变了也就不能再调用play方法):

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
public class EmpService {
    @Autowired
//    private Emp emp;
    private String emp;
    /*public void play(){
        emp.play();
    }*/
}

此时就会报错NoSuchBeanDefinitionException,因为我们认为属性不一定要被装配,返回null值也好,从而避免抛出异常,那么我们就可以在@Autowired中添加required属性,表示是否一定要进行装配:

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
public class EmpService {
    @Autowired(required = false)
//    private Emp emp;
    private String emp;
    /*public void play(){
        emp.play();
    }*/
}

这样就不会再出现保报错的情况。

注意: required属性可以用于@Autowired注解所使用的任意地方,但当使用构造器进行装配时,只有一个构造器可以将@Autowired的required属性设置为true,其他都必须设置为required=false。此外,使用@Autowired标记多个构造器时,Spring会从所有瞒住装配条件的构造器中选择入参最多的构造器。

限定歧义性的依赖

对于出现多个Bean满足注入条件的解决,上面也介绍了一系列的方法,即使是上面的@Autowired细颗粒度的注入方式仍然无法解决多个Bean满足注入条件的情况,所以Spring提供了一个更好的方式解决这一问题:

使用@Qualifier("beanName")限定注入哪个Bean

spring.xml

<bean id="empService" class="demo2.EmpService"/>
    <bean id="empDao" class="demo2.EmpDao"/>
    <bean id="userDao" class="demo2.UserDao"/>

此时,因为EmpDao和UserDao都实现了Emp接口,所以empDao和userDao两个Bean都瞒住注入条件,此时就会产生NoSuchBeanDefinitionException的错误。

EmpService.java

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class EmpService {
    @Autowired(required = false)
    @Qualifier("empDao")
    private Emp emp;
    public void play(){
        emp.play();
    }
}

即这里我们限定了将empDao注入,而不是注入userDao,这样就会避免出现错误。

@Inject基于标准的自动装配

为了统一各种依赖注入框架编程模型,JCP(Java Community Process)发布了一套Java的依赖注入规范,@Inject注解则是其核心部件,该注解和@Autowired几乎相同,但对于一些特殊情况,@Inject也有自己的处理办法:

  1. 首先@Inject没有required属性,所以被标记的属性必须是可注入的

    1. 歧义性的Bean定义:@Qualifier —> @Named

在注解注入中使用表达式

@Value

自动检测Bean

当在Spring配置中增加了<context:annotation-config>时,我们希望Spring特殊对待我们所定义的Bean里的某一组注解,并使用这些注解指导Bean的装配,由此产生了 <context:component-scan元素。它能大大简化对<bean>的配置,通过在<context:component-scan>元素中指定要扫描指定包下的Bean对象,如:

<?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-3.0.xsd">
    <context:component-scan base-package="demo2"/>
</beans>

那么<context:component-scan>又是如何知道哪些类需要注册为Spring Bean呢?

为自动检测标注Bean

<context:component-scan>会查找使用构造型(stereotype)注解所标注的类

@Component —>通用的构造性注解,标识该类为Spring组件。

@Controller —>标识将该类定义为Spring MVC controller

@Repository —>标识将该类定义为数据仓库

@Service —>标识将该类定义为服务

使用@Component标注的任意自定义注解

举例:

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"
       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-3.0.xsd">
    <context:component-scan base-package="demo2"/>
</beans>

如上我们只需要开启注解支持.

EmpService.java

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EmpService {
    @Autowired(required = false)
    private Emp emp;
    @Bean
    public EmpDao empDao(){
        return new EmpDao(userDao());
    }
    public void play(){
        emp.play();
    }
}

如上,我们首先使用@Configuration标记的Java类,就等价于XML配置中的<beans>元素。使用@Bean就等价于<bean>元素,(@Bean告知Spring这个方法将返回一个对象,该对象应该被注册为Spring应用上下文中的一个Bean。方法名将作为该Bean的ID。在该方法中所实现的所有逻辑本质上都是为了创建Bean)这样我们就实现了将一个JavaBean对象交付给Spring管理,再添加@Autowired就完成了自动注入的功能。这是注入一个简单对象,那么我们怎么注入一个引用呢?

package demo2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EmpService {
    @Qualifier("empDao")
    @Autowired(required = false)
    private Emp emp;
    @Bean
    public UserDao userDao(){
        return new UserDao();
    }
    @Bean
    public EmpDao empDao(){
        return new EmpDao(userDao());
    }
}

向另一个Bean中注入一个引用,只需要在此Bean的返回值中调用另外一个被@Bean标记的方法名即可完成注入,但是仍要考虑歧义性问题(使用@Qualifier进行限定)

总结

综上:我们已经介绍了Spring自动装配和注解开发的相关知识,下面我们来回顾一下。

自动装配

  • byName: 把与Bean的属性(在JavaBean中定义的属性)和具有相同名字(ID)的其他Bean自动装配到Bean的对应属性中。

  • byType: 把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。

  • constructor: 把与Bean的构造器参数入参具有相同类型的其他Bean自动装配到Bean的对应入参中。

  • autodetect: 首先舱室使用constructor进行自动装配,如果装配失败再尝试使用byType进行装配。

注解开发

自动装配提供的注解:

​ @Autowired — required=false — @Qualifier("beanName")

​ @Inject — @Named

Spring基于Java的注解开发:

​ @Configuration( <beans> )

​ @Bean( <bean> )

注意问题:

  1. 以上的自动装配的方式都无法避免多个Bean同时满足注入条件的情况,但是Spring针对不同的注入方式提供了不同的解决办法:

    • byName会对满足条件的Bean都进行封装,不加考虑。

    • byType对遇到多个满足注入条件的Bean时会抛出异常,同时给出primary(仅对首选Bean有意义)、autowire-candidate="false"(忽略某个Bean的自动装配)。(注:我们要明白Spring默认将所有Bean都设置为primary="true"这样就没有什么首选Bean可言。所以此时我们最好采用autowire-candidate忽略某个Bean的自动装配。

    • constructor自动装配和byType有一样的局限性,会报错。

    • 综合以上,提出了最佳的自动装配方式:autowire="autodetect"。Spring首先会尝试使用constructor自动装配,如果没有与构造器相匹配的Bean,Spring将尝试使用byType自动装配。

      1. 注解开发有常用的三个自动装配方式:1.@Autowired(Spring自带的注解); 2.Inject(基于标准的自动装配);3.@Resource

    • @Autowired(默认按照类型装配)

      1. 避免@Autowired标注的属性或参数是不可装配的,提供required=false属性。

      2. 限定歧义性的依赖(多个Bean的情况),提供@Qualifier("beanName")缩小选择范围,指定某一个Bean

    • @Inject注解自动装配和@Autowired注解相似,但是对上述解决方案给出的注解不同,如以下:

      1. @Inject限定所标记的属性必须是可装配的,不然就会报错

      2. @Qualifier —> @Named

    • @Resource(默认按照名称装配)

      是jdk1.6支持的注解

<br/>

交流

如果大家有兴趣,欢迎大家加入我的Java交流群:671017003 ,一起交流学习Java技术。博主目前一直在自学JAVA中,技术有限,如果可以,会尽力给大家提供一些帮助,或是一些学习方法,当然群里的大佬都会积极给新手答疑的。所以,别犹豫,快来加入我们吧!


<br/>

联系

If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.

论文必备 - YOLO26统计数据集中大、中、小目标数量,附完整代码和详细使用步骤 数据集是由微软开发维护的大型图像数据集。数据集标注类型对应任务包括物体检测、关键点检测、实例分割、stuff分割(没有特定形状的物体),全景分割人体关键点, 人体密度检测等。官网数据规模和样本特点数据规模大:总共包含32.8万张图像)。其中标注过的图像超过 20 万张,拥有 150 万个目标实例,数据量丰富,能够为模型训练提供充足的信息。类别丰富:包含80个目标类别和91个“stuff”类别。目标类别涵盖了日常生活中常见的各种物体,如人、动物、交通工具、生活用品等;stuff。 阅读详情

相关推荐

C语言编写Picard迭代和牛顿迭代法

为了完成学校计算方法的作业,花了两个多星期将所有实验报告编写出来,看到同桌找代码的辛苦,优快云也没有这类代码,我只是一时兴起,想分享我写的代码与大家共飨,有错误还请多多指正,代码都不难,也是为了让优快云帮我保存下,我辛辛苦苦做出来的,倘若能给别人带来一丝一毫的帮助,我都万分荣幸。 1:什么是Picard迭代 先弄一个满足f(x) = 0的函数将其转化为x= 正在上传… 重新上传 取消 ...

mohenxiang的博客 4699

ajax中设置contentType的问题【留存】

post提交: KaTeX parse error: Expected '}', got 'EOF' at end of input: … data:{"name":("#sname").val(),“sex”

cqzc123的博客 1091

用Python进行GEO数据挖掘(学习笔记四):富集分析

该笔记详细解释了富集分析的工作原理,并简要地利用gseapy在python中进行富集分析的操作。

m0_64111502的博客 5649

5.spring系列- primary使用

案例 public class NormalBean { public interface IService{} public static class ServiceA implements IService{} public static class ServiceB implements IService{} } bean xml配置: <bean id="serviceA" class="com.spring.beanPrimary.No

qq_32062699的博客 756

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1968

深入解析机器人软件开发中的核心:状态机管理(FSM)—— 理论、实践与优化

状态机(FSM)是机器人软件开发中管理复杂行为逻辑的核心工具,广泛应用于导航、任务执行、故障处理等场景。本文系统探讨状态机的基础理论(定义、要素)、主流设计模式(经典FSM、分层状态机HSM、行为树BT),以及工业级实现方法(代码架构、线程安全、调试技巧)。通过移动机器人导航和机械臂任务执行的案例,分析分层状态机的实际应用,并总结常见陷阱(如状态爆炸、阻塞操作)与优化策略(异步化、事件过滤)。

郑伟强dev的专栏 292

Spring第10篇:primary可以解决什么问题

存在的问题以及解决方案 直接上案例,通过案例来看技术是如何使用的: packagecom.javacode2018.lesson001.demo8; publicclassNormalBean{ publicinterfaceIService{}//@1 publicstaticclassServiceAimplementsIService{}//@2 publicstaticclassServiceBimplementsIService{...

chenzoff的专栏 339

5分钟快速上手:用AI生成3D虚拟场景的保姆级教程

你是否想过:不用学复杂的3D建模软件,不用懂“多边形”“UV贴图”这些专业术语,也能快速生成一个梦幻的森林、未来感的城市,甚至外太空基地?本文的目的就是教完全没接触过3D技术的新手,用AI工具5分钟生成3D虚拟场景。我们会覆盖主流AI工具的选择、提示词编写技巧、生成后的简单调整,以及常见问题解决。本文会像“游戏任务指南”一样,从“认识工具”→“写提示词”→“生成场景”→“调整优化”逐步讲解,最后还会教你把生成的3D场景用起来!提示词:你给AI的“订单备注”,越详细效果越好。扩散模型。

AI 原生应用开发的博客 1962

Spring学习之04自动装配

Bean的自动装配 自动装配是Spring满足bean依赖的一种方式! Spring会在上下文自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显式的配置 在java中显示的配置 隐式的自动装配 这里我们主要讲第三种:自动化的装配bean。 Spring的自动装配需要从两个角度来实现,或者说是两个操作: 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean; 自动装配(autowiring):spring自动满足be

Coding马+ 232

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

bean标签的primary属性

当一个bean的primary设置为true,然后容器中有多个与该bean相同类型的其他bean, 此时,当使用@Autowired想要注入一个这个类型的bean时,就不会因为容器中存在多个该类型的bean而出现异常。而是优先使用primary为true的bean。 ...

qq_31473465的博客 1575

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring回顾 【二】spring自动装配

2020年10月31日: Bean的自动装配:自动装配是spring满足bean依赖的一种方式;spring会在上下文中自动寻找,并自动给bean装配属性。 在spring中有三种自动装配的方式: 1.在xml中显示的装配; 2.在java中显示装配; 3.隐式的自动装配bean【重点】。 spring自动装配的方式:在bean中添加autowire属性,参数值: 1.byName:spring容器会自动在容器上下文中查找,和自己对象set方法后面值对应的beanid(如果不满足即上下文中,没有对应的

单枪匹码 455

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

②Spring Bean的自动装配

目录 一、什么是自动装配 1.按名称自动装配(autowire="byName") 2. 不使用自动装配(autowire="no") 3 .按类型自动装配(autowire="byType") 4. 构造函数自动装配(autowire="constructor") 二、使用注解进行Bean自动装配 @Resource @Autowired @Qualifier 三.自动装配的优缺点 一、什么是自动装配 自动装配就是指 Spring 容器在不使用 <constructor-

ZhaFi人 1028

二、Spring-Bean的自动装配

Bean的自动装配定义:在Spring配置文件不需要配置JavaBean之间的依赖关系,如 property、constructor-arg Spring IOC容器可以在上下文中自动寻找,实现自动装配Bean。 在Spring中有三种装配方式:xml中配置、java中配置、隐式的自动装配(重要) 1.创建实体类 三个实体类:Goods(商品)、Providers(供应商)、Brands(品牌) package com.yy.pojo; import lombok.AllArgsConstructor

weixin_39496473的博客 176

Spring自动装配(二)

Spring自动装配 为了减少XML的配置数量。Spring提供了几种技巧来解决这一问题: 自动装配(autowiring): 有助于减少&lt;property&gt;元素和&lt;constroctor-arg&gt;元素,让Spring自动识别如何装配Bean的依赖关系 自动检测(autodiscovery): 让Spring自动识别那些类需要被配置成Spring Bean,从而减少对...

史天航的博客 407

Spring自动装配模式(二)

Spring 自动装配模式二: 在应用中,我们常常使用&lt;ref&gt;标签为JavaBean注入它依赖的对象。但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的&lt;ref&gt;标签。实际上,这种方式也会在另一种形式上增加了应用程序的复杂性,那么如何解决这个问题呢?Spring为我们提供了一个自动装配的机制,尽管这种机制不是...

WNGYUJIE2010的专栏 164

Spring的学习(二)——自动装配

Spring自动装配中用到的几个注解: 组件扫描: ①@Component:表示这个类需要在应用程序中被创建 ②@ComponentScan:自动发现应用程序中创建的类 自动装配: ①@Autowired:自动满足bean之间的依赖关系 定义装配类: ①Configuration:表示当前类是一个配置类 下面我们通过代码来展示(需要引入Spring框架): 我使用的maven配置...

有问题请发邮箱dengyifanlittle@163.com进行讨论 758

spring(二)bean自动装配

自动装配: &lt;bean&gt;元素来声明 bean 和通过使用 XML 配置文件中的&lt;constructor-arg&gt;和&lt;property&gt;元素来注入 。 Spring 容器可以在不使用&lt;constructor-arg&gt;和&lt;pro...

kay三石 232

Spring自动装配模式二:byName的解析

Spring自动装配模式二:byName的解析 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为byName,而该bean包含homeAddressServiceImpl属性(同时提供setHomeAddressServiceImpl(..)方法),Spring就会查找名为homeAddressSer...

manbuyunduan315 252

Spring自动装配Bean的两种方法(二)

使用@Autowired注解装配bean上一篇我们说到了在xml配置文件中装配bean,这种方法相对繁琐,灵活性不高,接下来我们看一下如何利用注解来快速装配bean。

cienven的博客 1782

Spring自动装配(二)-@Resource、@Inject

文章目录@Inject使用@Resource使用 @Inject @Inject用于自动装配Bean。 @Inject和@Autowired功能基本一致,@Inject没有required参数。 使用 @Repository("userDao") public class UserDao { } @Service public class UserService { @Inject ...

Fred-X的博客 261

spring自动装配与spring_bean之间的关系(二)

关于自动装配: XML配置里的Bean自动装配 1 SpringIOC容器可以自动装配Bean,需要做的仅仅是在的autowire属性里指定自动装备的模式 2 byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一直的bean,在这种情况下,Spring将无法判定哪个bean最合适该属性,所以不能执行自动装配 3 byName(根据名称自动装配):必须将目标bean的名

youjiangtengwan1的博客 318

Spring基础二(依赖注入、自动装配)

依赖注入中的构造器注入:在上一节的依赖注入的本质是Set注入!环境搭建:编写实体类Student,记得添加属性的set和get方法,此处忽略:2、编写beans.xml外键测试实现Student实体类中各中属性的实例化。实现注入时,主要是map与properties不同。以下主要包含了测试:1、创建实例User类2、编写Userbeans.xml文件3、编写测试。

await_9的博客 929

Spring笔记(二)自动装配

一、通过名字自动装配 1、[code="xml"][/code] 2、Spring会自动根据属性名去容器中寻找bean。 二、通过类型自动装配 1、[code="xml"][/code] 2、Spring会自动根据类型去容器中寻找bean。 3、但多于一个匹配的,就会抛出异常。 三、匹配构造器自动装配 1、[code="xml"][/code] 2、根...

go12345 132

spring学习(二) 自动装配的歧义

接上一篇spring学习(一) 三、装配扩展 2、自动装配的歧义 我们先定义一个汽车接口 public interface Car { void run(); } 接下来写两个实现类 @Component public class Benz implements Car { @Override public void run() { Sy...

qq_38359443的博客 266

温故而知新—Spring(二)--自动装配策略

所谓自动装配策略就是实现spring对象实例化赋值的具体方式。这里呢跟前面一小节说的依赖注入有一点绕。所谓的自动装配策略是什么呢。就好比我们把挣钱当作依赖注入的概念,那么自动装配策略就是挣钱的方式,例如,我们通过做体力劳动挣钱,或者做餐饮挣钱,又或者是体育娱乐挣钱。 spring--自动装配策略总共有四种: 1.根据ByName方式自动装配,即在xml中需要为一个对象的属性赋值,但是呢,我的autowire=byName,假如这个属性是一个对象,我通过byName的方式去自动装配赋值,假如这个属性的名字

这就是那个世界,别想那么多 373
上一篇: (一)Spring的核心
下一篇: (三)Spring的AOP思想
TyCoding
博客等级 码龄9年 316粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值