Python 官方文档:入门教程 => 点击学习
目录1.@Configuration注解2.@bean注解3.单实例4.配置类也是容器的组件5.直接调用配置类里面的person1()方法6.proxyBeanMethods&mda
用法:作用在类上面 作用:告诉SpringBoot这是一个配置类,相当于spring中的xml配置文件。
@Configuration //告诉SpringBoot这是一个配置类 == 配置文件
public class Config {
}
用法:配置类里面使用@Bean标注在方法上给ioc容器注册组件,默认也是单实例的 作用:给容器中添加组件,相当于Spring中xml配置文件中的<bean>标签。 理解:以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
@Configuration //告诉SpringBoot这是一个配置类 == 配置文件
public class Config {
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public Person person1(){
return new Person("Mr.Yu",21,"male");
}
@Bean("customize") //id值也可以指定
public Person person2(){
return new Person("小明",20,"male");
}
}
在主程序类中打印输出我们IoC容器中的对象,看看我们的person1
和customize
有没有添加到容器中
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1.返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2.查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
输出结果:
可以看到输出结果中有我们存放进IoC容器的两个对象
@Bean注解存入到IoC容器中的实例也是单实例的
public static void main(String[] args) {
//1.返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2.查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//单实例
Person person1 = run.getBean("person1",Person.class);
Person person2 = run.getBean("person1",Person.class);
System.out.println("person1 == person2 :"+ (person1 == person2));
}
输出结果:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1.返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2.查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//配置类本身也是组件
Config bean = run.getBean(Config.class);
//com.ysw.boot.config.Config$$EnhancerBySprinGCGLIB$$4aa44992@381d7219
System.out.println(bean);
}
}
输出结果:
com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
如果我们直接调用配置类里面的person1()
方法会发生什么情况,它是从IoC容器中拿还是直接new一个对象呢
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1.返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2.查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
//配置类本身也是组件
Config bean = run.getBean(Config.class);
//获取到的本身就是代理对象
//com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
System.out.println(bean);
//如果我们直接调用person1方法,它是从IoC容器中拿还是直接new一个对象呢,
//在new一个配置类出来的情况下,调用person1方法,它返回的是new出来的对象
Config config = new Config();
Person person3 = config.person1();
Person person4 = config.person1();
System.out.println("person3 == person4 :"+ (person3 == person4));
//但是如果我们从容器中取得的配置类,无论再去掉用多少次person1方法,它始终返回的都是同一个单实例对象,也就是从IoC容器中拿的对象。
//如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有;
//保持组件单实例
Person person5 = bean.person1();
Person person6 = bean.person1();
System.out.println("person5 == person6 :"+ (person5 == person6));
}
}
输出结果:
从容器中获取到的配置类对象输出结果:
com.ysw.boot.config.Config$$EnhancerBySpringCGLIB$$4aa44992@381d7219
在上述的输出结果中我们可以看到从容器中获取到的配置类对象本身就是一个被SpringCGLIB增强了的代理对象
@Configuration()
默认设置的是proxyBeanMethods = true
。@Configuration(proxyBeanMethods = true)
,就是代理对象调用方法。SpringBoot总会检查这个组件是否在容器中已有,调用配置类中的方法时会返回容器中已有的组件(即IoC容器中已存在的对象)。@Configuration(proxyBeanMethods = false)
,就不是代理对象调用方法,SpringBoot不会检查这个组件是否在容器中已有,调用配置类中的方法时会返回新对象。@Configuration(proxyBeanMethods = false)
举例: 把上述5中的@Configuration()
改为@Configuration(proxyBeanMethods = false)
输出结果为:
总结:
到此这篇关于SpringBoot配置@Configuration注解和@bean注解的文章就介绍到这了,更多相关SpringBoot配置内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: SpringBoot配置@Configuration注解和@bean注解
本文链接: https://www.lsjlt.com/news/147313.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0