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配置,自动配置。可以混合使用。(具体可以看书)
  • 相关阅读:
    第三方支付架构设计之:商户回调通知系统的悲观和乐观策略
    Layui 2.0.0 正式发布:潜心之作,开箱即用的前端UI框架(确实很多内容)
    简历上的哪些内容才是 HR 眼中的干货?
    windows Hook 消息分类
    MQTT协议学习及实践(Linux服务端,Android客户端的例子)
    MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
    Docker Machine
    Oracle执行计划
    Spire.XLS
    Docker
  • 原文地址:https://www.cnblogs.com/Xmingzi/p/8820473.html
Copyright © 2011-2022 走看看