1.声明spring-bean的注解有哪些?
作用于对象的注解:
- @Repository:对应持久层,即DAO层,主要用于数据库相关操作;
- @Service:对应服务层,即Service层,主要涉及一些程序具体的复杂逻辑。
- @Controller:对应Spring MVC的控制层,即Controller层,主要用于接受用户请求并调用Service层的方法返回数据给前端页面;
- @Component:通用的bean注解,可标注任意类。当不知道一个bean应该被划分为那一层时,可以使用该注解;
作用于方法的注解:
- @Bean:目的与@Repository类似,方法将返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。当我们引用第三方库中的类需要装配到Spring容器时,只能通过@Bean来实现
2.Ioc容器的加载流程
https://blog.csdn.net/Azhuzhu_chaste/article/details/139582805
3.Bean的生命周期
- Bean容器找到配置文件中Spring Bean的定义。
- Bean容器利用
Java Reflection API
创建一个Bean的实例。 - 如果涉及到一些属性值,利用set()方法设置一些属性值。
- 如果实现了xxAware接口,则调用对应方法,主要有以下三个:
- 如果Bean实现了
BeanNameAware
接口,调用setBeanName()
方法,传入Bean的名字。 - 如果Bean实现了
BeanClassLoaderAware
接口,调用setBeanClassLoader()
方法,传入ClassLoader
对象的实例。 - 如果Bean实现了
BeanFactoryAware
接口,调用setBeanClassFacotory()
方法,传入ClassLoader
对象的实例。
- 如果Bean实现了
- 如果存在与该Bean的Spring容器相关的
BeanPostProcessor
对象,执行postProcessBeforeInitialization()
方法。 - 如果Bean实现了
InitializingBean
接口,执行afterPropertiesSet()
方法。 - 如果Bean在配置文件中的定义包含
init-method
属性,执行指定的方法。 - 如果存在与该Bean的Spring容器相关的
BeanPostProcess
对象,执行postProcessAfterInitialization()
方法。 - 当要销毁Bean的时候,如果Bean实现了
DisposableBean
接口,执行destroy()方法。 - 当要销毁Bean的时候,如果Bean在配置文件中的定义包含
destroy-method
属性,执行指定的方法。
4.Bean的作用域
作用域分为五个,其中request、session、global-session可以看出来只能在web应用中:
- singleton:单例bean,未指定作用域时默认单例;
- prototype:每次从容器中获取Bean时,都会新建一个Bean;
- request:每次HTTP请求都会产生一个新的bean,该bean仅在当前request内有效;
- session:每个HTTP session共享一个bean;
- global-session:全局session作用域,仅仅在基于Portlet的Web应用中才有意义。Portlet是能够生成语义代码(例如HTML)片段的小型Java Web插件。它们基于Portlet容器,可以像Servlet一样处理HTTP请求。但是与Servlet不同,每个Portlet都有不同的会话。
5.Spring的一些常用类
待完善
6.Spring中用到的一些设计模式
- 工厂模式:Spring使用工厂模式通过BeanFactory和ApplicationContext创建bean对象;
- 代理模式:Spring AOP功能的实现;
- 单例模式:Spring中的bean默认都是单例的;
- 模板模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类;
- 装饰器模式:项目多数据源的情况的下,可以通过该模式去动态切换数据源;
- 观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用;
- 适配器模式:Spring AOP的增强或通知(Advice)、Spring MVC中的Controller。
7.SpringMVC中,DispatchServlet是怎么工作的
- 请求发送到
DispatcherServlet
- 通过
HandleMapping
,解析获取到请求对应的Handler HandlerAdapter
适配器,根据Handler调用真正的处理器处理请求,并开始真正业务逻辑- 上一步处理完后返回一个ViewAndModel对象,Model是返回的数据对象,View是个逻辑上的View
ViewResolver
会根据逻辑View查找实际的View- 将Model传给实际的View,然后将View返回给请求者
8.Spring的单例Bean线程安全问题
spring注册的单例bean是无状态的,也就没有线程安全问题,但如果其中定义了成员变量,那么就需要考虑成员变量修改的线程安全问题。
一般单例bean都不建议定义成员变量。