zoukankan      html  css  js  c++  java
  • Spring系列(二) Bean装配

    创建应用对象之间协作关系的行为称为装配(wiring), 这也是DI的本质.

    Spring中装配Bean的方式

    Spring提供了三种装配Bean的方式.

    1. 隐式的Bean发现机制和自动装配
    2. Java Config
    3. Xml Config

    Spring可以任意选择三种方式其中的一种或多种组合. 但建议尽量使用自动装配方式以避免产生繁杂的xml配置文件及java代码, 其次是使用类型安全的Java Config, 如果都满足不了需求则最后再考虑xml config.

    自动配置

    借助于下面两个方面Spring可以实现自动化Bean配置.

    1. 组件扫描(component scanning): 自动发现上下文种创建的bean
    2. 自动专配(autowiring) 自动创建对象间依赖

    一. 组件扫描:

    • @Component 注解标记的java类会作为组件类. 带参的@Component("beanid"), 参数为bean的名称, 默认为首字母小写的类名. @Component 等同 @Named 注解;
      对应xml配置节点<bean>
    • @ComponentScan 用来启动组件扫描, 默认的扫描范围是该注解标记的类所在的包. 带参的 @ComponentScan(basePackages={"basePackage1","basePackage2"}) 可以指定扫描的包范围 ; 带参的 @ComponentScan(basePackageClasses={ClassNameA.class,InterfaceB.class})这些类或接口所在的包将作为扫描的基础包范围, 相比指定字符串的基础包, 这种方式提供了类型安全性(重构友好的);
      对应的xml配置节点是<context:component-scan>

    二. 自动装配

    • @AutoWired 提供了自动装配能力. 构造器注入和setter注入均可以使用该注解, 事实上它可以在任何方法上发挥作用.@AutoWired(required=false) 设置为false在没有匹配到bean时不会抛出异常. @AutoWired等同于@Inject

    Java Config

    对于无法使用@Conmponent@Autowired注解的, 比如第三方类库的组件, 可以使用java config的方式装配. 同时, javaconfig也是java代码, 他们不应该包含任何业务代码, 实际上两者应该完全分开,所以一般会将java config代码放在单独的包中.

    • @Configuration 注解标识类是一个配置类.
    • @Bean 注解的方法声明为返回bean. @Bean(name='methodname') 参数标识bean的id名称, 默认为方法名称.
    @Bean
    public A getA(){
        return new A();
    }
    
    @Bean
    public B getB(){
        return new B(getA());
    }
    
    @Bean
    public C getC(){
        return new C(getA());
    }
    

    在上面代码中构建组件B,C使用的构造器注入了A的beangetA(), 在一般的java程序中B,C的Bean会分别持有A的不同实例, 但Spring中不是这样, 所有getA()会被拦截, 并返回同一个bean. 默认情况下Spring的bean都是单例的.

    可以使用更为简单的方式创建B,C的bean, 代码如下:

    @Bean
    public B getB(){
        return new B(A a); // 也可以使用setter方式, 或者任何其他方式创建bean
    }
    
    @Bean
    public C getC(){
        return new C(A a);
    }
    
    • @Import({ClassnameA.class,ClassnameB.class}) 对于不同位置的bean, javaconfig可以使用此注解导入其他配置类.

    XML Config

    XML是Spring最原始的装配方式, 熟悉Xml config对了解历史项目, 以及渐进重构到java config或自动配置都是有帮助的.

    xml配置构造器(setter)注入的方式有两种, 两种方式各有利弊:

    1. <constructor-arg><property> 特点是可以定义集合,数组注入
    2. c-命名控制 或 p-命名空间 特点是简洁, 但不能注入集合; 使用时需要引入XSD.
    • 配置文件的顶部需要声明多个XSD.
    • <bean class="com.xlx.c02.MyClass"> 声明了一个bean, 默认id为com.xlx.c02.MyClass#0, 可以使用属性id为bean指定名称<bean id="myclass" class="com.xlx.c02.MyClass">.
    • <constructor-arg> 用来配置构造器注入的参数, 引用其他bean时使用<constructor-arg ref="otherBeanId">, 等同c-命名空间的属性c:otherBean-ref='otherBeanId', 或者参数数字索引c:_0-ref='otherBeanId'(单参数可以省略数字); 也可以注入字面量值<constructor-arg value="this is value"> 等同c-命名空间的属性c:_name='jery',或 c:_0='jery'(单参数可省略数字)
    • 装配集合
    <constuctor-arg>
        <list>
            <value>first</value>
            <value>second</value>
        </list>
    </constuctor-arg>
    
    • 设置属性: <property name="propertyName" ref="beanId">p:propertyName-ref="beanId"
    • util 命名空间的功能可以简化一些字面量属性设置, 同样,需要首先声明XSD.
    <!--定义集合-->
    <util:list id="trackList">
        <value>first</value>
        <value>second</value>
    </util:list>
    
    <!--p-命名的方式引用集合-->
    p:tracks-ref="trackList"
    

    混合配置

    一. Java Config引用其他

    • @Import 可以导入java配置类
    • @ImportResource 可以导入xml配置, 如@ImportResource("classpath:my-config.xml")

    二. XML Config 引用其他

    • <import resource='my-config.xml'> 引用其他xml配置
    • <bean> 引用java config

    不管如何引用, 创建一个根配置会使配置更具层次, 更易于阅读管理.

  • 相关阅读:
    第二百七十八节,MySQL数据库-表内容操作
    第二百七十七节,MySQL数据库-数据表、以及列的增删改查
    第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】
    第二百七十五节,MySQL数据库安装和介绍
    第二百七十四节,同源策略和跨域Ajax
    第二百七十三节,Tornado框架-文件上传
    第二百七十二节,Tornado框架-iframe标签框架伪造ajax
    如何判断某个字符串是不是有数值型通过逗号拼接成的字符串
    统计每小时数据的处理
    计算某个特定分隔符分隔的字符串的和
  • 原文地址:https://www.cnblogs.com/walkinhalo/p/9607524.html
Copyright © 2011-2022 走看看