1.@Autowired 与@Resource的区别
1.@Autowired是Spring提供的,@Resource是J2EE提供的。
2.@Autowired默认是通过byType方式注入,@Resource默认是通过byName注入的。
3.@Autowired注解注入的对象需要在IOC容器中存在,否则需要加入属性required=false,表示忽略当前注入的bean,如果直接注入没有跳过,则会跳过。
byName:通过bean的id或者name注入;ByType:通过bean的class注入。
@Autowired默认注入的方式是byType,如果有两个相同类型的bean则ByName注入。
如果有两个相同name的bean,则通过@Qualifier指定bean的name。
@Resource默认通过ByName注入,如果两个bean的name相同则通过ByType注入。如果还是相同则通过name和Type属性指定。
注意:虽然默认是通过ByName注入,但是还是会校验Type,如果Type不一致则会报BeanCreationException异常。
2.Spring Boot的核心注解
1.首先是main方法。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
其中@SpringBootApplication是一个组合注解,其中最主要的是@Configuration,@ComponentScan,@EnableAutoConfiguration这三个注解。
@Configuration:注解用来标识这个类可以使用Spring IOC作为Bean定义的来源。
@Component Scan:功能是自动扫描并且加载符合条件的组件,可以通过basePackages等属性来制定范围,如果不指定会从声明@ComponentScan所在类的包进行扫描。
@EnableAutoConfiguration借助@import将所有符合自动加载条件的bean加载到ioc容器里。
实现自动配置的工具类:SpringFactoriesLoader
3.Spring boot读取properties的几种方式?有什么区别?
1.@Value
2.@ConfigurationProperties
3.Environment
4.PropertiesLoaderUtils
4.Spring启动时会干什么?
1.通过DispatcherServletAutoConfiguration往spring容器中注入DispatcherServlet
2.DispatcherServlet被包装为DispatcherServletRegistrationBean,用于向Servlet容器中注册
3.在Tomcat创建阶段,将ServletContainerInitializer接口的实现类(即selfInitialize方法)设置到TomcatStarter中
4.把TomcatStarter注册到Tomcat中
5.Tomcat启动后,会调用ServletContainerInitializer#onStartup,即调用TomcatStarter#onStartup,接着调用ServletWebServerApplicationContext#selfInitialize
6..selfInitialize方法回调用ServletContextInitializer#onStartup方法
7..DispatcherServletRegistrationBean实现类ServletContextInitializer接口,所以会调用父类的
RegistrationBean#onStartup方法
8.在RegistrationBean#onStartup方法中会把内部维护的Servlet,Listener,Filter注册到ServletContext中
另外一种概况性的,面试时可以这么回答:
其实就是 SpringBoot 在启动的时候,按照约定去读取 SpringBoot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 SpringBoot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。
5.Springboot核心配置文件?
SpringBoot 的核心配置文件是 application 和 bootstrap 配置文件。
application 配置文件这个容易理解,主要用于 SpringBoot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
一些固定的不能被覆盖的属性;
一些加密/解密的场景;
6.用for循环删除list中的指定元素会发生什么?
会报 ConcurrentModificationException 异常。这是因为当使用 foreach(for(Integer i : list)) 语句时,会自动生成一个iterator 来遍历该 list,但同时该 list 正在被 Iterator.remove() 修改。Java 一般不允许一个线程在遍历 Collection 时另一个线程修改它。
7.spring boot 配置文件的加载顺序?
由jar包外向jar包内进行寻找;
优先加载带profile
jar包外部的application-{profile}.properties或application.yml(带spring.profile配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile配置文件
再来加载不带profile
jar包外部的application.properties或application.yml(不带spring.profile配置文件
jar包内部的application.properties或application.yml(不带spring.profile配置文件
8.多线程下的Start和run方法?
1.都是lang包下的,Start继承的是Thread类,run继承的Runnable类。
2.Start方法用于启动线程,而run方式是用来执行线程的运行时代码,run可以重复调用,start只能调用一次