装配bean的概念
spring到底做了啥?
spring容器负责创建应用程序中的bean,并通过di来协调bean相互之间的关系,所以spring提供了三种方式:
1:通过xml显示配置,这种方式在以前的编码中经常用到,但是现在已经渐渐的被第二种方式所取代了,所以本篇文章我们就不讨论这种配置方式了。因为,我也忘了是如何配置的了。
2:在JAVA中显示配置,这是现在常用的一种装配bean的方式,相比于xml她会更加的简洁并且易读。
3:隐式的bean发现机制和自动装配
那现在就让我们先来聊一聊第三种方式,spring自动装配
spring通过两个角度来实现自动化配置
1、组件扫描(component scanning)spring会自动发现应用上下文中的所创建的bean并将他们加载进来。
2、自动装配(autowiring)spring自动满足bean之间的依赖关系。
接下来我们用例子来说明,首先我们先来创建两个东西,一个是游戏机,一个是游戏光盘
/**
* 这是一个游戏光盘的实现
*/
@Component
public class GameDisc implements Disc{
@Override
public void play() {
System.out.println("来一起玩真三国无双吧");
}
}
@Configuration
@ComponentScan
public class DiscConfig {
}
可以看出,我们在GameDisc上加了@Component注解,这个注解的意思就是将这个类声明成一个组件,Spring就可以自动装配这个Bean,我们在DiscConfig上加了一个@ComponentScan注解表示在Spring中开启了组件扫描,就可以扫描到这个GameDisc的Bean了。这就是Spring的自动装配机制。
接下来我们来看看显示的JAVA配置是如何实现的。
现在我们把config上面的@ComponentScan去掉,这样他就不能自动扫描bean了,这个时候再测试的时候就会报出BeanCreationException。这样的话我们就需要自己手动配置这个bean了
@Configuration
public class DiscConfig {
@Bean
public Disc gameDisc(){
return new GameDisc();
}
}
默认状态Spring创建的bean是单例的,也就是说如果这样
@Configuration
public class DiscConfig {
@Bean
public Disc gameDisc(){
return new GameDisc();
}
@Bean
public Disc anotherGameDisc(){
return new GameDisc();
}
}
这种情况如果第一次已经创建了这个bean的话,第二次就不会再创建这个bean了,当然也可以手动调节为多例的。所以一般情况下我们没必要去创建第二个相同的bean。
(tips @Bean可以以任何JAVA的形式去创建bean,构造器和setter等,这里存在的可能性只是受到了java语言的限制)
关于xml的配置方式就不说了,懒得看了。。。。多说一句,一般来说能用自动配置尽量用自动配置,毕竟比较方便,而用到javaconfig主要是因为比如引入了其他的jar,但是它的类上面又没有@Component所以只能自己配置了。
关于Spring装配bean就说这些了。
网友评论