发表于: 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的三种方法,如果把这三种方法混合使用的话,还可以有很多种方法
评论