Analysis of the principle of SpringBoot bottom annotation @Configuration

Entity class:

@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;
    }
}

One, ordinary spring configuration file method

<?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>

The above is the way we used to configure the file when using spring. Now we need to use the springboot configuration class to replace the above ordinary spring configuration file.

Second, the SpringBoot configuration class uses the @Configuration annotation principle

// 配置类里面使用@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 startup class

@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));
    }
}

For detailed explanation, please refer to the video:

Lei Fengyang 2021 version of SpringBoot2 zero-based entry springboot full set of full version (spring boot2)

 

Guess you like

Origin blog.csdn.net/qq_30398499/article/details/113705710