springboot开发日记(3)——@Configuration注解
@Configuration注解——告诉springboot该文件是一个配置类,等同于配置文件。
public static void main(String[] args) {
//返回ioc容器
ConfigurableApplicationContext run= SpringApplication.run(MainApplication.class,args);
//查看容器里面的组件并输出组件名字
String[] names=run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
通过以上的main函数获得ioc容器并输出容器中组件的名字。
在MyConfig.java文件中使用@Configuration和@Bean注解进行组件的添加
public class MyConfig {
@Bean//给容器中添加组件,以方法名作为组件的id。返回类型就是组件类型。返回的值就是组件在容器中的实例
public User user01(){
return new User("zhangsan",18);
}
@Bean("Tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
此时运行main函数即可在组件列表里找到名为user01和Tom的组件
注意:如果没有像第二个实例中在bean注解后面进行命名,那个组件的名字默认为方法名,以第二个实例为例就是tomcatPet。
注意:在被@Configuration注解的类中所有带有@Bean注解的方法都会被cglib动态代理
上面两个bean实例都是单例模式,在main函数中加入以下语句:
//从容器中获取组件
Pet tom01=run.getBean("Tom", Pet.class);
Pet tom02=run.getBean("Tom", Pet.class);
System.out.println("组件1和组件2是否一致:"+(tom01==tom02));
最后结果为true,说明Tom这个实例是单例模式。可以看出,在配置类中使用bean注解在容器中注册的实例默认都是单实例的。
注意:配置类也是容器中的一个组件,也可以用getBean方法获取到,在main函数中添加以下代码:
MyConfig bean=run.getBean(MyConfig.class);
System.out.println(bean);
会发现输出了一行带有MyConfig的字符串,证明MyConfig也作为一个组件存在于ioc容器当中。
@Configuration中有一个属性名为proxyBeanMethods
这个属性为——决定代理bean的方法:
proxyBeanMethods = true时,代表每次调用bean注解下的注册方法都是之前注册到容器中的单实例,同时springboot总会检查该组件是否在容器中存在。如果存在,即每次调用同一个注册方法得到的实例都是同一个。如果不存在,则会新建一个。总而言之,此属性为true会保持组件的单实例。
proxyBeanMethods = false时,代表每次调用bean注解下的注册方法都是重新创建的,相当于每调用一次就会执行一次构建代码,是与上一次获取的实例不同的。但是运行速度会快于全配置模式。
该属性会引出一个springboot对于@Configuration的两个底层配置——full(全配置)、lite(轻量级配置)。
该属性用来解决组件依赖问题。
例如:在上面User对象中如果添加一个Pet属性,那么在容器中的User组件实例化时就会调用同样在容器中的Pet组件。代码如下:
public User user01(){
User zhangsan= new User("zhangsan",18);
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("Tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
只有当@Configuration(proxyBeanMethods = true时,user01中的Pet就与tomcatPet是一样的,称为user01组件依赖了tomcatPet组件。
一般只有上述这种情况发生时才会令@Configuration(proxyBeanMethods = true,其余时候都应令@Configuration(proxyBeanMethods = false。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~