Spring中@Bean的使用
一、@Bean和@Component的区别
- 最直观的是位置上的区别,@Component写在类的上面,而@Bean一般一个配置类的方法上
- @Component无法干预实例化过程,因为它只调用类的默认构造器即无参构造器,一旦某个类有多个有参构造器就会无法处理。这时使用@Bean可以随意调用任意一个构造器
- @Bean实例化bean可以声明参数,并且spring也会帮助我们装配这个类。
当然不结合例子上诉的这些区别或者说有点并不能直观地感受到
二、@Bean使用实例
我们就举最简单的例子,两个类Cat、Dog。
Dog:
在Dog中添加成员Cat cat,生成参数为Cat类型的构造器,并调用Cat的方法方便我们判断结果
public class Dog {
Cat cat;
public Dog(Cat cat) { //构造器
this.cat = cat;
cat.toCat(); //如果正确的话那么在调用Dog的构造器后会执行Cat类的方法,打印Cat的类信息
}
}
Cat:
通过@Component将其配置成一个bean。
@Component
public class Cat {
public void toCat() {
System.out.println("Cat类:" + this.getClass());
}
}
配置类Config:
(@Configuration注解) 通过@Bean的方法实例化Dog。
@Configuration
public class Config {
@Bean
public Dog dog(Cat cat) {
Dog dog = new Dog(cat);
return dog;
}
}
在Config
里配置bean,另外需要注意如果使用@Bean那么就不必使用@Component了,所以上面的Dog没有任何注解。当然Cat类也可以使用@Bean。
Test
:在测试类里进行测试
@SpringBootTest
class JavabaseApplicationTests {
@Autowired
Dog dog; //自动装配
@Test
void contextLoads() {
System.out.println(dog); //打印实例化结果,
}
}
运行结果:
可以看到Cat的类信息被打印出来了,dog对象的信息也打印了。
补充一点: 如果有多个@Bean方法,在我们注入类的时候会以先类型后名字的方式去决定调用哪一个方法
例如,在配置类里,我们声明了两个调用了不同构造器或者不同具体操作的@Bean方法
@Configuration
public class Config {
@Bean
public Dog dog1(Cat cat) { //方便起见随意命名
Dog dog = new Dog(cat);
return dog;
}
@Bean
public Dog dog2( {
return new Dog;
}
}
在调用时比如@Autowired Dog dog
,这是肯定会报错,因为根据类型他回找到两个知道到底要调用哪一个。所以如果@Autowired Dog dog1
像这样,spring会根据名字的匹配在两个中选取出一个能够匹配的。
由于本人也学艺不精该博客仅作为学习笔记,文中有很多不恰当或者错误的用词,但大体意思应该不受影响,还请谅解。