**
聊聊spring boot的自动装配问题????
**
首先咱们说下你自己是否自己使用java代码实现过配置类?
RedisConfig.java
以后开发工作中千万千万不要再用springboot所自带的配置类了,一定要自己写配置
因为最终如果在配置阶段报错--->比如说报错xxx 493行--->点进去代码看看不懂--->然后开始百度,而且百度的都不一定能看懂,而且百度出来的结果还不一定正确
但是也并不是说自带的配置类不好,反而spring boot自带的配置类比咱们自己写的配置类还要优秀!!!
只是因为自带的配置如果报错在不懂源码的情况下这种问题非常难以解决,如果咱们用了自己写的配置类,项目报错了可以很快的定位到代码出错的那一行,那这样的话问题就好解决了,这也是为什么要自己去写配置类的原因。接下来就聊聊关于Spring Boot如何实现自动装配。
***@SpringBootApplication注解:***
这个注解其实是一个复合注解:
复合注解就是这一注解里面又包含了注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
这三个注解的作用就是把自己写的类让java知道是一个注解,并不再是一个普通的类了
@SpringBootConfiguration:这个注解是springboot的自己的配置注解
在springboot启动的时候,会加载一些自己配置信息
@EnableAutoConfiguration:自动的配置注解
@ComponentScan:扫描注解
--->扫描的有controller,是spring自己已经完成的配置了
比如现在有一个类,Student.java
<bean id="" class="com.aaa.lee.service.IUserService">
<ref class="com.aaa.lee.service.impl.UserServiceImpl" />
</bean>
,其实不需要使用@Service注解可以进行依赖注入
在springboot框架中,其实以上的过程就是靠@ComponentScan来进行完成的
在@ComponentScan可以写入参数,最常用的一个参数叫做value-->数组
(basePackages:基础包)
@ComponentScan(value = "com.aaa.lee.component")
在讲spring cloud组件ribbon的时候有一个东西叫做自定义算法配置类--->这个类一定不能放在主启动类的同级目录下
因为其实SpringbootApplication注解早已经融合了该注解,如果再次使用则会报错二次冲突
如果value的值是com.aaa.lee.component,就意味着component这个包下的所有类以及子包都会被扫描
大家都知道:
在springmvc的xml配置文件中应该扫描的就是service层,spring的配置文件中扫描都是controller
其实这个componentScan注解扫描就是bean注解
@Bean--->其实@Bean注解标识都是方法
public String test(){
return "zhangsan";
}
Student s = new Student();
String x = "zhangsan";
当ComponentScan注解扫描到@Bean之后,这个时候就会去寻找这个返回值,找到返回值之后
就会把他扔进Spring的IOC容器中,让spring自动的创建的对象,这就是非常著名的依赖注入
**@EnableAutoConfiguration仍然是一个复合注解**
@Import:导入的意思就是之前所知道<import />标签,只是把这些xml文件变成了配置类
Springboot的其中一个特点就是使用java代码代替配配置文件
application.xml:
<import resource="mybatis.xml" />
EnableAutoConfigurationImportSelector.java:
根据某个条件来进行选择如何自动的配置
spring.factories文件
EnableAutoConfigurationImportSelector extends AutoConfigurationImportSelector
AutoConfigurationImportSelector:
getCandidateConfigurations:
通过某一个条件来获取到配置
SpringFactoriesLoader:SpringFactories加载器,是专门加载SpringFactories文件的
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
断言和判断是相反的--->当断言说不为null的时候,其实在判断的时候是null的
if(null == configurations) {
throw new NotFoundException("不好意思,我没有从META-INF/spring.factories文件中找到自己配置类");
}
真正的选择条件就是spring.factories文件--->就在META-INF下面
这个东西就在jar包中(autoConfiguration)
约定优于配置就来源于这里:
只要是橘红色都是固定写死的东西,不用管
所需要看的是绿色的这些代码
这个spring.factories文件中所定义的都是类,这些类都是需要自动装配的
1.这些需要自动装配的类,都不是spring所自带的框架
spring整合xxx
这些自动装配的类就是为了配置在spring框架之外我们所需要用到的框架
让这些框架和spring框架进行整合
换句话说,这里所写所有的配置类都是之前你们所写的xml文件
关于配置类中的内容,这里我就不讲了,在后期项目中用到的时候我去讲(Redis,Ftp,ES,nginx)
spring只是一个容器,并没有具体的功能
DispatcherServlet--->在你们的web.xml中-->类-->在jar包--->web.xml其实在tomcat中也有webapps文件夹--->ROOT文件夹(这个文件夹其实就是localhost:8080-->所打开的项目--->web.xml(servlet-->全局-->session失效时间(看tomcat7,6)))
test:
<servlet>-->url-pattern-->/123
Springmvc底层代码就是这样的