Spring AOP的底层原理是什么? Day23 2018-1
2018-12-13 本文已影响0人
Ernest_Chou
1. Spring中配置的bean是在什么时候实例化的?
默认容器在加载的时候初始化bean,但是也可以通过设置lazy-init属性来延迟加载。
2. 描述一下Spring中的IOC、AOP和DI
- IOC和AOP是Spring的两大核心思想
- IOC(控制反转):
利用反射的原理将对象创建的权利交给了Spring容器,Spring在运行的时候根据配置文件来动态的创建对象和维护对象之间的关系,实现了松耦合的思想;
- AOP(面向切面编程):
通过配置可以实现把业务逻辑和系统服务分离,业务逻辑只关心业务的处理而不再去处理其他事情;
- DI(依赖注入):
由Spring容器将对象注入到使用它的地方,被注入的对象只提供对应的方法接收就行,由容器来决定对象之间的依赖关系。
3.谈谈IOC、AOP和DI在项目开发中的应用场景
- IOC项目中的bean都可以交给Spring容器来维护,这样bean的创建及销毁以及生命周期都由Spring来处理;
- AOP:事务、日志、权限等;
- DI:比如Service层需要调用Dao层访问数据库,这时可以把Dao层的Bean给Spring管理,我们只需要在Service中定义对应的方法来接收由Spring中对应的方法来接收由Spring容器负责注入的Dao层的Bean即可。
4.谈谈Spring如何配置声明式事务控制
声明式事务管理有两种常用的方式
- 基于
tx
和aop
名字空间的xml
配置文件- 基于
@Transactional
注解
- 配置文件方式:
- 配置事务管理器
- 事务的策略(可以配置事务的隔离级别,传播属性,是否可读等)
- 配置事务的切入点,注入事务属性
- 注解方式:
- 配置事务管理器
- 开启事务控制的注解支持
- 在类或者方法上面添加
@Transactiona
,事务的属性都在该注解的属性上设置
5. Spring的作用域有哪些?
Spring的作用域有
singleton
、prototype
、request
、session
和global session
:
singleton
:默认,每一个Spring容器都只有一个实例对象;prototype
:每次调用都会创建一个新的实例;request
:每一个HTTP请求都有自己的Bean实例,仅在基于Web的Spring ApplicationContext
中可用;session
:每个HTTP请求都会产生一个新的Bean,同时该Bean仅在当前HTTP session
内有效;global session
:在一个全局的HTTPSession
中,容器会返回该Bean的同一个实例,仅在使用portletContext
时有效;
6. Spring AOP的底层原理是什么?拦截器的优势有哪些?
Spring AOP的底层都是通过代理来实现的
- 一种是基于
JDK
的动态代理- 一种是基于
CgLIB
的动态代理
拦截器是基于Java反射机制实现的,使用代理模式
- 拦截器不依赖与Servlet容器;
- 拦截器只能对action请求起作用;
- 拦截器可以访问action上下文;
- 拦截器可以获取IOC容器的各个bean;
- 在action生命周期中,拦截器可以被多次调用;
7、如何手写代码实现Spring原理?
Spring是个巨大的工厂,这个工厂就是专门用来生成Bean,所以如果要手写的一定要用到工厂设计模式:
写一个工厂类,对外提供一个静态方法,这个方法接受用户要创建对象的一个id,对象和id可以写到配置文件里面,工厂再提供一个init方法进行读取配置文件。
用户调用的是根据传入id在配置文件中找到要创建的对象,最后通过反射创建对象并返回给用户。
8、Controller接收JSON数据使用哪个注解?
接收方法使用
@RequestBody
注解,
发送时contentType
要设置为application/json
9、谈谈SpringMVC的工作原理
- 用户向服务器发送请求,
DispatcherServlet
捕获该请求DispatcherServlet
对请求URL
进行解析,得到URI
- 根据
URI
,调用HandlerMapping
获得Handler
配置的所有相关对象,最后以HandlerExecutionChain
对象的形式返回DispatcherServlet
根据获得的Handler
,选择一个合适的HandlerAdapter
,提取Request
中的模型数据,填充Handler
入参,开始执行Controller
Controller
执行完成后,选择一个适合的ViewResolver
将返回对象ModelAndView
返回给DispatcherServlet
。ViewResolver
结合Model
和View
,来渲染视图,将渲染结果返回给客户端。
10、谈谈你对SSM的理解,他们是如何协作完成功能开发的?
SSM是标准的MVC设计模式,将整个系统划分为显示层,控制层,业务层,数据层四层。
SpringMVC负责请求的转发和视图管理
Mybatis负责数据库查询
Spring 则是负责协调,实现业务对象管理,也就是负责不同层面的衔接
11、SpringMVC中的常用注解及其作用
-
@RequestMapping
请求和方法映射 -
@RequestBody
接收客户端传入的Json数据 -
@ResponseBody
返回客户端Json数据 -
@Controller
标识控制层 -
@Service
标识业务层 -
@Repository
标识数据层 -
@Component
把Bean添加到Spring容器中 -
@Autowired
按照类型自动注入 -
@Resource
自定义注入,可以按照类型注入,也可以按照名字注入 -
@PathVariable
RESTful风格时使用获取参数 -
@Param
表单参数和方法形参不一样时使用