1.包结构

2.主程序类

 1 /**
2 * 主程序类
3 * @SpringBootApplication:这是一个springboot应用
4 *
5 * @SpringBootApplication
6 *
7 * 等同于下面的三个包
8 * @SpringBootConfiguration
9 * @EnableAutoConfiguration
10 * @ComponentScan(com.atguigu.boot) ---->默认组件扫描基础包是主程序类MainApplication所在包及其子包
11 *
12 *
13 */
14 @SpringBootApplication(scanBasePackages={"com.atguigu"})
15 public class MainApplication {
16 public static void main(String[] args) {
17 //1.返回IOC容器
18 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
19 //2.获取容器内所有组件的名称
20 String[] names = run.getBeanDefinitionNames();
21 for (String name : names) {
22 System.out.println(name);
23 }
24
25 //3.从容器中获取指定组件
26 User user01 = run.getBean("user01", User.class);
27 User user02 = run.getBean("user01", User.class);
28 System.out.println("使用同一个组件id,多次获取组件,是否是同一个组件实例:" + (user01 == user02));
29
30 //配置类本身也是组件
31 Myconfig myConfig = run.getBean(Myconfig.class);
32 Myconfig myConfig2 = run.getBean(Myconfig.class);
33 System.out.println(myConfig == myConfig2);
34
35 //4. 配置类默认情况下是@Configuration(proxyBeanMethods = true),代表配置类此时不是一个普通的类
36 //可以把它理解为代理bean,此时打印结果是 com.atguigu.boot.config.Myconfig$$EnhancerBySpringCGLIB$$a3f7b687@5b5caf08
37 //如果配置类上@Configuration(proxyBeanMethods = false),此时配置类就是一个普通类
38 //此时打印结果:com.atguigu.boot.config.Myconfig@6e28bb87
39 System.out.println(myConfig);
40
41 //5.如果@Configuration(proxyBeanMethods = true) 开启代理bean调用方法
42 //则当配置类对象调用其注册组件方法去获取相应组件时,Springboot总会检查组件是否在容器中
43 //保持组件单实例
44 User user1 = myConfig.user01();
45 User user2 = myConfig.user01();
46 //默认情况下@Configuration(proxyBeanMethods = true),打印结果是 true
47 //如果@Configuration(proxyBeanMethods = false),则打印结果是 false
48 System.out.println("配置类是作为代理bean从容器中获取单例组件呢?还是作为普通类调用方法呢? " + (user1 == user2));
49
50 User user3 = run.getBean("user01", User.class);
51 Pet tomcatPet = run.getBean("tomcatPet", Pet.class);
52 //如果@Configuration(proxyBeanMethods = true),
53 //此时容器中的user01组件依赖容器中的tomcatPet组件,返回 true
54 System.out.println("用户的宠物是否是容器中的那个单实例宠物组件? " + (user3.getPet() == tomcatPet));
55
56 }
57 }

3.bean包下的两个实体类

User

 1 public class User {
2 private String name;
3 private Integer age;
4
5 private Pet pet;
6
7 public User() {
8 }
9
10 public User(String name, Integer age) {
11 this.name = name;
12 this.age = age;
13 }
14
15 public Pet getPet() {
16 return pet;
17 }
18
19 public void setPet(Pet pet) {
20 this.pet = pet;
21 }
22
23 public String getName() {
24 return name;
25 }
26
27 public void setName(String name) {
28 this.name = name;
29 }
30
31 public Integer getAge() {
32 return age;
33 }
34
35 public void setAge(Integer age) {
36 this.age = age;
37 }
38
39 @Override
40 public String toString() {
41 return "User{" +
42 "name='" + name + '\'' +
43 ", age=" + age +
44 ", pet=" + pet +
45 '}';
46 }
47 }

Pet

 1 public class Pet {
2 private String name;
3
4 public Pet() {
5 }
6
7 public Pet(String name) {
8 this.name = name;
9 }
10
11 public String getName() {
12 return name;
13 }
14
15 public void setName(String name) {
16 this.name = name;
17 }
18
19 @Override
20 public String toString() {
21 return "Pet{" +
22 "name='" + name + '\'' +
23 '}';
24 }
25 }

