首先介绍两个注解@Configuration、@Bean:
@Configuration:指明Ioc容器可以从当前的类中去获取bean。
@Bean:返回一个对象,该对象将会被注册到bean中。
通俗易懂的来讲呢,就是@Configuration去告诉Spring容器,你可以从被我注释的类里面去找被@bean注释的方法,然后从这个方法中去获取一个bean放到注册器中注册。
举个栗子:
第一个
盖子
@Data
public class Lid {
private String name;
public Lid() {
System.out.println("创建了一个盖子");
}
}
水杯
public class Cup {
private Lid lid;
public Cup(Lid lid) {
System.out.println("我是杯子");
this.lid = lid;
}
public void lib(){
System.out.println("我是杯子函数中的lib");
}
}
水杯的配置
@Configuration
public class CupConfig {
@Bean
public Cup cup(){
return new Cup(lid());
}
@Bean
public Lid lid(){
return new Lid();
}
}
测试类
ApplicationContext context1 =
new AnnotationConfigApplicationContext(CupConfig.class);
Cup cup = context1.getBean(Cup.class);
cup.lib();
注意看,我们是在 AnnotationConfigApplicationContext(CupConfig.class);中直接去注入了杯子的配置类,所以现在在Ioc容器中已经帮我们创建好了一个Cup对象和一个Lib对象,我们直接拿来用就行。(拿来把你!)
经过测试,确实是一个对象,都是从Spring容器中获取到的。
Cup cup = context1.getBean(Cup.class);
Lid lid = context1.getBean(Lid.class);
System.out.println(lid == cup.getLid());
第二个
那么当我们有多个配置类的时候,我们该如何去解决呢?
啊,问得好!
通过看参数类型我们可以看到, 这里面是可以传多个参数的,因此我们就有了以下的写法。
当然!如果你觉得看起来很不舒服,那我们还可以把参数提出来嘛。
第三个
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext();
context.register(ConfigA.class);
context.register(ConfigB.class);
context.refresh();
通过context手动去注册配置类,然后再调用refresh()方法刷新一下即可。
补充一个注解@Import
你可以在一个配置类中去声明加载别的配置类,从而使你的代码看起来更加简洁和逻辑性(强调了这个类可能依附于哪个类)。
@Configuration
@Import(ConfigA.class)
public class ConfigB {
@Bean
public B b(){
return new B();
}
}
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext();
context.register(ConfigB.class);
context.refresh();
A a = context.getBean(A.class);
B b = context.getBean(B.class);
这里只声明了注册了配置类B,而没有注册配置类A,但A也被成功注册!