美文网首页JAVA_Spring
Spring组件扫描与装配问题

Spring组件扫描与装配问题

作者: kason_zhang | 来源:发表于2017-05-30 17:18 被阅读70次

    1 Spring组件扫描:

    1,XML配置文件启用组件扫描,通过注解配置扫描base-package包下的所有bean

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="org.example"/>
    </beans>
    

    2,通过Java class
    通过类进行启用扫描

    //只不过它使用了@ComponentScan注解,这个注解能够在Spring中启用组件扫描
    
    //如果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包
    @Configuration
    @ComponentScan(basePackages = "com.kason.soundsystem")
    public class CDPlayerConfig {
    
    }
    

    默认情况下@ComponentScan是不需要填参数的,那么它的意思是扫描你写的这个Config类所在的包下的所有组件。同时呢可以使用basePackages指定要扫描的包。还有一种就是指定具体的类,比如:、

    package com.kason.config;
    
    import com.kason.soundsystem.CompactDisc;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * Created by IBM on 2017/5/29.
     */
    //只不过它使用了@ComponentScan注解,这个注解能够在Spring中启用组件扫描
    
    //如果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包
    @Configuration
    @ComponentScan(basePackageClasses = {CompactDisc.class})
    public class CDPlayerConfig {
    
    }
    
    

    如果需要指定多个包或者多个class可以使用{}将其括起来。

    2 装配Bean

    2.1 给Bean添加注解实现自动装配

    前面我们看到了我们配置了让Spring去实现扫描,现在则需要实现装配,这样才能实现DI
    简单来说,自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在
    Spring应用上下文中寻找匹配某个bean需求的其他bean。这里我们可以使用@Autowired注解

    使用@Autowired会有一个问题,那就是当有多个bean都满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配

    2.2 通过Java代码装配Bean

    尽管在很多场景下通过组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但
    有时候自动化配置的方案行不通,因此需要明确配置Spring。比如说,你想要将第三方库中的
    组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和
    @Autowired注解的,因此就不能使用自动化装配的方案了。在这种情况下,你必须要采用显式装配的方式。

    在进行显式配置的时候,有两种可选方案:
    Java和XML

    2.2.1 JAVA显示装配Bean

    在进行显式配置时,JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好。因为它就是Java代码,就像应用程序中的其他Java代码一样JavaConfig是配置代码。这意味着它不应该包含任何业务逻辑,JavaConfig也不应该侵入到业务逻辑代码之中。尽管不是必须的,但通常会将JavaConfig放到单独的包中,使它与其他的应用程序逻辑分离开来,这样对于它的意图就不会产生困惑了。
    步骤:

    • 创建配置类
      @Configuration
      public class CDPlayerConfig {

    }
    创建JavaConfig类的关键在于为其添加@Configuration注解,@Configuration注解表明这个类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。
    到此为止,我们都是依赖组件扫描来发现Spring应该创建的bean。尽管我们可以同时使用组件扫描和显式配置,但是在本节中,我们更加关注于显式配置,因此我将CDPlayerConfig的@ComponentScan注解移除掉了。

    • 声明简单的Bean
      要在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean注解
    @Bean
        public CompactDisc sgtPeppers(){
            return new SgtPeppers();
        }
    

    @Bean注解会告诉Spring这个方法将会返回一个对象,该对象是一个要注册为Spring应用上下文中的bean。
    默认情况下,bean的ID与带有@Bean注解的方法名是一样的。在本例中,bean的名字将会是sgtPeppers。如果你想为其设置成一个不同的名字的话,那么可以重命名该方法,也可以通过name属性指定一个不同的名字:

     @Bean(name = "sgtPeppers_another")
        public CompactDisc sgtPeppers(){
            return new SgtPeppers();
        }
    

    关于装配Bean的建议:
    建议尽可能使用自动化配置,以避免显式配置所带来的维护成本。但是,如果你确实需要显式配置Spring的话,应该优先选择基于Java的配置,它比基于XML的配置更加强大、类型安全并且易于重构。

    相关文章

      网友评论

        本文标题:Spring组件扫描与装配问题

        本文链接:https://www.haomeiwen.com/subject/xeklfxtx.html