跟着柴毛毛学Spring(3)——简化Bean的配置

通过前面的学习。我们会感觉到对于一个有较多Bean的大项目,Spring的配置会比較复杂。

那么接下来我们就介绍怎样简化Spring的配置。

简化Spring的配置主要分为两类:
1. 自己主动装配
2. 自己主动扫描

以下就具体介绍这两种简化配置的方式。

自己主动装配的种类

使用XML实现自己主动装配

    <bean id="person" class="com.njupt.Person" autowire="byName">
    bean>
    <bean id="person" class="com.njupt.Person" autowire="byType">
    bean>

byType的缺点:假设某一类型的bean有多个。那Spring在通过byType为属性寻找同类型的bean时就会抛出异常。

解决方式:
– 为同样类型的bean设置是否首选
在须要被首选的bean中作例如以下设置:

<bean id="person" class="com.njupt.Person" primary="true">
    bean>

在不须要被首选的bean中作例如以下设置:

<bean id="person" class="com.njupt.Person" primary="false">
    bean>
  • 取消某一些同样类型bean的候选资格
    使用auto-candidate属性取消某些bean的候选资格。Spring在为属性寻找同类型的bean时直接排除这些bean。
<bean id="person" class="com.njupt.Person" default-candidate="false">
    bean>
<bean id="person" class="com.njupt.Person" autowire="constructor">
    bean>

构造器的自己主动装配本质上仍是通过byType进行装配,仅仅只是autowire=”constructor”时。Spring会对构造器的參数进行自己主动装配。而autowire=”byType”时,Spring会对bean的成员变量进行自己主动装配。

构造器的自己主动装配和byType自己主动装配具有同样的缺点:当某一类型的bean有多个时,Spring无法确定到底选择哪个bean,就直接抛出异常。

此外。构造器的自己主动装配还有个独特的缺点:当构造器有多个时,Spring也无法选择到底初始化哪个构造器,因此也直接跑出异常。

使用默认自己主动装配
上述自己主动装配的方法都是针对单个bean,假设要让beans下的全部bean均使用某种自己主动装配策略,那么在beans标签中添加例如以下配置:

default-autowire="byType"
  • 注意1:在beans中设置了default-autowire后。这个參数仅对当前beans标签之间的bean有效。
  • 注意2:採用默认自己主动装配后。仍然能够在bean中设置特有的自己主动装配策略,bean中的自己主动装配策略会覆盖默认策略。
  • 注意3:使用了自己主动装配后,我们仍然能够在bean中通过constructor-arg属性和property属性对bean进行显示装配。
    这样的混合使用显示装配和自己主动装配的方式能够成功地解决byType出现的不确定性问题
  • 注意4:假设使用了constructor来实现构造器參数的自己主动装配,那么就不能混合使用autowire=”constructor”属性和constructor-arg标签。

使用注解实现自己主动装配

使用注解装配事实上就是把原本XML中bean中的autowire=”xxx”属性搬到了Bean类的Java代码中了。功能上没啥区别。

以下就来介绍怎样使用注解实现自己主动装配。

在beans中作例如以下配置:

<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-4.5.xsd">

    <context:annotation-config>

beans>

当Bean中的属性、函数被标记@Autowired后。Spring在创建这个bean的对象时,会通过byType寻找与属性、函数參数同样类型的bean进行自己主动装配。
– 用@Autowired标注构造函数

    @Autowired
    public Person(String name,long id){
        this.name = name;
        this.id = id;
    }
  • 用@Autowired标注普通函数
    @Autowired
    public void createInstance(){
        System.out.println("对象被创建啦!");
    }
  • 用@Autowired标注属性
    @Autowired
    private Father father;

@Autowired本质上採用byType进行自己主动装配。因此也存在与byType一样的问题:若同一类型的bean有多个时,或找不到该类型的bean。Spring就会抛出异常。

    @Autowired
    @Qualifier("father")
    private Father father;

@Qualifier(“ID”)会依据bean的id为father装配。

    @Autowired(required="false")
    public Person(String name,long id){
        this.name = name;
        this.id = id;
    }

此时,假设Spring找不到与构造函数的參数同样类型的bean的话,就赋上null。
注意:若一个bean有多个构造函数时。仅仅有一个构造函数能够设为@Autowired(required=true),其余的构造函数都仅仅能设为@Autowired(required=false)

通过前面学习我们知道,在Spring的XML配置中,能够使用SpEL表达式来实现手动装配。同样,在注解中也能够使用SpEL表达式实现手动装配。
– 将名为father的bean注入给构造函数:

    @Value("#{father}")
    public Person(Father father){
        this.father = father;
    }
  • 将father对象中的id注入给id:
    @Value("#{father.id}")
    public void setId(long id){
        this.id = id;
    }

自己主动装配能够降低bean标签下property标签和constructor-arg标签的数量。而自己主动检測能降低bean标签的数量。

腰开启自己主动检測功能,须要在XML的beans标签中作例如以下配置:
– base-package: 表示要扫描的包

<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-4.5.xsd">

    <context:component-scan base-package="com.xxx">context:component-scan>

beans>

要让一个Java类变成一个Bean。须要在类上加上@Component注解。

