spring实战读书笔记 :装配Bean

一、自动化装配

1、创建bean

①、定义一个接口

public interface CompactDisc {
    void play();
}

②、实现类

@Component
public class SgtPappers implements CompactDisc {
    private String title = "Sgt.Papper's"; 
    private String artist = "The beatles";
    @Override
    public void play() {
        System.out.println("Playiing" + title + "by" + artist);
    }
}

SgtPappers上@Component注解表示该类为组建类,告诉spring要为这个类创建bean。

③、配置扫描

@Configuration  //表明配置类
@ComponentScan  //扫描所在包及其子包的带有@Component注解的类
public class CDPlayrConfig {
}

当然也可以通过xml开启扫描:

结构:
spring实战读书笔记 :装配Bean_第1张图片
注意@ComponentScan 默认扫描所在包及其子包,所以把CDPlayrConfig放在了
BeanConfig目录下。

④、测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayrConfig.class)  //加载配置
public class CDPlayTest {
    @Autowired
    private  CompactDisc compactDisc;

    @Test
    public void cdShouldNotBeNull() {
        compactDisc.play();
    }
}

2、为组件扫描的bean命名

spring会为每一个bean一个ID,默认是将类名的第一字母小写。如果需要设置ID,只需要 @Component(“ID名”)

3、设置扫描扫描组建包

我们上述例子中将配置类放在了目录最外层,因为 @ComponentScan 默认扫描所在包及其子包,但是我们需要扫描其他包怎么办呢。
①、直接添加包名 @ComponentScan(“com.BeanConfig”)
② 、basePackages属性,可以为复数 。
@ComponentScan(basePackages = “com.BeanConfig”) 或
@ComponentScan(basePackages = {“Classes”,“interfaceS”})
③、basePackageClasses 属性同样可为复数。@ComponentScan(basePackageClasses = {SgtPappers.class})。
会默认将这些类所在包作为扫描基础包。
针对第三种方式,我们可以建立一个空标记接口,用来告知扫描包,这样可以对以后的代码重构友好。

4、自动装配

在满足依赖的过程中,在spring应用上下文中寻找某个bean需求的其他bean。可以使用 @Autowired注解
①、在构造器上添加@Autowired。
②、在setter方法添加
③、可以在类的任何方法上。

@Component
public class CDplayer implements MediaPlayer {
    private CompactDisc compactDisc;

    //当创建CDplayer bean的时候,通过构造器进行实例化,
    // 并传入一个可设置为CompactDisc类型的bean
    
   /* @Autowired  
    public CDplayer(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }*/

    @Override
    public void play() {
        compactDisc.play();
    }

   //初始化bean时,spring会尽可能满足bean的依赖。通过带有@Autowired的注解声明依赖,
    //即SetCompactDisc()
    @Autowired
    public void SetCompactDisc(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }
}

二、Java代码装配bean

1、@bean

@Configuration  //声明配置类
public class CDplayerJavaConfig implements MediaPlayer {
    private CompactDisc compactDisc;


    @Override
    public void play() {
        compactDisc.play();
    }

    @Bean(name="cDplayer")  //默认为方法名,可以通过name属性给bean命名
    public CDplayerJavaConfig cDplayerJavaConfig() {
        return new CDplayerJavaConfig(sgtPappers());
    }

    @Bean
    public CompactDisc sgtPappers() {
        return new SgtPappers();
    }

    public CDplayerJavaConfig(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }

    //必须要有默认构造参数
    public CDplayerJavaConfig() {
    }
}

@bean注解告诉Spring这个方法会返回一个对象,该对象要注册为Spring上下文中的bean
2、测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDplayerJavaConfig.class)
public class JavaConfigTest {
    // @Configuration注解的spring容器加载方式,用AnnotationConfigApplicationContext
    ApplicationContext context = new AnnotationConfigApplicationContext(CDplayerJavaConfig.class);

    @Test
    public void cdShouldNotBeNull() {
        CDplayerJavaConfig cDplayerJavaConfig = (CDplayerJavaConfig) context.getBean("cDplayer");
        cDplayerJavaConfig.play();
    }
}

三、 JavaConfig组合XML配置

1、将两个JavaConfig组合起来

将sgtPappers()方法从CDplayerJavaConfig中移除。

    @Configuration  //声明配置类
    @Import(CDconfig.class)
    public class CDplayerJavaConfig implements MediaPlayer {
    
        private CompactDisc compactDisc;
    
    
        @Override
        public void play() {
            compactDisc.play();
        }
   /* @Bean(name="cDplayer")  //默认为方法名,可以通过name属性给bean命名
    public CDplayerJavaConfig cDplayerJavaConfig() {
        return new CDplayerJavaConfig(sgtPappers());
    }*/

    /*@Bean
    public CompactDisc sgtPappers() {
        return new SgtPappers();
    }*/

    @Bean(name="cDplayer")  //默认为方法名,可以通过name属性给bean命名
    public CDplayerJavaConfig cDplayerJavaConfig(CompactDisc compactDisc) {
        return new CDplayerJavaConfig(compactDisc);
    }

    public CDplayerJavaConfig(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }

    //必须要有默认构造参数
    public CDplayerJavaConfig() {
    }
}

新建一个CDconfig

@Configuration
public class CDconfig {
    @Bean
    public CompactDisc sgtPappers() {
        return new SgtPappers();
    }
}

如上例所示,通过@Import(CDconfig.class)将CDconfig配置导入到CDplayerJavaConfig中。
还可以创建一个更高级别的config,使用Import({config1.class,config2.class})将多个配置类组合在一起。

2、在JavaConfig 中引用XML配置

假设compactDisc通过XML来配置在cd-config.xml中,我们可以使用 @ImportResouse注解

@Configuration
@Import(CDplayerJavaConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {
}

3、在xml中引用JavaConfig

<?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:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="cdpalyer" class="com.BeanConfig.Classes.CDplayer" c:compactDisc-ref="compactDisc">
    </bean>
    
    <!--javaConfig-->
    <bean class="com.BeanConfig.Classes.CDconfig"/>
</beans>

同样,我们也可以创建顶级的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--javaConfig-->
    <bean class="com.BeanConfig.Classes.CDconfig"/>
    <!--引用xml文件-->
    <import resource="cdpalyer-config.xml" />
</beans>

你可能感兴趣的:(spring,读书笔记)