Spring系列四:Spring Bean(深度讲解)

简介: ​目录10.Bean定义和依赖定义有哪些方式?有三种方式:直接编码方式、配置文件方式、注解方式。Bean依赖配置方式11.有哪些依赖注入的方法?Spring支持构造方法注入、属性注入、工厂方法注入,其中工厂方法注入,又可以分为静态工厂方法注入和非静态工厂方法注入。Spring依赖注入方法 public CatDaoImpl(String message){   this. message = message; }<bean id="CatDaoImpl" class="com.CatDaoImpl">   <constructor-a

上一期叶秋学长带领小伙伴们学习了spring bean生命周期 ,接下来学长带领小伙伴们深度了解spring bean。

目录

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

11.有哪些依赖注入的方法?

12.Spring有哪些自动装配的方式?

13.Spring 中的 Bean 的作用域有哪些?

14.Spring 中的单例 Bean 会存在线程安全问题吗?

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

有三种方式:直接编码方式配置文件方式注解方式

image.gif编辑

Bean依赖配置方式

    • 直接编码方式:我们一般接触不到直接编码的方式,但其实其它的方式最终都要通过直接编码来实现。
    • 配置文件方式:通过xml、propreties类型的配置文件,配置相应的依赖关系,Spring读取配置文件,完成依赖关系的注入。
    • 注解方式:注解方式应该是我们用的最多的一种方式了,在相应的地方使用注解修饰,Spring会扫描注解,完成依赖关系的注入。

    11.有哪些依赖注入的方法?

    Spring支持构造方法注入属性注入工厂方法注入,其中工厂方法注入,又可以分为静态工厂方法注入非静态工厂方法注入

    image.gif编辑

    Spring依赖注入方法

      • 构造方法注入
        通过调用类的构造方法,将接口实现类通过构造方法变量传入
      public CatDaoImpl(String message){
         this. message = message;
       }
      • image.gif
      <bean id="CatDaoImpl" class="com.CatDaoImpl"> 
        <constructor-arg value=" message "></constructor-arg>
      </bean>
      • image.gif
      • 属性注入
        通过Setter方法完成调用类所需依赖的注入
      public class Id {
          private int id;
          public int getId() { return id; }
          public void setId(int id) { this.id = id; }
      }
      • image.gif
      <bean id="id" class="com.id "> 
        <property name="id" value="123"></property> 
      </bean>
      • image.gif
      • 工厂方法注入
        • 静态工厂注入
          静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让 Spring 管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过 Spring 注入的形式获取:
        public class DaoFactory { //静态工厂
           public static final FactoryDao getStaticFactoryDaoImpl(){
              return new StaticFacotryDaoImpl();
           }
        }
        public class SpringAction {
         //注入对象
         private FactoryDao staticFactoryDao; 
         //注入对象的 set 方法
         public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
             this.staticFactoryDao = staticFactoryDao;
         }
        }
        • image.gif
        //factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
         <bean name="springAction" class=" SpringAction" >
           <!--使用静态工厂的方法注入对象,对应下面的配置文件-->
           <property name="staticFactoryDao" ref="staticFactoryDao"></property>
         </bean>
         <!--此处获取对象的方式是从工厂类中获取静态方法-->
        <bean name="staticFactoryDao" class="DaoFactory"
          factory-method="getStaticFactoryDaoImpl"></bean>
        • image.gif
        • 非静态工厂注入
          非静态工厂,也叫实例工厂,意思是工厂方法不是静态的,所以我们需要首先 new 一个工厂实例,再调用普通的实例方法。
        //非静态工厂 
        public class DaoFactory { 
           public FactoryDao getFactoryDaoImpl(){
             return new FactoryDaoImpl();
           }
         }
        public class SpringAction {
          //注入对象
          private FactoryDao factoryDao; 
          public void setFactoryDao(FactoryDao factoryDao) {
            this.factoryDao = factoryDao;
          }
        }
        • image.gif
        <bean name="springAction" class="SpringAction">
           <!--使用非静态工厂的方法注入对象,对应下面的配置文件-->
           <property name="factoryDao" ref="factoryDao"></property>
         </bean>
         <!--此处获取对象的方式是从工厂类中获取实例方法-->
         <bean name="daoFactory" class="com.DaoFactory"></bean>
        <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>
        • image.gif

          12.Spring有哪些自动装配的方式?

          什么是自动装配?

          Spring IOC容器知道所有Bean的配置信息,此外,通过Java反射机制还可以获知实现类的结构信息,如构造方法的结构、属性等信息。掌握所有Bean的这些信息后,Spring IOC容器就可以按照某种规则对容器中的Bean进行自动装配,而无须通过显式的方式进行依赖配置。

          Spring提供的这种方式,可以按照某些规则进行Bean的自动装配,元素提供了一个指定自动装配类型的属性:autowire="<自动装配类型>"

          Spring提供了哪几种自动装配类型?

          Spring提供了4种自动装配类型:

          image.gif编辑

          Spring四种自动装配类型

            • byName:根据名称进行自动匹配,假设Boss又一个名为car的属性,如果容器中刚好有一个名为car的bean,Spring就会自动将其装配给Boss的car属性
            • byType:根据类型进行自动匹配,假设Boss有一个Car类型的属性,如果容器中刚好有一个Car类型的Bean,Spring就会自动将其装配给Boss这个属性
            • constructor:与 byType类似, 只不过它是针对构造函数注入而言的。如果Boss有一个构造函数,构造函数包含一个Car类型的入参,如果容器中有一个Car类型的Bean,则Spring将自动把这个Bean作为Boss构造函数的入参;如果容器中没有找到和构造函数入参匹配类型的Bean,则Spring将抛出异常。
            • autodetect:根据Bean的自省机制决定采用byType还是constructor进行自动装配,如果Bean提供了默认的构造函数,则采用byType,否则采用constructor。

            13.Spring 中的 Bean 的作用域有哪些?

            Spring的Bean主要支持五种作用域:

            image.gif编辑

            Spring Bean支持作用域

              • singleton : 在Spring容器仅存在一个Bean实例,Bean以单实例的方式存在,是Bean默认的作用域。
              • prototype : 每次从容器重调用Bean时,都会返回一个新的实例。

              以下三个作用域于只在Web应用中适用:

                • request : 每一次HTTP请求都会产生一个新的Bean,该Bean仅在当前HTTP Request内有效。
                • session : 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。
                • globalSession:同一个全局Session共享一个Bean,只用于基于Protlet的Web应用,Spring5中已经不存在了。

                14.Spring 中的单例 Bean 会存在线程安全问题吗?

                首先结论在这:Spring中的单例Bean不是线程安全的

                因为单例Bean,是全局只有一个Bean,所有线程共享。如果说单例Bean,是一个无状态的,也就是线程中的操作不会对Bean中的成员变量执行查询以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。

                假如这个Bean是有状态的,也就是会对Bean中的成员变量进行写操作,那么可能就存在线程安全的问题。

                image.gif编辑

                Spring单例Bean线程安全问题

                单例Bean线程安全问题怎么解决呢?

                常见的有这么些解决办法:

                  1. 将Bean定义为多例
                    这样每一个线程请求过来都会创建一个新的Bean,但是这样容器就不好管理Bean,不能这么办。
                  2. 在Bean对象中尽量避免定义可变的成员变量
                    削足适履了属于是,也不能这么干。
                  3. 将Bean中的成员变量保存在ThreadLocal中⭐
                    我们知道ThredLoca能保证多线程下变量的隔离,可以在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在ThreadLocal里,这是推荐的一种方式。
                  相关文章
                  |
                  3月前
                  |
                  XML Java 数据格式
                  Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
                  这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
                  Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
                  |
                  22天前
                  |
                  XML Java 数据格式
                  Spring从入门到入土(bean的一些子标签及注解的使用)
                  本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
                  56 9
                  Spring从入门到入土(bean的一些子标签及注解的使用)
                  |
                  2月前
                  |
                  缓存 安全 Java
                  Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
                  从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
                  138 24
                  Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
                  |
                  12天前
                  |
                  Java 测试技术 Windows
                  咦!Spring容器里为什么没有我需要的Bean?
                  【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
                  |
                  2月前
                  |
                  XML Java 数据格式
                  Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
                  Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
                  183 18
                  Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
                  |
                  2月前
                  |
                  XML Java 数据格式
                  spring复习02,xml配置管理bean
                  详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
                  spring复习02,xml配置管理bean
                  |
                  22天前
                  |
                  Java 开发者 Spring
                  Spring bean的生命周期详解!
                  本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
                  53 1
                  |
                  24天前
                  |
                  Java Spring
                  获取spring工厂中bean对象的两种方式
                  获取spring工厂中bean对象的两种方式
                  17 1
                  |
                  25天前
                  |
                  Java 开发者 Spring
                  Spring bean的生命周期详解!
                  本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
                  67 1
                  |
                  2月前
                  |
                  XML Java 数据格式
                  spring复习03,注解配置管理bean
                  Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
                  spring复习03,注解配置管理bean