这周开始对SpringBoot2源码的学习呢,突发奇想,要记录一下自己的学习经历,下面是对@Configuration注解的说明
@Configuration注解说明
@Configuration作用:表明一个类中声明一个和多个@Bean标记的方法,并且这些方法被Spring容器管理用于生成Bean定义以及在运行时这些Bean的服务请求。
简单来说,就是将@Configuration下的类和@Bean下的方法当作组件,将这些组件放入Spring容器中,并随着项目启动时启动。
当然,这时我们有必要介绍一下spring在xml文件下的写法和SpringBoot2中的写法:
spring中在xml文件中的的写法:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmls="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org">
<bean id="user" class="com.example.user">
<property name="name" value="菜菜"></property>
</bean>
</beans>
SpringBoot2使用注解的写法:
@Configuration
public class HelloConfig {
//@Bean注解中加上自定义的名字用来修改此组件名
@Bean
public User getUser(){
return new User("菜菜");
}
}
单实例
首先介绍一下什么是单实例和多实例:即Spring容器创建该组件时是创建一个还是多个对象。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(
annotation = Component.class
)
String value() default "";
boolean proxyBeanMethods() default true;
}
上面讲了SpringBoot2创建组件的方法,但@Configuration源码(如上)中还有一个默认返回为true的方法 proxyBeanMethods()
该方法是为了告诉Spring容器此组件是单实例还是多实例,我们可以来验证一下,验证代码如下,在SpringBoot启动类中执行:
ConfigurableApplicationContext run = SpringApplication.run(SpringbootYuanmaApplication.class, args);
//获取Bean对象
User userOne_1 = run.getBean("userOne",User.class);
User userOne_2 = run.getBean("userOne", User.class);
//判断对象是否相同
boolean b=userOne_1==userOne_2;
System.out.println("两组件是否相同:"+b);
运行结果如下:
由此可见,当不做对@Configuration做任何配置时,Spring容器是单实例的。
@Configuration(proxyBeanMethods = true)为代理对象调用方法,SpringBoot总会检查这个组件,并保持此组件单实例
多实例
@Configuration注解改成@Configuration(proxyBeanMethods = false)即可将此类中的组件改为多实例。
经过对单实例的介绍,我觉得多实例应该不成问题了,在此就简单总结一下单实例与多实例。
proxyBeanMethods = true | 单实例 | 调用时会去容器中找组件 |
proxyBeanMethods = false | 多实例 | 不会保留代理模式,每次调用会产生新的对象 |
全配置Full(proxyBeanMethods = true)和轻量级配置Lite(proxyBeanMethods = false)
Full配置,可以很好的处理组件依赖,组件依赖就是一个组件中引用了另一个组件
Lite配置,SpringBoot不会去检查容器中是否有此组件,启动就会非常快、
第二次写文章