第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配置,自动配置。可以混合使用。(具体可以看书)
原文地址:https://www.cnblogs.com/Xmingzi/p/8820473.html