### 组件添加 1、@Configuration ● 基本使用 ● Full模式与Lite模式 ○ 示例 ○ 最佳实战 ■ 配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断 ■ 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式 ### 新建一个bean: ```bash package com.maxiaoke.boot.bean; public class User { private String name; private Integer age; public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` ### 添加配置类 ```bash package com.maxiaoke.boot.config; import com.maxiaoke.boot.bean.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) // 告诉SpringBoot,这是一个配置类 public class MyConfig { @Bean("tom") //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例 public User user01() { User zhangsan = new User("zhangsan", 18); return zhangsan; } } ``` ### 测试 修改MainApplication启动类: ```bash package com.maxiaoke.boot; import com.maxiaoke.boot.bean.User; import com.maxiaoke.boot.config.MyConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan("com.maxiaoke.boot") 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); } //3、从容器中获取组件 User tom01 = run.getBean("tom", User.class); User tom02 = run.getBean("tom", User.class); System.out.println("组件:"+(tom01 == tom02)); //4、com.maxiaoke.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892 MyConfig bean = run.getBean(MyConfig.class); System.out.println(bean); //如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。 //保持组件单实例 User user = bean.user01(); User user1 = bean.user01(); System.out.println(user == user1); } } ``` 查看控制台输出: ![](https://img.kancloud.cn/5d/94/5d945f893f1d3bbad0643e11319e7028_1076x559.png =1000x) ### 配置类说明 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的 2、配置类本身也是组件 3、proxyBeanMethods:代理bean的方法 * Full(proxyBeanMethods=true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】 * Lite(proxyBeanMethods=false)【每个@Bean方法被调用多少次返回的组件都是新创建的】 * 组件依赖必须使用Full模式默认。其他默认是否Lite模式