SpringBoot底层注解@Configuration原理剖析

实体类:

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Pat {
    private String name;
    private Integer age;
}

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
    private Pat pat;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

一、普通spring配置文件方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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/schema/beans/spring-beans.xsd">

    <bean id="user01" class="com.itcast.bean.User">
        <property name="name" value="张三"></property>
        <property name="age" value="18"></property>
    </bean>

    <bean id="cat" class="com.itcast.bean.Pat">
        <property name="name" value="小白" ></property>
        <property name="age" value="10" ></property>
    </bean>
</beans>

以上是我们以前在使用spring时的配置文件的方式,现在要用springboot配置类的方式代替上面普通spring配置文件的方式。

二、SpringBoot配置类使用@Configuration注解原理

// 配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
// 配置类本身也是组件
// proxyBeanMethods:代理bean方法, 默认是true
//     full(全配置)  lite(轻量级配置)
//     full(proxyBeanMethods=true),
//     lite(proxyBeanMethods=false)
//     组件依赖
@Configuration(proxyBeanMethods = true) // 这是一个配置类 == 配置文件
public class MyConfig {

    /**
     * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
     *
     * @return
     */
    @Bean // 给容器中添加组件,以方法名作为组件的ID, 返回类型就是组件类型,返回的值就是组件在容器中的实例
    public User user01() {
        User lisi = new User("lisi", 18);
        // User组件依赖类Pat组件
        lisi.setPat(huahua());
        return lisi;
    }

    @Bean("jiangziya")
    public Pat huahua() {
        return new Pat("花花", 10);
    }
}

SpringBoot启动类

@SpringBootApplication
public class BootApplication {
    public static void main(String[] args) {
        // 返回ioc容器
        ConfigurableApplicationContext run = SpringApplication.run(BootApplication.class, args);
        // 查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        // 3.从容器中获取组件
        Pat jiangziya1 = run.getBean("jiangziya", Pat.class);
        Pat jiangziya2 = run.getBean("jiangziya", Pat.class);
        // 4。com.itcast.config.MyConfig$$EnhancerBySpringCGLIB$$d5a9edaf@3c2772d1
        System.out.println("组件:" + (jiangziya1 == jiangziya2));
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);
        // 如果@Configuration(proxyBeanMethods = true) 代理对象调用方法
        // springboot总会检查这个组件在容器中是否存在
        // 保持组件单实例
        User user1 = bean.user01();
        User user2 = bean.user01();
        System.out.println("->" + (user1 == user2));
        // 组件依赖
        User user01 = run.getBean("user01", User.class);
        Pat jiangziya = run.getBean("jiangziya", Pat.class);
        System.out.println("用户的宠物:" + (user01.getPat() == jiangziya));
    }
}

详细讲解参照一下视频:

雷丰阳2021版SpringBoot2零基础入门springboot全套完整版(spring boot2)

猜你喜欢

转载自blog.csdn.net/qq_30398499/article/details/113705710
今日推荐