获取Spring容器 SpringBoot自动装配

一。自动装配

1.装配:把bean对象装到IOC容器
@Autowired
private RedisTempate redisTemplate   ————这个叫自动装配
2.自动装配的各个阶段
第一阶段:采用注解的方式和xml指定扫包范围
@Controller  @Service   @Repository  @Component
context:component-scan/package="

第二阶段:javaConfig去XML化
@Configuiration

@import 等价于 <import resource="" /> 等价于导入另外一个配置文件

第三个阶段 Enable自动装配 spring4出现的功能
@EnableWebMvc
@EnableCaching

@EnableAutoConfiguration  开启自动装配

3.导入maven包,控制器为什么能直接用@Autowired RedisTemplate redisTemplate

答:1.首先装到容器 (下面讲什么时候装到容器,如何装到容器)
2.然后从容器获取到(这个见手写IOC @Autowired的偷梁换柱)

Web-Inf下的spring.factories文件夹下有配置文件RedisAutoConfiguration这个文件会被selectImports方法扫描到,然后一层层往上

@SpringBootApplication——@EnableAutoConfiguration——@Import(AutoConfigurationImportSelector.class)——selectImports方法
由于有@Import(AutoConfigurationImportSelector.class),这个相当于导入一个配置文件(selectImports方法),就有容器和bean
相当于主启动类有一个容器里面有各个Bean

在这里插入图片描述

二。获取Sping容器

父类:AbstracApplicationContext 运用了模板方法,钩子方法是refresh
springboot启动的是 EmbeddedWebApplicationContext

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-redis.xml);
FileSystemApplicationContext context = new FileSystemApplicationContext("classpath:application.xml");
AnnotaionconfigApplicationContext context = new AnnotationConfigApplicationContext(SpringRedisconfig.class);
AnnotaionconfigApplicationContext context = new AnnotationConfigApplicationContext("com.xiagnxue");
//调用上面这个方法,就可以拿到包下的所有类 context.getBean(类首字母小写)
ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);   //SpringBoot的主启动类

在这里插入图片描述

第一种:SpringUtil

//1.SpringUtil
@Component
public class SpringUtil extends ApplicationObjectSupport {
    public static ApplicationContext context;
    
    public static Object getBean(String serviceName){
        return context.getBean(serviceName);
    }
    
    @Override
    protected void initApplicationContext(ApplicationContext context) throws BeansException {
        super.initApplicationContext(context);
        SpringUtil.context = context;      
    }
}
//2.使用
ApplicationContext context = SpringUtil.context;  //获取Spring容器
PayServiceUtil payServiceUtil = context.getBean(PayServiceUtil.class);  //获取bean
Map<String, PayService> payMap = context.getBeansOfType(PayService.class);   //获取接口的所有实现类

第二种:PayServiceUtil

@Component
public class PayServiceUtil implements ApplicationContextAware {
    //1.初始化Spring容器对象
    private ApplicationContext applicationContext;
    
    //2.获取Springr容器对象
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    
   //3.使用容器对象
   Map<String, PayService> payMap = applicationContext.getBeansOfType(PayService.class);

第三种AppConfig方法

public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Person person = context.getBean(Person.class);  或者  Person person = context.getBean("getPerson")
        system.out.printlin(person);
    }
}

@ComponentScan("com.base")
@Configuration                     //相当于这个java类一个配置文件 beans.xml
public class AppConfig { 
   @Bean
   Perseon getPerson(){
     retun new Person("张三","20");
   }
}

第四种NonAppConfig方法(第三种合二为一)

@ComponentScan("com")
public class TestNoAppConfig {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainApplication.class);
        DeptService deptService = context.getBean(DeptService.class);
        deptService.delete(new Dept());
    }
}

第五种 启动类

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘然生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值