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

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

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

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

自己主动装配

自己主动装配的种类

  1. byName:依据属性的名字自己主动装配
  2. byType:依据属性的类型自己主动装配
  3. constructor:依据构造器的參数类型自己主动装配
  4. autodetect:最佳自己主动装配。首先採用constructor自己主动装配,若没有发现与构造器相匹配的Bean时,採用byType进行自己主动装配。

使用XML实现自己主动装配

  1. byName:依据属性的名字装配
    在bean标签中加入属性autowire=”byName”。当Spring启动时,会寻找与person中成员变量名字同样的bean,并将该bean注给person的成员变量。
    <bean id="person" class="com.njupt.Person" autowire="byName"></bean>
  1. byType:依据属性的类型装配
    在bean标签中加入属性autowire=”byName”。

    当Spring启动时,会寻找与person中成员变量类型同样的bean。并将该bean注给person的成员变量。

    <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>
  1. constructor:依据构造器的參数的类型装配
    autowire设置为constructor后,Spring会寻找与构造函数的參数类型同样的bean,并注入给这个构造函数。
<bean id="person" class="com.njupt.Person" autowire="constructor"></bean>

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

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

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

  1. autodetect:最佳自己主动装配。

    Spring要初始化一个设置了autowire=”autodetect”的bean时,首先採用构造器装配。若没有发现与构造器相匹配的Bean或构造器有多个时,就採用byType对属性进行装配。

使用默认自己主动装配
上述自己主动装配的方法都是针对单个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代码中了。功能上没啥区别。

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

1. 开启注解自己主动装配

在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>

2. 使用@Autowired标注须要自己主动装配的函数或属性

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

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

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

@Autowired弊端的应对策略

  1. 若同一类型的bean有多个
    若採用xml设置bean的自己主动装配。则能够使用显示装配的方式。手动设置须要注入的參数,而使用注解自己主动装配时,能够使用@Qualifier缩小候选bean的范围。具体操作例如以下:
    @Autowired@Qualifier("father")private Father father;

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

  1. 若找不到某一类型的bean
    假设bean中的某些属性、參数不须要初始化值也能接受的话,那就为该属性或參数的@Autowired加入required属性:
    @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)

在注解中使用SpEL表达式

通过前面学习我们知道,在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标签的数量。

1. 开启Spring的自己主动检測

腰开启自己主动检測功能,须要在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>

2. 为须要自己主动减的bean加入@Component注解

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

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

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

3. 过滤被扫描的bean

使用Java取代XML配置

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

1. 定义一个Spring配置类

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

@Comfiguration
class Person{……
}

2. 声明一个bean

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

- 函数名:bean的id
- 返回值:bean的类型
- 函数体:初始化这个bean

@Comfiguration
class Person{@Beanpublic Person person(){//构造器注入Person person = new Person("柴毛毛");//属性注入person.setAge(22);return person;}
}

3. 使用Java进行注入

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

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

採用Java取代XML配置的优点

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

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

  1. 跟着柴毛毛学Spring(1)——纵观Spring

    Spring根本任务 Spring的根本任务就是简化Java开发. 目前许多框架如果要使用他们,就必须要继承或实现这些框架的各种类.这使得框架与我们的程序耦合度过高.由于在我们的程序中加入了过多的框架 ...

  2. java中p.name_spring如何使用命名空间p简化bean的配置

    这篇文章主要介绍了spring如何使用命名空间p简化bean的配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一般情况下,我们是这么配置bean ...

  3. 学习spring1--跟我一起学Spring 3(2)–开发环境配置

    http://www.importnew.com/13185.html#spring 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 -首页所有文章资讯W ...

  4. Spring学习之Bean的配置

    本文将会介绍Spring框架中wiring beans的相关内容,包括:bean的声明与创建.在xml文件中对bean基本使用方法的配置以及Spring 3中新特性Spring Expression ...

  5. Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)

    文章目录

  6. Spring之Bean的配置(二)

    目录 一.Bean的配置 1.自动装配 (1)简介 (2)缺点 2.继承Bean 3.依赖Bean配置 4.Bean的作用域 5.使用外部属性文件 6.注册PropertyPlaceholderCon ...

  7. 学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用

    http://www.importnew.com/13246.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 -首页所有文章资讯Web架构基础技 ...

  8. Spring IOC容器和Bean的配置

    Spring IOC容器 和Bean的配置 : IOC和DI IOC(Inversion of Control):反转控制 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的 ...

  9. Spring Bean的配置及常用属性

    作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要时注入应用程序中,从而对组件之间依赖关系进行了解耦.这一切都离不 ...

最新文章

  1. 性能计数器与profiler的组合性能诊断
  2. 福师计算机导论在线作业一,福师《计算机导论》在线作业一..doc
  3. 二级c语言基础知识pdf下载,全国计算机等级考试二级C语言公共基础知识.pdf
  4. 央视再次点赞阿里云ET城市大脑,树立用人工智能治理城市的标杆
  5. c 11 主要的新语言特性,关于c ++ 11:有没有办法确定C ++编译器实现的语言特性?...
  6. SharePoint 2010 客户端对象模型使用 ECMAScript
  7. 编程科普书籍推荐(Java)
  8. 高并发架构消息队列面试题解析
  9. Linux停服务器命令,使用linux的shutdown命令关闭服务器
  10. win7 去除快捷方式小箭头
  11. 【Active Learning - 12】一种基于生成对抗网络的二阶段主动学习方法
  12. 计算机硬件的五个功能部件及其功能
  13. 黑色曼陀罗的宿命,无尽的结束,留下伤痛与悲残
  14. web微信Android版,android实现用户体验超棒的微信WebView进度条
  15. html5播放推流播放地址是黑屏的,OBS Studio直播推流显示黑屏怎么办?教你解决方法...
  16. python基础运用_python基础知识和运用
  17. 华为手机日历倒计时_倒计时15天:麒麟芯片断供,华为手机普遍涨价,最高涨3000...
  18. 什么叫句柄(Handle)?
  19. ibm3650m4服务器找不到硬盘,ibmx3650m4服务器报错:不识别内存
  20. 基于Linux平台的TCP通信并发服务器---在线英语词典项目

热门文章

  1. 英伟达开源自动驾驶AI算法,升级芯片性能7倍于Xavier
  2. 有多少智能,就有多少人工?人工智能背后的数据标注师
  3. 机器视觉学习笔记:BP神经网络详解
  4. 「AI初识境」什么是深度学习成功的开始?参数初始化
  5. 【美国斯坦福大学人工智能研究院:人工智能当以人为本】
  6. 朴素贝叶斯算法应用实例
  7. 潜艇将来会无人驾驶吗?
  8. SAP ABAP FM AC_DOCUMENT_RECORD 研习
  9. Science: 四万张大脑图像首次揭示人脑白质的基因基础
  10. 世界人工智能发展究竟到了什么水平