通过前面的学习。我们会感觉到对于一个有较多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标注构造函数

    @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弊端的应对策略

  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{
@Bean
public Person person(){
//构造器注入
Person person = new Person("柴毛毛");
//属性注入
person.setAge(22);
return person;
}
}

3. 使用Java进行注入

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

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

採用Java取代XML配置的优点

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

跟着柴毛毛学Spring(3)——简化Bean的配置的更多相关文章

  1. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  2. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

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

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

  4. Spring中的Bean的配置形式

    Spring中Bean的配置形式有两种,基于XML文件的方式和基于注解的方式. 1.基于XML文件的方式配置Bean <?xml version="1.0" encoding ...

  5. 使用spring的特殊bean完成配置

    1.分散配置 beans.xml配置如下: 使用占位符变量代替bean装配文件中的硬编码配置.占位符采用${variable}形式. 说明:当通过context:property-placeholde ...

  6. Spring学习十一----------Bean的配置之基于Java的容器注解@Bean

    © 版权声明:本文为博主原创文章,转载请注明出处 @Bean -@Bean标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/> -可 ...

  7. Spring学习十----------Bean的配置之Autowired注解实现

    © 版权声明:本文为博主原创文章,转载请注明出处 @Required -@Required注解适用于bean属性的setter方法 -这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在b ...

  8. Spring学习九----------Bean的配置之Bean的定义及作用域的注解实现

    © 版权声明:本文为博主原创文章,转载请注明出处 Spring Bean常用注解 @Component:通常注解,可用于任何Bean @Repository:通常用于注解DAO层,即持久层 @Serv ...

  9. Spring学习八----------Bean的配置之Resources

    © 版权声明:本文为博主原创文章,转载请注明出处 Resources 针对于资源文件的统一接口 -UrlResource:URL对应的资源,根据一个URL地址即可创建 -ClassPathResour ...

随机推荐

  1. oracle连接连表查询时,两表的连接字段类型不一致的时候,会导致ora 01722无效数字错误,这时候需要转换

    类型不匹配,需要类型转换,函数:to_char()转换成字符,to_num()转换成数字

  2. Constructing Roads-最小生成树(kruskal)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题目描述: #include<cstdio> #include<cstring ...

  3. HDU 1522 Marriage is Stable 【稳定婚姻匹配】(模板题)

    <题目链接> 题目大意: 给你N个男生和N个女生,并且给出所有男生和女生对其它所有异性的喜欢程度,喜欢程度越高的两个异性越容易配对,现在求出它们之间的稳定匹配. 解题分析: 稳定婚姻问题的 ...

  4. Codeforces 1093D. Beautiful Graph【二分图染色】+【组合数】

    <题目链接> 题目大意: 给你一个无向图(该无向图无自环,且无重边),现在要你给这个无向图的点加权,所加权值可以是1,2,3.给这些点加权之后,要使得任意边的两个端点权值之和为奇数,问总共 ...

  5. php mysql 编码问题

    php mysql 编码问题 问题: PHP从数据库中读取数据,并echo出来,数据中文显示正常:但是echo出新定义的中文字符串,新定义的字符串会乱码. 由此可能是数据库中提取出来的中文编码和php ...

  6. RFC2616-HTTP1.1-Status Code(状态码规定部分—单词注释版)

    part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 10 Status Code Definitions ...

  7. Unity容器的简单AOP与DI的应用Demo(基于asp.net mvc框架)

    转发请注明出处:https://home.cnblogs.com/u/zhiyong-ITNote/ 整个Demo是基于Controller-Service-Repository架构设计的,每一层之间 ...

  8. Vuejs学习笔记(一)

    1)    vue.js 的 主要功能 1.模板渲染 2.模块化 3.扩展功能:路由,Ajax 2)    vue.js 模板渲染之双向绑定示例 message 绑定到了 input 对象,所有在in ...

  9. 前后端通过API交互

    前两篇已经写好了后端接口,和前段项目环境也搭建好了 现在要通过接口把数据展示在页面上 先占位置写架子 创建一个头部组件和底部组件占位置 <template> <h1>这是头部组 ...

  10. 一道有意思的找规律题目 --- CodeForces - 964A

    题目连接: https://vjudge.net/problem/1502082/origin 这一题第一眼看过去貌似是模拟,但是根据其范围是1e9可以知道,如果暴力解基本上是不可能的(不排除大佬级优 ...