底层注解 - @Configuration详解
文章目录
以前的时候我们是如何给容器中添加组件的?
以前的时候我们向容器添加组件的时候会是创建一个spring.xml配置文件, 然后在配置文件中使用bean标签来完成对组件的创建
那么现在使用Springboot我们如何来向容器中添加一个组件?
package com.ffyc.boot.config;
import com.ffyc.boot.bean.Pet;
import com.ffyc.boot.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //告诉Spring这是一个配置类 --> 相当于是一个配置文件
public class MyConfig {
@Bean //给容器中添加组件, 方法名就是组件名
public User user01() {
return new User("猪猪人");
}
@Bean
public Pet tomcatPet() {
return new Pet("tomcat");
}
}
@Bean注解修饰的方法的方法名最终会作为组件名 —> 默认是单实例的(和spring默认一样)
这里的配置类肯定也是要被创建对象放到容器中的 —> 由于我的ctrl + f用不了, 直接点搜索页不行, 所以这里就不截屏了
proxyBeanMethods:代理bean的方法
- Full(proxyBeanMethods = true) : 保证每个@Bean方法被调用多少次返回的组件都是单实例的
- Lite(proxyBeanMethods = false) : 每个@Bean方法被调用多少次返回的组件都是新创建的
@Configuration(proxyBeanMethods = false) //告诉Spring这是一个配置类 --> 相当于是一个配置文件
public class MyConfig {
@Bean //给容器中添加组件, 方法名就是组件名
public User user01() {
return new User("猪猪人");
}
@Bean
public Pet tomcatPet() {
return new Pet("tomcat");
}
}
- 默认proxyBeanMethods的值为true
这是Springboot2的一个新特性, 让配置类可以编写轻量级模式(Lite)和全模式(Full), 那么这两个模式要如何使用?
- 配置类组件之间无依赖关系的时候用Lite模式加速容器启动过程, 减少判断
- 如果使用Lite模式, 那么配置类在容器中的对象就是自己真实的对象, 所以调用方法比较快
- 配置类组件之间有依赖关系, 方法会被调用得到之前的单实例组件(也就是容器中的组件), 使用Full模式
- 如果使用Full模式, 那么配置类在容器中的对象其实是一个代理对象, 通过AOP进行了功能增强, 具体就是在返回对象之前判断spring容器中是否有该对象, 如果有, 直接返回Spring容器中的该组件即可 —> 所以这种方式就适合于组件依赖的场景
当然, 我们在SpringMVC中使用的给容器中添加组件的几种注解当然也是可以使用的:
- @Controller
- @Service
- @Repository
- @Component