bean的编程式和注解式加载控制与自动配置

目录

bean的加载控制

 bean的编程式加载控制

 bean的注解式加载控制

 自动配置原理

自定义自动配置


bean的加载控制

 bean的编程式加载控制

在程序中使用控制即可

public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata annotationMetadata) {//AnnotationMetadata 注解的源数据
        //  做判定条件,是否有这个注解

        boolean flag = annotationMetadata.hasAnnotation("org.springframework.context.annotation.Configuration");
        if (flag){
            return new String[]{"com.service.Dog"};
        }

        return new String[]{"com.service.Cat"};
    }
}

 bean的注解式加载控制

使用@ConditionalOnXXX注解为bean的加载设置条件

package com.beanLoad.config;

import com.beanLoad.service.Cat;
import com.beanLoad.service.Dog;
import com.beanLoad.service.Mouse;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;

//@ComponentScan("com.beanLoad")
@Import({Mouse.class, Dog.class})
public class springConfig {

    @Bean
    @ConditionalOnBean(name="com.beanLoad.service.Mouse")//当有这个bean时加载
    @ConditionalOnMissingBean(name = "com.beanLoad.service.Dog")//当没有这个bean时就加载
    @ConditionalOnNotWebApplication//不是一个web项目时就加载
    //这些注解的条件同时满足才会加载
    public Cat tom(){
        return new Cat();
    }

}

主类下

package com.beanLoad.app;

import com.beanLoad.config.springConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class BeanLoadApp {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(springConfig.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

}

运行结果

 自动配置原理

1、收集Spring开发者的编程习惯,整理开发过程使用的常用的技术列表->(技术集A)

2、收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的蝉蛹设置列表->(设置集B)

3、初始化SpringBoot基础环境,加载用户自定义的ena和到UR的其他坐标,形成初始化环境

4、将技术集A包含的所有技术都定义出来,在Spring/SpringBoot启动时默认全部加载

5、将技术集A中具有使用条件的技术约定出来,设置称按条件加载,有开发者决定是否使用该技术(与初始环境比对)

6、将设置集B作为默认加载(约定大于配置),减少开发者配置工作量

7、开放设置集B的配置覆盖接口,有开发者根据自身需要决定时候覆盖默认配置

自定义自动配置

自定义自动配置的核心是,先在resource资源下新建一个META-INF,在下面的spring.factories

#要自动配置的类写在这
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.beanLoad.service.Cat

被自动配置的类有有特殊的标志 

在一个配置类中


//当有这个类时,加载下面这个类
@ConditionalOnClass(name="com.beanLoad.service.Cat")
public class AutoSpringConfig {

}

测试的主类下 

public class App1 {
    public static void main(String[] args) {
        ApplicationContext app=new AnnotationConfigApplicationContext(AutoSpringConfig.class);
        String[] names = app.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
}
}

运行结果 

 这说明自动配置成功

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
面试高级开发的期间整理的面试题目,记录我面试遇到过的spring题目以及答案 目录 spring ThreadLocal的底层对象; 为什么@Service和@Repository放到实现类上面而不是接口类上面; spring 三种注入(就是从spring容器中将bean放入对象属性值中) Spring下描述依赖关系@Resource, @Autowired和@Inject的区别与联系 SpringBeanFactory和ApplicationContext的区别 谈谈Spring IOC的理解,原理与实现? bean的生命周期,详细看上面 SpringBoot自动装配的过程的原理: spring的缓存; spring是如何解决的循环依赖; BeanFactory和FactoryBean有什么区别; Spring中用到的设计模; SPI 机制(Java SPI 实际上是“基于接口的编程+策略模配置文件”组合实现的动态加载机制), 很多地方有用到: AOP Spring的AOP的底层实现原理; 为什么jdk动态代理是必须是接口 两种动态代理的区别 AOP实现方:aop注解或者xml配置;后来工具jar包aspects; aop的属性 事务 事务编码方: 事务注意事项; 为什么同一个类A调用b方法事务,A方法一定要有事务(编码的不用) @transaction多个数据源事务怎么指定数据源 传播特性有几种?7种; 某一个事务嵌套另一个事务的时候怎么办? REQUIRED_NEW和REQUIRED区别 Spring的事务是如何回滚的,实现原理; 抽象类和接口的区别,什么时候用抽象类什么时候用接口; StringBuilder和StringBuffer的区别 java值传递和引用传递

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

执久呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值