springboot注解之@Configuration和@Bean 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"})
15public class MainApplication {
16public static void main(String[] args) {
17//1.返回IOC容器
18        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
19//2.获取容器内所有组件的名称
20        String[] names = BeanDefinitionNames();
21for (String name : names) {
22            System.out.println(name);
23        }
24
25//3.从容器中获取指定组件
26        User user01 = Bean("user01", User.class);
27        User user02 = Bean("user01", User.class);
28        System.out.println("使⽤同⼀个组件id,多次获取组件,是否是同⼀个组件实例:" + (user01 == user02));
29
30//配置类本⾝也是组件
31        Myconfig myConfig = Bean(Myconfig.class);
32        Myconfig myConfig2 = Bean(Myconfig.class);
33        System.out.println(myConfig == myConfig2);
34
35//4. 配置类默认情况下是@Configuration(proxyBeanMethods = true),代表配置类此时不是⼀个普通的类
36//可以把它理解为代理bean,此时打印结果是 com.fig.Myconfig$$EnhancerBySpringCGLIB$$a3f7b687@5b5caf08
37//如果配置类上@Configuration(proxyBeanMethods = false),此时配置类就是⼀个普通类
38//此时打印结果:com.fig.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 = Bean("user01", User.class);
51        Pet tomcatPet = Bean("tomcatPet", Pet.class);
52//如果@Configuration(proxyBeanMethods = true),
53//此时容器中的user01组件依赖容器中的tomcatPet组件,返回 true
54        System.out.println("⽤户的宠物是否是容器中的那个单实例宠物组件? " + (Pet() == tomcatPet));
55
56    }
57 }
3.bean包下的两个实体类
User
spring ioc注解1public class User {
2private String name;
3private Integer age;
4
5private Pet pet;
6
7public User() {
8    }
9
10public User(String name, Integer age) {
11this.name = name;
12this.age = age;
13    }
14
15public Pet getPet() {
16return pet;
17    }
18
19public void setPet(Pet pet) {
20this.pet = pet;
21    }
22
23public String getName() {
24return name;
25    }
26
27public void setName(String name) {
28this.name = name;
29    }
30
31public Integer getAge() {
32return age;
33    }
34
35public void setAge(Integer age) {
36this.age = age;
37    }
38
39    @Override
40public String toString() {
41return "User{" +
42                "name='" + name + '\'' +
43                ", age=" + age +
44                ", pet=" + pet +
45                '}';
46    }
47 }
Pet
1public class Pet {
2private String name;
3
4public Pet() {
5    }
6
7public Pet(String name) {
8this.name = name;
9    }
10
11public String getName() {
12return name;
13    }
14
15public void setName(String name) {
16this.name = name;
17    }
18
19    @Override
20public String toString() {
21return "Pet{" +
22                "name='" + name + '\'' +
23                '}';
24    }
25 }
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这是⼀个配置类
15public class Myconfig {
16
17/**
18    * 外部⽆论对配置类中的组件注册⽅法调⽤多少次,获取的都是之前注册在容器中的单实例对象
19    * @return
20*/
21
22    @Bean  //给容器中添加组件,默认以⽅法名作为组件id(组件名)。返回类型就是组件类型,返回值就是组件在容器中的实例23public User user01() {
24        User user = new User("zhangsan", 20);
25//如果@Configuration(proxyBeanMethods = true),
26// 此时容器中的user01组件依赖容器中的tomcatPet组件
27        user.setPet(cat());
28return user;
29    }
30
31
32    @Bean("tomcatPet") //此时组件名就是tomcatPet,⽽不是⽅法名了
33public Pet cat() {
34return new Pet("HelloKitty");
35    }
36 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。