Spring在启动的时候会到base-package指定的包下寻找被@Component标记的类,把他们初始化为bean。保存在SpringContext中。
– 将类型的小写作为bean的名字:

@Component
class Person{
}
  • 指定bean的名字:
@Component("person")
class Person{
}

尽管使用注解已经大大降低Spring中的XML配置,但仍然须要少量的XML配置,我们能够将XML配置用Java代码实现,从而全然避免了XML配置。

用@Configuration标签标注一个类,表示这个类是Spring的配置类:

@Comfiguration
class Person{
    ......

}

在Spring的配置类中,使用@Bean标签标注一个bean。

  • 函数名:bean的id
  • 返回值:bean的类型
  • 函数体:初始化这个bean
@Comfiguration
class Person{
    @Bean
    public Person person(){

        Person person = new Person("柴毛毛");

        person.setAge(22);
        return person;
    }
}

在採用Java进行Spring的配置中,对bean属性和构造器的注入很easy,仅仅需在函数中操作就可以:

@Comfiguration
class Person{
    @Bean
    public Person person(){
        return new Person();
    }
}

在XML配置中。bean的类型是用String表示的。因此仅仅有在执行结点才干发现bean的类型是否写错;而在Java配置中,在编译阶段就能发现bean的类型是否出错。从而能够尽早地发现错误。

Original: https://www.cnblogs.com/yfceshi/p/7401544.html
Author: yfceshi
Title: 跟着柴毛毛学Spring(3)——简化Bean的配置

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541804/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot定时任务-什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?

    前文展示quartz实现基于数据库的分布式任务管理和job生命周期的控制,那在分布式场景下如何解决弹性调度、资源管控、以及作业治理等呢?针对这些功能前当当团队开发了ElasticJ…

    Java 2023年6月6日
    062
  • 基本运算符

    运算符 JAVA语言支持入下运算符。 %:余数 !=:不等于 &&:and ||:or !:not 二元运算符 整数默认为int类型,按类型优先级自动转换,下图说明…

    Java 2023年6月9日
    077
  • Excel 使用 VLOOKUP 函数匹配特定列

    前言 工作有一项内容,是根据新的表格的某一列的内容一对一匹配,生成一列新的表格。这就用到了 Excel 的 VLOOKUP 函数。 函数使用 函数体: =VLOOKUP(looku…

    Java 2023年6月7日
    098
  • Ubuntu中安装redis

    第一种方式在线安装首要前提安装c语言编译环境,命令如下:$sudo apt-get install gcc 安装完成后可以输入$gcc –version查看版本 1、获…

    Java 2023年6月9日
    086
  • zookeeper集群

    环境: 拥有三台服务器,假设三台服务器的Ip地址为 172.18.19.143,172.18.19.15,172.18.19.129 开放三台服务器的2287,3387端口 集群搭…

    Java 2023年6月8日
    075
  • 【Elasticsearch】ES选主流程分析

    Raft协议 Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群。Raft协议中有以下角色: Leader(领导者):集群中的领导者,负责管理集群。 Can…

    Java 2023年6月8日
    071
  • linux下weblogic12c漏洞打补丁基本操作

    日常运维工作中我们有时需要给weblogic打补丁,补丁文件是oracle官方发布的zip包。下面均为我本地的目录结构,实际操作中以你实际的目录为准。 1、上传补丁并解压 cd /…

    Java 2023年6月5日
    072
  • 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kuberne…

    Java 2023年6月8日
    0120
  • Win10 系统中修改电脑 系统user 名称

    以下步骤来自于:南京邮电大学 ,22级,继教院,通信工程专业,王骏 同学的分享 1.win+R 输入regedit 回车,进入注册表。 2.定位到HKEY_LOCAL_MACHIN…

    Java 2023年6月14日
    078
  • 1.BigDecimal用法

    1.BigDecimal用法详解 一、简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double…

    Java 2023年6月9日
    0117
  • StringAPI里面的indexOf和subString是怎么样取值和切割的?

    indexOf和subString取值走向图;首先简单介绍这者的作用,具体可以看官方API 1.indexOf的作用: 就是获取某个字符串的其中具体一个字符的位置 2.subStr…

    Java 2023年6月9日
    055
  • 通用查询解决方案

    package cn.com.fmsh.nfcos.sapo.biz; import java.util.*; import java.util.regex.*; import j…

    Java 2023年6月9日
    071
  • Mysql优化

    1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表…

    Java 2023年6月9日
    067
  • Netty之DefaultAttributeMap与AttributeKey的机制和原理

    1.什么是 DefaultAttributeMap? DefaultAttributeMap 是一个 &#x6570;&#x7EC4; &#xFF0B; &…

    Java 2023年6月7日
    061
  • Centos部署Loki日志聚合系统

    关于一些日志聚合由来及原理科普见我的另外一篇 《编程入门之日志聚合系统》 https://www.cnblogs.com/uncleguo/p/15948763.html Loki…

    Java 2023年6月15日
    069
  • 安装和升级pip与pip3

    pip 官网:https://pypi.org/project/pip/ 你可以通过以下命令来判断是否已安装: pip –version # Python2.x 版本命令 pip…

    Java 2023年6月5日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球