发表于: 2017-11-27 22:46:36

1 562


今天完成的事情

又看了一遍spring的DI

发现spring中有三种方法实现注入

1.采用spring的隐式配置方式,自动装配

这种方式直接在Java类上用注解来进行配置

声明bean:

@Component
public class SgtPeppers implements CompactDisc{
   private String title = "1";
   private String artist = "2";
   public void play(){
   System.out.println("Playing" + title + "by" + artist);
   }
}

注解@Component表示将这个类设置为bean

然后需要开启组件扫描才能使用bean,可以专写一个配置类来开启扫描:

@Configuration
@ComponentScan
public class CDPlayerConfig {
}

@Configuration注解表示将这个类设置为配置类,感觉没什么实际作用,@ComponentScan注解用来开启组件扫描,默认扫描和配置类同一个包以及子包中的bean

对于没有依赖关系的bean,这样的配置就够了,而对于有依赖关系的bean,需要设置自动装配:

@Component
public class CDPlayer implements MediaPlayer{
   private CompactDisc cd;
   @Autowired
    public CDPlayer(CompactDisc cd){
    this.cd=cd;
   }
}

@Component注解将CDPlayer类设置为一个bean,这个bean依赖于之前设置的一个bean,其类型为CompactDisc,这里通过构造器注入的方式,将依赖注入,并且需要添加@Autowired注解,这样,在加载类型为CDPlayer的bean时,spring会自动装配其依赖的类型为CompactDisc的bean

为了实现解耦,应该将依赖的CompactDisc设置为接口,当只有一个被注解为bean的实现时,spring会完成自动加载,依赖也就被注入了,如果有多个实现,出现了bean的歧义性的话,就需要设置设置首选bean或是设置限定符

进行测试:

@Autowired
private MediaPlayer player;
@Test
public void play(){
player.play();
}

结果表明确实完成了注入:


2.采用显式的配置方式,有两种,一种式JavaConfig,一种式XML

先采用JavaConfig

在这种方式中,是通过方法来得到相应类型的bean的:

@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}

解@Bean表示通过这个方法返回一个 CompactDisc类型的bean,这里的bean是没有依赖的,如果是有依赖的bean,一般有两种简单的方法:

@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());
}

这里的CDPlayer类型的bean依赖于上面的CompactDisc类型的bean,在方法中实例化的时候,引用创建bean的方法

第二种方法是将依赖对象作为参数传入到创建bean的方法中:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}

同样需要创建一个配置类,用@Configuration注解,其实上面的bean的声明都是写在配置类中的:

@Configuration
public class CDPlayerConfig {
   @Bean
   public CompactDisc sgtPeppers(){
   return new SgtPeppers();
  
@Bean
   public CDPlayer cdPlayer(CompactDisc compactDisc){
   return new CDPlayer(compactDisc);
   }
}

这样其实就已经完成了依赖的注入


3.采用xml的方式配置

在隐式的配置方式中,可以不用@ComponentScan注解,而是在spring的配置文件中通过标签开启:

<context:component-scan base-package="soundsystem"/>

声明bean的方式:

<bean class="soundsystem.SgtPeppers"/>

之前都是用的xml的方式,比较熟悉,不贴了


明天的计划

看复盘资料,再看看spring


遇到的问题



收获

知道了spring中DI的三种方法,如果把这三种方法混合使用的话,还可以有很多种方法



返回列表 返回列表
评论

    分享到