一,首先做一个测试:
1,将SpringBoot项目里的一个组坐标注释掉
2,在启动类运行测试,看看容器中有没有刚刚注释掉的模板类
3,测试结果1:当没有坐标时,运行报异常,没有这个类NoSuch.....说明这个类没有被注入容器。
4,我们再将坐标加上
5,运行结果2:成功获取对象地址,说明该类已经被注入
分析:SpringBoot根据坐标自动完成配置注入
为什么会这样?
两个条件,1:坐标,,2:@Conditional注解
二,@Conditional 是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。
1, 通过分析源码可以很清楚的发现,这注解可以修饰类,方法,运行时生效。
还有个数组类型的value属性,该属性可以绑定值(类),且必须是Condition的子类。
2,我进入这个Condition看看,发现它是个接口,里面有个返回值是Boolean方法,且有两个参数。
2.1通过分析可以发现,如果这个matches方法返回false,则Conditional条件不成立,反之则成立;
3,那我们是不是可以直接重写这个选择器呢?
首先我们创建一个配置类,然后使用注解@Conditional,value的值是我们自己继承且重写的match方法 的类
3.1来看看我们的match
重写的这个match方法的意思是:如果没有redis这个类,则返回false,Conditional就不选择注入
3.2这里我把jedis注掉了,没有jedis坐标
3.3我们测试看看,获取id未user的类
运行结果,是这个找不到该类的异常
3.4我们将jedis坐标加上,
运行结果;
成功获取到user的地址值!
这时候问题又来了,我们发现,这似乎只是个静态的选择器(判断条件写死了!)?那我们项目里那么多坐标,那么多类,总不能一个坐标一个选择器吧?
当然不是,下次我们将进一步分析 动态注入
将类的判断定义为动态的。判断哪个字节码文件存在可以动态指定。