zoukankan      html  css  js  c++  java
  • spring学习——装配Bean

    装配Spring

    spring 装配的方案

      Spring容器负责创建应用程序中的Bean并且通过DI(依赖注入)来协调这些对象之间的关系。你需要告诉Spring怎样创建bean和装配bean,spring主要提供了三种方法来装配:

    • 在XML中进行显式配置
    • 在Java中进行显式配置
    • 隐式的Bena发现机制和自动装配

    一,自动装配Bean

      (1)自动化装配Bean

      从两个方面来实现自动化的装配:

      1.组件扫描:Spring还会自动扫描应用上下问中所创建的Bena

      2.自动装配:spring自动满足bean之间的依赖

      组件扫描和自动装配组合在一起能够发挥强大的物理,能够将显示的配置降低到最少。

    例子:创建一个Compactdisc类,spring会发现它并将它创建为一个bean,然后创建一个CDPlayer类,让Spring发现它,并将CompactDisc 的Bean注入进来。

      创建一个可以被发现 的Bean,创建一个接口

       

       创建一个实现接口的类,并使用@Component注解(该注解表明改类会作为组件类,并告诉Spring要为这个类创建一个Bean)

       

       已经创建好 了Bean,但是组件扫描默认式不开启的,我们需要创建一个配置类来开启组件扫描,

      @Configuration声明这是一个配置类,@ComponentScan开启了组件扫描,默认是扫描该配置类所在的基础包里的Bean

       你也可以使用XML启动组件的扫描,主要是<context:component-scan base-package="soundsystem"/>

             

      创建一个测试类,判断是否能够发现CompaceDisc的Bean

      使用了@RunWith注解中添加了Spring的SpringJUnit4ClassRunner,以便在测试开始的时候就自动创建Spring的应用上下文,

      使用@ContexeConfiguration添加了CDPlayerConfig了是告诉spring要在CDPlayerConfig中加载配置,应为实在此类中添加了扫描注解@componentScan

        

     

      (2)为组件扫描的bean命名

      Spring 应用上下问为所有的bean都会定义个ID,如果没有指定的话,名称为将类的第一个字母变小写,如上面的SgtPeppers没有命名,则它的别名为sgtPeppers,如果要设置别名,则在@Component中设置别名,例如@Component(''lonelyHeartsClub''),还有一种注解也可以设置别名,@Named(''lonelyHeartsClub''),两者之间可以互换使用。

      (3)设置组件扫描的基础包

      当没有为@ComponentScan设置任何的属性时候,按照默认的规则,它会以配置类所在的包作为基础包来扫描租件,

      当我们想要将配置类都放在一个包里面,使其和其他的代码区分开来,那么默认的基础包就不能满足要求了,如果要满足这样的要求,可以在@ComponentScan的Value中指名包的名称,例如@ComponentScan('soundstytem'),

      如果你想更明确的指定这是基础包,可以使用basepackages属性来进行设置,例如@ComponentScan(basePackages="soundsystem"),basePackages是复数,可以指定多个基础包,例如@ComponentScan(backPackages={'soundsystem','video'})。

      还有一种方法是将其指定为包中所包含的类或者接口,例如@ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class}),这些类所在的包会作为组件扫描的基础包

      (4)通过为Bean添加注解实现自动装配

      自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下问中寻找匹配某个bean需求的其他Bean,我们可以使用Spring的@Autowired来实现自动装配,例如下面

         

       @Autowired不仅可以使用在构造器上,还可以使用在setter方法上,比如说,如果CDPlayer有一个setCompactDisc()方法,那么可以采用下面这种注解形式来进行自动装配:

        

      @Autowired可以用在类中的任何方法上,假设类中有一个方法是insertDisc(),该注解依然可以用在上面

           

        不管是构造器,Setter方法还是其他的方法,Spring都可以试长满足方法参数上的依赖,假如有且只有一个bean匹配满足依赖需求的话,那么这个bean将会被装配进来。假如没有匹配的bean,那么在应用上下文被创建的时候,Spring会抛出一个异常,为了避免异常的出现,可以将@Autowired的required的属性值设置为false:

      

       将值设置为false后,Spring会市场者执行自动装配,如果没有匹配的Bean的话,就会让这个Bean处于为装配的状态,如果代码中没有进行null检查的话,这个处于为装配状态的属性有可能出现NullPointerException,如果有多个Bean都能满足依赖关系的话,Spring也会抛出一个异常。

    二,通过Java代码来装配Bean

      在一般的情况下,可以使用自动装配来配置Bean,但是有时候需要使用Java代码来装配Bean,例如使用第三方的类,是没有办法在它的类上使用@Component和@autowired注解的,在这种情况下,自动装配是不可以实现的,我们可以使用两种显示装配的方法来实现装配:XML和java。

      在进行显示装配的时候,使用JavaConfig是最好的,JavaConfig和其他的Java代码有些不同,JavaConfig是配置代码,这意味者它没有任何的逻辑代码,通常将javaConfig放在单独的包中,使它和应用程序的逻辑分离开来。

      (1)创建配置类

             

      创建JavaConfig的关键在于要为此类加上@Configuration注解,该注解表示这个类是一个配置类,该类应该包含在Spring应用上下问中如何创建bean细节。

      (2)声明简单的Bean

      在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解,例如下面这个代码声明了一个CompactDisc的bean:

      

      @bean注解告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean,可以通过@bean的value属性给该Bean设置一个名称,例如

      

      (3)借助JavaConfig实现注入

      在Java Config中配置Bean的最简单的方法就是引用创建bean的方法,例如下面

      

       

      扩展:如果有两个方法中都使用了sgtPeppers()方法,那个sgtPeppers方法使创建了多少个Bean?

      答案使一个,看起来,Compactdisc使调用sgtPeppers()方法得到到,但是并非如此,因为sgtPeppers()方法上添加了@Bean注解,Spring将会拦截所有对它的调用,并确保直接返回该方法所创建的bean,并不是每次都对他进行实际的调用,假如说,你引用了其他的CDPlayerBean,它和之前那个bean完全一样,假如对sgtPeppers()方法的调用和其他的Java方法一样的话,那么每次调用都会创建一个SgtPeppers实例,在物理意义上这是有用的,例如两台播放器播放相同 的CD,每台一个CD,但是在软件领域中,我们完全可以将同一个SgtPeppers实例注入到任意数量的其他Bean中,默认情况下,Spring中的Bean都是单例的,

      

     三,通过XML来装配bean

       在Spring刚开始出现的时候,XML是配置的主要方法。

      (1)创建XML配置规范

      创建一个带有@Configuration的JavaConfig配置类相对于创建一个XML配置文件,并且以<beans>元素为根,例如

      

       (2)声明一个简单的Bean

      要在基于XML的Spring中声明一个bean,我们要使用另一个元素,<bean>,该元素相对于JavaConfig中的@Bean注解,

      class属性值指定创建bean的类,id指定这个Bean的名称,

        (3)借助构造器来注入初始化Bean

  • 相关阅读:
    [解题报告]256 Quirksome Squares
    [解题报告]369 Combinations
    [解题报告]10696 f91
    [解题报告]483 Word Scramble
    [解题报告]10041 Vito's Family
    [解题报告]686 Goldbach's Conjecture (II)
    [解题报告]151 Power Crisis
    [解题报告]10079 Pizza Cutting
    [解题报告]495 Fibonacci Freeze
    [解题报告]541 Error Correction
  • 原文地址:https://www.cnblogs.com/zhilili/p/12737523.html
Copyright © 2011-2022 走看看