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

  • 相关阅读:
    织梦开发——相关阅读likeart应用
    织梦标签教程
    织梦专题调用代码
    HIT 2543 Stone IV
    POJ 3680 Intervals
    HIT 2739 The Chinese Postman Problem
    POJ 1273 Drainage Ditches
    POJ 2455 Secret Milking Machine
    SPOJ 371 Boxes
    HIT 2715 Matrix3
  • 原文地址:https://www.cnblogs.com/zhilili/p/12737523.html
Copyright © 2011-2022 走看看