4.config包下的配置类 Myconfig

 1 /**
2 1.配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
3 2.配置类本身也是组件
4 3.proxyBeanMethods:配置类是否作为代理bean来调用方法
5 如果 proxyBeanMethods = true 则是Full模式(重量级模式)
6 ---> 此模式下,配置类作为代理bean来调用方法,springboot都会去容器里面检查有没有这个组件,如果有,就使用容器中的组件,确保单实例,形成组件依赖
7 如果 proxyBeanMethods = false 则是Lite模式(轻量级模式)
8 ---> 此模式下,配置类是作为普通类调用方法,springboot不会去容器里面检查组件,不会形成组件依赖,项目启动运行快
9
10 4.最佳实战
11 配置类组件之间无依赖关系,用Lite模式加速容器启动过程,减少判断
12 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
13 */
14 @Configuration(proxyBeanMethods = false) //告诉Springbooot这是一个配置类
15 public class Myconfig {
16
17 /**
18 * 外部无论对配置类中的组件注册方法调用多少次,获取的都是之前注册在容器中的单实例对象
19 * @return
20 */
21
22 @Bean //给容器中添加组件,默认以方法名作为组件id(组件名)。返回类型就是组件类型,返回值就是组件在容器中的实例
23 public User user01() {
24 User user = new User("zhangsan", 20);
25 //如果@Configuration(proxyBeanMethods = true),
26 // 此时容器中的user01组件依赖容器中的tomcatPet组件
27 user.setPet(cat());
28 return user;
29 }
30
31
32 @Bean("tomcatPet") //此时组件名就是tomcatPet,而不是方法名了
33 public Pet cat() {
34 return new Pet("HelloKitty");
35 }
36 }

springboot注解之@Configuration 和 @Bean的更多相关文章

  1. 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  2. SpringBoot自动装配原理之Configuration以及@Bean注解的使用

    Configuration以及Bean注解的使用 该知识点在Spring中应该学过,没有学过或者遗忘的的朋友需要预习或温习前置知识点.SpringBoot其实就是Spring的进一步简化,所以前置知识 ...

  3. Java框架spring Boot学习笔记(七):@Configuration,@bean注解

    @Configuration作用在类上,相当于一个xml文件 @bean作用于方法上,相当于xml配置中的<bean>标签 一个例子: 新建一个Springboot工程 新建一个User类 ...

  4. Springboot@Configuration和@Bean详解

    Springboot@Configuration和@Bean详解 一.@Configuration @Target({ElementType.TYPE}) @Retention(RetentionPo ...

  5. 14 - springboot的@Configuration、@Bean、@Import()、@ImportResource()、@Conditional说明

    1.@Configuration.@Bean.@Import().@ImportResource().@Conditional 分析源码的时候总会见到标题中的这几个注解,因此:弄一篇博客来说明一下吧, ...

  6. Spring @Configuration 和 @Bean 注解

    @Configuration 和 @Bean 注解 带有 @Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源.@Bean 注解告诉 Spri ...

  7. 【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件

    写在前面 在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对! ...

  8. SpringBoot 注解事务声明式事务

    转载请注明: http://www.cnblogs.com/guozp/articles/7446477.html springboot 对新人来说可能上手比springmvc要快,但是对于各位从sp ...

  9. springboot注解使用说明

    springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...

随机推荐

  1. 一篇文章图文并茂地带你轻松学完 JavaScript 闭包

    JavaScript 闭包 为了更好地理解 JavaScript 闭包,笔者将先从 JavaScript 执行上下文以及 JavaScript 作用域开始写起,如果读者对这方面已经了解了,可以直接跳过 ...

  2. 【cpp上】课后正误小题

    State whether each of the following is true or false. If false, explain why. Assume the state ment u ...

  3. 实战交付一套dubbo微服务到k8s集群(5)之使用Jenkins进行持续构建交付dubo服务的提供者

    1.登录到jenkins,新建一个项目 2.新建流水线 3.设置保留的天数及份数 4.添加第一个参数:设置项目的名称 5.添加第二个参数:docker镜像名称 6.添加第三个参数:项目所在的git中央 ...

  4. Nginx基础 - 配置缓存web服务

    1.缓存配置语法 1)proxy_cache配置语法 Syntax: proxy_cache zone | off; Default: proxy_cache off; Context: http, ...

  5. Java中多线程启动,为什么调用的是start方法,而不是run方法?

    前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...

  6. codeforces 1042C Array Product【构造】

    题目:戳这里 题意:n个数,两种操作,第一种是a[i]*a[j],删掉a[i],第一种是直接删除a[i](只能用一次)剩下的数序列号不变.操作n-1次,使最后剩下的那个数最大化. 解题思路: 正数之间 ...

  7. 操作系统 part2

    一.程序的内存结构 references: newcoder 运行时,程序分为:text段.data段.BSS段(2个合称数据段).堆.栈. text段:代码段,静态分配内存,只读. data段:初始 ...

  8. 一分钟搞懂JavaScript中的JSON对象

    JSON(JavaScript Object Notation)是表示值和对象的通用格式. JavaScript 提供了如下方法: JSON.stringify 将对象转换为 JSON. JSON.p ...

  9. Tailwind CSS in Action

    Tailwind CSS in Action Tailwind CSS是一个高度可定制的低级CSS框架,它为您提供了构建定制设计所需的所有构造块,而无需烦恼要覆盖的烦人的自以为是的样式 https:/ ...

  10. shit api & shit antd

    shit api & shit antd 代码演示 ??? https://ant.design/components/skeleton-cn/ https://github.com/ant- ...