-
Spring中配置的bean是在什么时候实例化的?
默认容器在加载的时候初始化bean,但是也可以通过设置lazy-init属性来延迟加载。 -
描述一下Spring中的AOP IOC DI
IOC:控制反转:利用反射原理将对象创建的权利交给了容器,Spring容器在运行的时候通过反射的原理通过配置文件来动态的创建对象和维护对象之间的关系,实现了松耦合的思想。
AOP:面向切面编程。就是说通过配置将业务逻辑和系统的服务分离。目的是让业务逻辑之关系业务的处理而不再去处理其他事情。其中切面一般都是哪些可以为多个类提供服务的模块,将其封装起来称为切面。减少系统的重复代码和低模块之间的耦合度。一般用于权限验证、日志、事务等。
DI:依赖注入。由Spring容器将对象注入到使用它的地方,被注入的对象只提供对应的方法接收就行,由容器决定对象之间的依赖关系。
- IOC AOP DI在项目开发中的应用场景
IOC:项目中的bean都是由Spring容器可以维护的,这样Bean的创建、销毁以及生命周期都由Spring来处理。
DI:比如Service层需要调用Dao层访问数据库,这时候可以将Dao层的Bean交给Spring管理,我们只需在Service中定义对应的方法来接收由Spring负责的注入的Dao层的Bean等。
AOP:事务 、日志、权限等
- Spring中配置声明式事务机制
Spring中提供的事务管理机制称为 声明式事务管理。核心是基于AOP。
通过tx和aop命名空间的配置文件;or通过@Transactional注解
<!--###### 5、Spring声明式事务管理配置#######-->
<!--5.1 配置事务管理器类-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--<constructor-arg ref="dataSource" />-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--5.2 配置事务增强(如果管理事务?) 先引入事务的名称空间-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!--<tx:method name="save" read-only="false"></tx:method>-->
<tx:method name="get" read-only="true"></tx:method>
<tx:method name="find" read-only="true"></tx:method>
<tx:method name="*" read-only="false"></tx:method>
<!--<tx:method name="*" propagation="REQUIRED"></tx:method>-->
</tx:attributes>
</tx:advice>
<!--5.3 Aop配置,拦截哪些方法(切入点表达式)+应用上面的事务增强配置-->
<aop:config>
<aop:pointcut id="pt" expression="execution(* tx.StudentsService.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
事务中的Propagation:
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED–Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。
-
Spring中bean的作用域
singleton:默认。每一个Spring容器对应一个实例对象。
prototype:每一次调用创建一个新的实例对象。
request:每一个HTTP请求都有自己的实例 仅仅在基于Web的Spring ApplicationContext中使用
Session:每一个HTTP请求都会产生一个新的bean,同时该bean仅在当前的http session中有效。
global session:在一个全局的HTTPSession中,容器会返回该Bean的同一个实例,仅在使用portletContext时有效。 -
AOP底层原理 拦截器的优势
AOP的底层原理:基于JDK的动态代理or基于CGLIB的动态代理;
拦截器的优势:拦截器也是基于java反射机制实现的,使用代理模式。
拦截器不依赖servlet容器、可以获取IOC容器中的各个bean,可以访问action的上下文,只能对action请求起作用;在action生命周期中 拦截器可以被多次调用。
其实拦截器就是应用了AOP的思想,拦截Action以进行一些预处理or结果处理。
Spring代理实际上是对JDK代理和CGLIB代理做了一层封装,并且引入了AOP概念:Aspect、advice、joinpoint等等,同时引入了AspectJ中的一些注解@pointCut,@after,@before等等.Spring Aop严格的来说都是动态代理,所以实际上Spring代理和Aspectj的关系并不大.
- 自己实现Spring原理
首先 一定要实现反射原理,使用代理模式;然后Spring就可以看成是一个巨大的工厂,所以一定要用到工厂设计模式。
写一个工厂类,对外提供一个静态方法,该方法接受用户要创建对象的一个id,对象和id可以写到配置文件中,工厂再提供一个init方法进行读取配置文件。
用户调用的是根据传入id在配置文件中找到要创建的对象,最后通过反射创建对象并返回给用户。
-
谈谈你对SSM的理解,他们是如何协作完成功能开发的
SSM标准的MVC设计模式,将整个系统划分为显示层、控制层、业务层、数据层
其中,SpringMVC负责请求的转发和视图的管理;
mybatis负责数据库;Spring负责协调,实现业务对象管理,也就是负责不同层面的衔接。 -
常用的注解
-
SpringMVC的工作原理
用户向服务器发送请求,dispatcherServlet捕获请求;DispatcherServlet对请求URL进行解析,得到URI。
根据URI调用HandlerMapping获得Handler配置的所有相关对象;
DispatcherServlet根据获得的Handler,选择一个合适的handlerAdapter,提取Request中的模型数据,填充Handler入参,开始执行Controller.
Controller执行完成之后,选择一个合适的ViewResolver;将返回的ModelAndView返回给DispatcherServlet。
其中 Model和 view负责渲染视图,将渲染结果返回给客户端