zoukankan      html  css  js  c++  java
  • 第2章 装配bean


    1、创建应用程序对象之间的协作关系称为“装配”,这也是DI的本质。
    2、Spring容器负责创建引用程序中的bean并通过DI来协调这些对象之间的关系。
    3、程序开发人员通过描述bean决定这个bean如何被装配。Spring提供了三种装配方式:
    1:在XMl中进行显示的配置
    2:在java中进行显示的配置
    3:隐式的bean发现机制和自动装配(建议使用方式)
    4、自动化装配bean:
    Spring从两个角度实现自动化装配:
    1:组件扫描:Spring会自动发现应用上下文中所创建的bean
    2:自动装配:Spring自动满足bean之间的依赖
    5、组件扫描:
    1:使用Component告诉Spring该类会作为组件,并创建这个类的bean。
           @Component
            public class 光盘 implication 光盘接口{
                ...
            }    
        2:开启组件扫描功能:
    1:使用java显示的配置方法:
                @Configuration
                @ComponentScan      //@ComponentScan 使Spring开启了组件扫描
                public class 光盘播放配置{}
            2:使用Xml显示配置方法:
          <context:component-scan base-package="需要扫描的包名"/>
    
    
    6、为bean命名:
    1:Spring会自动给上下文中的所有bean给一个ID。(类名首字母小写)
    2:使用@Component注解自定义ID
            @Component("光盘ID")
            public class 某种光盘 extends 光盘接口{...}
        3:使用@Named注解自定义ID
            @Named("光盘ID")
            public class 某种光盘 extends 光盘接口{...}
        (后两者有细微区别,但是大多数情况下可以互换)
    7、设置组件扫描的基础包:
    @ComponentScan("包名")
    @ComponentScan(basePackages={"包名","包名"})
    @ComponentScan(basePackageClasses={包中的类或者接口1.Class , 包中的类或者接口2.Class})
    例如:
            @Configuration
            @ComponentScan("需要扫描的包名")
            public class 光盘配置类{...}
            更加详细的设置:
                @Configuration
                @ComponentScan(basePackages = "需要扫描的包名")
                //@ComponentScan(basePackages={"包1","包2"})      //同时设置多个报名(参数类型是String,有可能会不安全)
                //@ComponentScan(basePackageClasses={包中的类或者接口1.Class , 包中的类或者接口2.Class})    //使用basePackageClasses指定的类所在的包将自动扫描
                public class 光盘配置类{...}
    8、通过注解实现bean的自动装配
    (自动装配就是让Spring自动满足bean依赖的一种方式)使用的注解是:@Autowired
    例如:
            @Component
            public class 光盘播放 implements 接口{
                @Autowired    //Spring在创建这个类的bean时会通过这个构造器实例化,并且传入需要的参数类型的bean。
                public 构造方法(参数列表){...}
                @Autowired    //Spring会尽力满足这个函数需要匹配的bean,如果只有一个匹配成功则使用,但是如果没有匹配到的话Spring抛出一个异常,如果匹配到多个也抛异常。
                public 普通方法(参数列表){...}
                @Autowired(required = false)     //如果没有检测到合适的bean,将设置为未装配,不抛异常)(如果代码中没有非null判断的话有可能会抛nullPointException)
                public 普通方法(参数列表){...}
            }
        //@Autowired注解是Spring特有的注解,也可以使用java的依赖注入规范中的@Inject注解(有细微差别,可以通用。)@Named也是java依赖注入规范的注解。
    9、自动装配不可行的情况:
    如果你在程序中要使用第三方的库,你是无法在它的类上写@component和@Autowired注解的。
    10、使用javaConfig的方式配置装配bean
    例如:
            @Configuration
            //@Configuration表明这个类是一个配置类,该类包含了Spring中创建bean的细节。
            public class 配置类类名{...}
    11、在javaConfig中声明简单的bean(因为没有依赖所以简单)
    需要在配置方法中创建一个方法:这个方法需要返回所需类型的实例,并使用@Bean标记
    例如:
            @Bean   //@Bean注解会告诉Spring,该方法返回的对象需要注册到上下文bean中(beanID和方法名一样。@Bean(name = "自定义ID"))
            public 光盘 光盘配置(){
                return new 光盘;
            }
    12、借助JavaConfig实现注入
    1:第一中方法:
            @Bean
            public 光盘播放 光盘播放配置(){
                return new 光盘播放(光盘配置());
            }
        2:第二中方法(推荐使用)
            @Bean
            public 光盘播放 光盘播放配置函数(光盘类 光盘){
                return new 光盘播放(光盘);
            }
    13、通过Xml装配Bean
    1:首先需要创建一个Xml配置文件,以<beans>作为根元素。
    2:使用<bean>声明一个bean:
    例如:
         <bean class = "" />    //自动生成ID
            <bean id="ID" class = "">     //自定义ID(推荐使用)
    14、使用Xml实现注入:
    1:构造器注入bean引用:
    例如:
               <bean id = "光盘" class = "类路径" />
               <bean id = "光盘播放" class = "类路径">     //Spring遇到<bean>:创建对应的bean
                    <constructor-arg ref = "光盘">        //告诉Spring需要一个ID是“光盘”的bean被引入到构造方法中。
               </bean>
            也可以使用Spring3.0的C命名空间的形式。
    2:将字面值注入到构造器中:
    之前的例子都是:构造函数中接收的都是引用,有时候需要接收特定的值:
    例如:
                //构造函数接收两个字符串
                <bean id = "光盘" class= "路径">
                    <constructor-arg value = "一个字符串" />
                    <constructor-arg value = "一个字符串" />
                </bean>
        3:装配集合:
    1:装配一个拥有磁道的光盘(磁道是空的):
                <bean id = "光盘" class = "">
                    <constructor-arg value = "字符串">
                    <constructor-arg value = "字符串">
                    <constructor-arg><null></constructor-arg>   //告诉Spring构造这个光盘的时候需要一个空磁道
                </bean>
            2:装配一个包含磁道列表的光盘(list<String>)
                <bean id = "光盘" class = "">
                    <constructor-arg value = "字符串">
                    <constructor-arg value = "字符串">
                    <constructor-arg>
                        <list>
                            <value>"磁道1的描述"</value>
                            <value>"磁道2的描述"</value>
                            <value>"磁道3的描述"</value>
                            <value>"磁道4的描述"</value>
                        </list>
                    </constructor-arg>
                </bean>
            3:上面的list中的<value>也可以是<ref bean = "" />
    例如:
                //依赖存放于list的bean
                <bean id = "光盘" class = "">
                    <constructor-arg value = "字符串">
                    <constructor-arg value = "字符串">
                    <constructor-arg>
                        <list>
                            <ref bean = "" />
                            <ref bean = "" />
                            <ref bean = "" />
                        </list>
                    </constructor-arg>
                </bean>
            4:注意:
    上面的list也可以使set等。如果是set,在装配的时候将会去重且不能保证装配顺序。
    15、设置属性:
    到目前为止:bean的属性都是通过构造方法传进来的。下面介绍直接在xml中设置属性:
    例如:
    //假设,“光盘播放器”有一个属性是光盘,但是构造方法不提供接收参数。
            <bean id = "光盘播放器ID" class = "">
                <property name = "属性名称" ref = "光盘bean的ID">      //告诉Spring这个属性对应的bean。
            </bean>
    16、将字面值注入到属性中 && 将list注入到属性中:
        <bean id ="" class>
            <property name = "属性名称" value = "一个字符串">    //将字面值注入到属性
            <property name = "list属性名称" >       //将list注入到属性集合
                <list>
                    <value> "字面值" </value>
                    <value> "字面值" </value>
                </list>
            </property>
        </bean>
    17、java配置,xml配置,自动配置。可以混合使用。(具体可以看书)
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/Xmingzi/p/8820473.html
Copyright © 2011-2022 走看看