Springboot2-给容器添加组件

本文详细介绍了如何在SpringBoot2中通过配置类添加和管理组件,以及Lite和Full两种模式的区别。通过示例展示了配置类组件的创建、依赖关系处理,并在主程序中调用组件,强调了代理bean方法的作用以及在组件相互依赖时保持单实例的重要性。同时,还展示了如何通过@Import导入组件以及获取容器中组件的方法。
摘要由CSDN通过智能技术生成

Springboot2-给容器添加组件

配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式

1、创建组件类如:

package com.example.bean;
public class User {
}
package com.example.bean;
public class Pet {
}

2、创建配置类,如:


```java
package com.example.config;

import ch.qos.logback.core.db.DBHelper;
import com.example.bean.Pet;
import com.example.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
 * 2、配置类本身也是组件
 * 3、proxyBeanMethods:代理bean的方法
 * proxyBeanMethods=false,如果组件之间不会相互依赖就用false,它不会检查容器中是否有组件,直接调用,每一个都是新的
 * proxyBeanMethods=true,如果组件之间相互依赖就要true,每次调用之前会检查容器中是否有该组件,若有则不再调用,如无,则会调用
 *  Full(proxyBeanMethods = true)(全配置)
 *  Lite(proxyBeanMethods = false)(轻量级配置)
 * 4、@Import({User.class, DBHelper.class})
 *      给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
 */
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {

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

    public User user01(){
        User zhangsan=new User("zhangsan",18);
        //User组件依赖了Pet组件
        zhangsan.setPet( tomcatPet());
        return zhangsan;
    }

    @Bean("tom") //若不想以方法名作为组件id,可以在@Bean()中添加想要设置的组件id
    public Pet tomcatPet(){
        return new Pet("tomcat");
    }
}

3、在主程序中进行调用,如:

package com.example;

import ch.qos.logback.core.db.DBHelper;
import com.example.bean.Pet;
import com.example.bean.User;
import com.example.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication //这是一个SpringBoot应用
public class MainApplication { //主程序类,主配置类
    public static void main(String[] args) {
        //SpringApplication.run(MainApplication.class,args);

        //1、返回我们IOC容器
        ConfigurableApplicationContext run=SpringApplication.run(MainApplication.class,args);

        //2、查看容器里面的组件
        String[] names=run.getBeanDefinitionNames();
        for(String name:names){
            System.out.println(name);
        }

        //3、从容器中获取组件
        Pet tom01=run.getBean("tom",Pet.class);
        Pet tom02=run.getBean("tom",Pet.class);
        System.out.println("组件:"+(tom01==tom02));

        //4、获取到的是代理对象,配置类本身也是一个组件
        MyConfig bean01=run.getBean(MyConfig.class);
        System.out.println(bean01);

        //如果@Configuration(proxyBeanMethods = true)代理对象调用方法,Springboot总会检查这个组件是否在容器中有
        //保持组件单实例
        User user=bean01.user01();
        User user1=bean01.user01();
        System.out.println(user==user1);

        User user01=run.getBean("user01",User.class);
        Pet tom=run.getBean("tom",Pet.class);
        System.out.println("用户的宠物:"+(user01.getPet()==tom));

        //5、获取组件
        String[] beanNamesForType=run.getBeanNamesForType(User.class);
        System.out.println("=====");
        for (String s : beanNamesForType) {
            System.out.println(s);
        }
        DBHelper bean=run.getBean(DBHelper.class);
        System.out.println(bean);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值