首页 > 其他分享 >Bean的作用域和自动装配

Bean的作用域和自动装配

时间:2024-05-12 17:41:02浏览次数:13  
标签:装配 作用域 bean Bean 自动 组件 注解

  1. Spring Bean的作用域主要有五种

    • Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。
    • prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。
  2. spring中提供了向Bean中自动注入依赖的功能,这个过程就是自动装配,当向bean中注入的内容非常多的时候,自动注入依赖的功能将极大的节省注入程序的时间。

    • Spring自动装配有两类:

      • 基于xml文件的自动装配:byType(类型),byName(名称), constructor(根据构造函数)
      • 基于注解的自动装配:@Autowired,@Resource,@Value
    • 举例实现

      • byname
    <!--手动注入-->
    <?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="cat" class="com.kuang.pojo.Cat"/>
        <bean id="dog" class="com.kuang.pojo.Dog"/>
        <bean id="people" class="com.kuang.pojo.Peopel">
            <property name="name" value="张三"/>
            <property name="cat" ref="cat"/>
            <property name="dog" ref="dog"/>
        </bean>
    </beans>
    <!--自动装配-->
    <bean id="people" class="com.kuang.pojo.Peopel" autowire="byName">
         <property name="name" value="张三"/>
    </bean>
    <!--Spring会根据class属性找到实体类,然后查询实体类中所有setter方法的名字,根据setter方法后面的名字(例如SetDog,则setter方法后面的名字为dog)再到配置文件中寻找一个与该名字相同id的Bean,注入进来-->
    
    • bytype
    <!--自动装配-->
    <bean id="people" class="com.kuang.pojo.Peopel" autowire="byType">
         <property name="name" value="张三"/>
    </bean>
    <!--设置autowire属性为byType,那么Spring会自动寻找一个与该属性类型相同的Bean,注入进来。必须保证配置文件中所有bean的class属性的值是唯一的-->
    
  3. 注解实现自动装配:注解是通过反射来实现的,可以没有set方法

    • 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
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
    </beans>
    
    • 得到干净的配置文件
    <?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
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
        <bean id="cat" class="com.kuang.pojo.Cat"/>
        <bean id="dog" class="com.kuang.pojo.Dog"/>
        <bean id="people" class="com.kuang.pojo.Peopel">
            <property name="name" value="张三"/>
        </bean>
    </beans>
    
    • 在实体类的属性或者set方法写添加@Autowired,实现自动装配
    public class Peopel {
        @Autowired
        private Cat cat;
        @Autowired
        private Dog dog;
        private String name;
         
        ... 
    }
    
    • spring会默认优先根据属性类型(byType)去容器中找对应的组件(bean),找到就赋值;若找到多个相同类型的组件,再将属性的名称作为组件(bean)的id去容器中查找。

    • 当ioc容器根据属性类型去容器中找找到多个相同类型的组件,配合使用@Qualifier注解:@Qualifier指定需要装配的组件的id,而不是使用属性名。

    • Resource注解:@Resource同样可以实现自动装配功能,但它默认是按照组件名称进行装配的,按照组件名称找不到在根据属性类型去查找,再找不到就报错, @Resource是java规范。

标签:装配,作用域,bean,Bean,自动,组件,注解
From: https://www.cnblogs.com/hytip/p/18187993

相关文章

  • ETLCloud中如何执行Java Bean脚本
    ETLCloud中如何执行Java Bean脚本在ETLCloud这一强大的数据集成和转换平台中,执行Java Bean脚本的能力为其增添了更多的灵活性和扩展性。Java Bean脚本不仅仅是一段简单的代码,而是一种强大的工具,可以帮助用户定制和优化数据处理的每一个环节。为了充分利用这一功能,您需要编写......
  • Spring bean循环依赖
    Spring循环引用循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A。循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖。一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对......
  • Spring bean的生命周期
    Spring的bean的生命周期通过BeanDefinition获取bean的定义信息。调用构造函数实例化bean。bean的依赖注入。@Autowired或者@Value的set方法。处理Aware接囗(BeanNameAware、BeanFactoryAware、ApplicationContextAware)Bean的后置处理器BeanPostProcessor-前置。初始化方......
  • Spring中的单例bean
    Spring框架中的单例bean是线程安全的吗?不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。Spring框架并没......
  • Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
    Spring中的Bean是否线程安全取决于Bean的作用域(scope)。Spring提供了几种不同的Scope,其中包括Singleton、Prototype、Request、Session、GlobalSession等。 SingletonScope(单例模式)默认情况下,SpringBean是SingletonScope,这意味着在整个应用程序上下文中只有一个实例。......
  • JAVA下载安装配置基础
    JAVA下载安装配置基础JDK、JRE、JVMJDK:JavaDevelopmentKitJava开发者工具,他包含JRE和JVMJRE:JavaRuntimeEnvironmentJava运行时环境包含JVMJVM:JAVAVirtualMachineJave虚拟机下载配置JDK搜索下载JDK8(目前使用率较高的版本)安装JDK记住安装的路径进入高......
  • sqlSession相关的作用域和生命周期
    生命周期和作用域是十分重要的,错误的使用会导致非常严重的并发问题。Mybatis的执行流程详细讲解SqlSessionFactoryBuilder:一旦创建了SqlSessionFactory,就不需要它了,比较适合在局部变量中创建。SqlSessionFactory:相当于数据库的连接池;SqlSessionFactory一旦被创建就应......
  • jenkins安装配置管理(旧)
    jenkins安装配置管理(旧)jenkins安装配置管理1.安装依赖yuminstall-yjava-1.8.0-openjdkjava-1.8.0-openjdk-develjava-version2.添加yum仓库源下载yum仓库源配置文件wget-O/etc/yum.repos.d/jenkins.repohttps://pkg.jenkins.io/redhat-stable/jenkins.repo导......
  • ansible01-ansible安装配置
    中文权威指南http://www.ansible.com.cn/docs/playbooks_variables.html#yaml安装wget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-7.repowget-O/etc/yum.repos.d/Centos-7.repohttp://mirrors.aliyun.com/repo/Centos-7.repo依赖  paramiko......
  • Spring 中 bean 的循环依赖
    什么是循环依赖A直接或间接依赖B的同时B又间接或直接依赖A,此时我们可以称A和B之间存在循环依赖关系。在使用Spring的过程中应该尽量避免循环引用关系的出现。生命周期简述在阅读下面的样例之前,需要先了解一下Spring中bean的生命周期,简单来说bean的生命周期分......