zoukankan      html  css  js  c++  java
  • spring装配bean

    spring配置的可选方案

    • xml
    • javaConfig
    • 自动扫描和自动装配

    配置风格可以互相搭配,混合使用.

    尽可能的使用自动配置机制.如果必须要显式配置(比如有些源代码不是由你来维护)推荐使用类型安全的javaConfig,只有需要xml命名空间并且javaConfig没有同样实现时使用xml

    自动化装配

    因为自动化装配最为强大和方便,所以首先介绍自动化装配

    • 组件扫描:自动发现应用上下文创建的bean
    • 自动装配:自动满足依赖

    创建可发现的bean

    • @Component:表明被标注的类为组件类,告知spring创建bean
    • @ComponentScan:开启组件扫描
    • xml配置
    <context:component-scan base-package="your package"/>

    为组件扫描的bean命名

    • @Conponent("name")
    • @Named("name")

    设置扫描基础包

    1. 使用@Configuration定义配置类
      • @ComponentScan("package")
      • @ComponentScan(basePackages={"1","2"})
      • @ComponentScan(basePackageClasses={1.class,2.class})

    推荐使用basePackageClasses,因为类型安全.可以在包中创建用于扫描的空标记接口,避免引用实际的应用程序代码,保持对重构友好

    自动装配

    @AutoWired 可以使用在构造器,setter方法等,spring会尝试满足参数声明的依赖.

    如果没有合适的bean将会抛出异常,可以将@AutoWired的required属性设置为false

    也可以使用@Inject

    通过java代码适配bean

    比如要将第三方库中的组件装配到你的应用使用不了自动化装配,所以还是要显式配置

    javaConfig是比xml更好的方案,因为强大,类型安全,对重构友好

    创建配置类

    @configuration:表明配置类

    声明简单的bean

    @Bean
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    @Bean注解告诉spring该方法会返回一个对象,并且该对象需要注册为bean.

    bean的name默认为方法名,可以通过重命名方法和对@Bean注解name属性赋值更改

    @Bean(name="name")
    public CompactDisc sgtPeppers(){
        return new SgtPeppers();
    }

    使用javaConfig实现注入

    1 .装配bean的最简单方式是引用创建bean的方法

    @Bean
    public CDplayer cdPlayer(){
        return new CDPlayer(sgtPepper());
    }

    看起来CompactDisc是通过调用sgtPeppers()得到,但是实际上因为sgtPeppers方法有@Bean注解,spring会拦截调用并确保直接返回该方法创建的bean

    1. 方法请求一个CompactDisc作为参数
    @Bean
    public CDPlayer cdPlayer(COmpactDisc compactDisc){
        return new CDPlayer(compactDisc);
    }

    spring调用cdPlayer方法时会自动装配CompactDisc到配置方法中

    这通常是最佳的方式,因为不需要COmpactDisc声明在同一个配置类或是需要在javaConfig中声明,也可以是组件扫描发现的组件类.

    通过xml装配

    创建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:aop="http://www.springframework.org/schema/aop"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                         http://www.springframework.org/schema/context
                         http://www.springframework.org/schema/context/spring-context.xsd
                         http://www.springframework.org/schema/aop
                         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
    </beans>

    声明bean

    <bean class="package.yourClass"/>

    因为没有明确给定ID,所以这个bean将会根据全限定类名来进行命名并以#0作为后缀(0是编号区分多个同类bean)。为了便于记忆,用户往往需要自己设定bean的id,这可以通过id属性来指定,如下:

    <bean id="person" class="package.yourClass">

    构造器注入初始化bean

    • spring3引入的c-命名空间
    <bean id="…" class="…">
        <constructor-arg ref="beanID"/>
    </bean>
    <bean id="…" class="…"
        c:cd-ref="beanID"/>
        <-- cd为构造器参数名 -->
        <-- 构造器参数还可以换成参数位置
        如 c:_0-ref 下划线是因为xml不允许使
        用数字作为第一个字符.如果只有一个参数可
        以省略位置信息如c:_-ref -->

    注入字面量到构造器

    • <constructor-arg value="..."/>
    • c命名空间 同上但是去掉-ref后缀
      如:<bean id="..." class="..."
      c:cd="value"/>

    装配集合

    注入null可以使用<constructor-arg><null/></constructor-arg>

    注入列表

    <constructor-arg>
        <-- 可以使用list set等元素 -->
        <list>
            <-- 字面值注入使用value -->
            <value>your value</value>
            <-- bean装配使用ref -->
            <ref bean="beanID"/>
        </list>
    </constructor-arg>

    c命名空间无法装配列表,但是与其使用xml装配不如使用java配置.

    设置属性

    1. <property name="" value=""(设置字面量使用value 装配bean需要使用ref)/>
    2. <bean id="" class="" p:propertyrname(-ref)=""/>

    p命名空间也无法装配列表,但是可以使用util命名空间简化bean配置

    使用util命名空间可以单独对集合创建bean

    <util:list id="">
        <value>…</value>
        <ref>…</ref>
    </util:list>

    现在就可以将list使用p命名空间注入了

    <bean id="" class=""
        p:..-ref="listID"/>

    导入和和混合配置

    javaConfig中引入xml配置

    如果配置类中bean太多希望拆开而又存在依赖怎么办?

    可以把bean放在不同的配置类中,然后创建一个更高级的配置类,在类中使用@Import将多个配置类组合

    @configuration
    @imporg({1.class,2.class})
    public class config(){
    }

    而如果有bean在xml中配置了可以使用@ImportResource注解
    @ImportResource("classPath:config.xml")

    xml中引入java配置

    元素

    <import resoune="config.xml"/>

    import只能导入xml配置

    导入java配置可以使用bean`

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    GDB调试汇编堆栈过程分析
    20145322 《信息安全系统设计基础》第十二周学习总结
    # 20145322《信息安全系统设计基础》第十一周学习总结
    20145322 《信息安全系统设计基础》第十周学习总结
    20145322学号 《信息安全系统设计基础》第9周学习总结(二)
    20145322学号 《信息安全系统设计基础》第9周学习总结(一)
    20145322 《信息安全系统设计基础》期中总结
    20145322 20145310 20145318信息安全系统设计基础实验报告
    20145322 《信息安全系统设计基础》第8周学习总结
    《信息安全系统设计基础》实验一报告
  • 原文地址:https://www.cnblogs.com/renluxiang/p/f4014554d42060ec5ab78e41fdc927f6.html
Copyright © 2011-2022 走看看