@Configuration和@Component区别
@Configuration详解
⼀、@Configuration
@Target({})
@Retention(E)
@Documented
@Component
public@interfaceConfiguration{
@AliasFor(
annotation=
)
Stringvalue()default"";
}
可以看到在@Configuration注解中是包含@Component注解的,被@Configuration修饰的类被定义为⼀个Spring容器(应⽤上下⽂)
@Configuration就相当于Spring配置⽂件中的
⼆、@Bean
@Bean相当于Spring配置⽂件中的
@Configuration
publicclassTestConfiguration{
@Bean
publicTestBeantestBean(){
returnnewTestBean();
}
}
上述代码相当于实例化⼀个TestBean并交给Spring容器管理
ps:
1、@Bean注解在返回实例的⽅法上,如果未通过@Bean指定bean的名称,则默认与⽅法名相同
2、@Bean注解默认作⽤域为单例singleton作⽤域,可通过@Scope(“prototype”)设置为多例
三、依赖注⼊
@Configuration
publicclassTestConfiguration{
@Bean
publicTestBeantestBean(){
returnnewTestBean();
}
@Bean
publicDIBeandiBean(){
returnnewDIBean(testBean());
}
}
如上述代码,通过在@Bean⽅法中调⽤其他@Bean注解的⽅法来实现依赖注⼊
ps:
当需要强制指定实例化bean的顺序,可以通过@Order或@DependsOn注解来实现
除此之外我们还能使⽤@Component声明SpringBean
@Configuration和@Component区别
publicclassCar{
privateintid;
privateStringname;
publicintgetId(){
returnid;
}
publicvoidtId(intid){
=id;
}
publicStringgetName(){
returnname;
}
publicvoidtName(Stringname){
=name;
}
}
publicclassDriver{
privateintid;
privateStringname;
privateCarcar;
publicintgetId(){
returnid;
}
publicvoidtId(intid){
=id;
}
publicStringgetName(){
returnname;
}
publicvoidtName(Stringname){
=name;
}
publicCargetCar(){
returncar;
}
publicvoidtCar(Carcar){
=car;
}
}
;
uration;
@Configuration
publicclassMyTestConfig{
@Bean
publicDriverdriver(){
Driverdriver=newDriver();
(1);
e("driver");
(car());
returndriver;
}
@Bean
publicCarcar(){
Carcar=newCar();
(1);
e("car");
returncar;
}
}
;
uration;
@Component
publicclassMyTestConfig{
@Bean
publicDriverdriver(){
Driverdriver=newDriver();
(1);
e("driver");
(car());
returndriver;
}
@Bean
publicCarcar(){
Carcar=newCar();
(1);
e("car");
returncar;
}
}
上⾯两段代码除MyTestConfig类上的注解不同之外其他都相同,但Spring对两者的处理⽅式是完全不⼀样的。
第⼀段代码会像我们期望的⼀样正常运⾏,因为driver()这段代码中(car())⽅法会由Spring代理执⾏,
Spring发现⽅法所请求的Bean已经在容器中,那么就直接返回容器中的Bean。所以全局只有⼀个Car对象的实例。
第⼆段代码在执⾏driver()时(car())不会被Spring代理,会直接调⽤car()⽅法获取⼀个全新的Car对象实例,所以全局会有
多个Car对象的实例
造成这种差异的原因如下:
概括就是@Configuration中所有带@Bean注解的⽅法都会被动态代理,因此调⽤该⽅法返回的都是同⼀个实例。
其⼯作原理是:如果⽅式是⾸次被调⽤那么原始的⽅法体会被执⾏并且结果对象会被注册到Spring上下⽂中,之后所有的对该⽅法的调⽤仅
仅只是从Spring上下⽂中取回该对象返回给调⽤者。
在上⾯的第⼆段代码中,(car())只是纯JAVA⽅式的调⽤,多次调⽤该⽅法返回的是不同的对象实例。
要修正第⼆段代码中的问题,可以使⽤@Autowired如下所⽰:
red;
;
uration;
ent;
//@Configuration
@Component
publicclassMyTestConfig2{
@Autowired
Carcar;
@Bean
publicDriverdriver(){
Driverdriver=newDriver();
(1);
e("driver");
(car);
returndriver;
}
@Bean
publicCarcar(){
Carcar=newCar();
(1);
e("car");
returncar;
}
}
验证
ationContext;
tionConfigApplicationContext;
publicclassTestMain{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//@Configuration注解的spring容器加载⽅式,⽤AnnotationConfigApplicationContext替换ClassPathXmlApplicationContext
ApplicationContextcontext=newAnnotationConfigApplicationContext();
//获取bean
Driverdriver=(Driver)n("driver");
//获取bean
Carcar=(Car)n("car");
booleanresult=()==car;
n(result?"同⼀个car":"不同的car");
}
}
本文发布于:2022-11-22 17:23:35,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/502.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |