Spring父容器与SpringMVC子容器是如何体现出父子关系的?
所谓容器,就是上下文,在这同一个上下文里,大家可以共享一些东西。
在Spring
应用启动时,会先读取web.xml
文件,调用ContextLoaderListener
创建Spring
容器,也就是你说的父容器。
1 | <listener> |
Listener
创建完之后,开始创建Servlet
:
1 | <servlet> |
这时候这个DispatcherServlet
开始试图创建SpringMVC
的ApplicationContext
,它先找刚才由上面那个ContextLoaderListener
创建的Spring
的ApplicationContext
,找到后,把Spring
的ApplicationContext
作为参数传给DispatcherServlet
的ApplicationContext
的setParent
方法,这样SpringMVC
的容器就变成了Spring
容器的儿子。
因为在SpringMVC
这个子容器创建的时候指定了它的Spring
父容器,所以儿子能找到父亲,所以SpringMVC
这个子容器里的Bean
可以调用父容器的服务,而父容器不知道有这个儿子的存在(一个不负责任的父亲),父容器里的Bean
不能调用子容器里的服务。
Spring和SpringMVC配置文件为什么要分开扫描
平时我们在项目中注入关系是这样的顺序:在Service
中注入Dao
(初始化自动注入,利用@Autowired
),接着在Controller
里注入Service
(初始化自动注入,利用@Autowired
)
使用分开扫描的方式,一是为了使得父容器内的对象都能互相通信,二是为了让与浏览器显示息息相关的jsp
文件直接关联的Controller
与其他分隔开来,体现SpringMVC
的思想。【在Controller
里注入(可访问到,也就是子容器访问父容器对象)Service
】。
事务为什么加在service层而不加在dao层。
在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。
当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。
判断事务是否配置成功的关键点在于出现异常时事务是否会回滚。
给Service
层配置事务,因为一个Service
层方法操作可以关联到多个Dao
的操作。在Service
层执行这些Dao
操作,多Dao
操作有失败全部回滚,成功则全部提交。
事务也一般放在service层进行配置,其原因可见:
当然,事务的aop配置也一般放在applicationContext.xml
进行配置,因为其涉及到
Mybatis整合Spring的思路
Mybatis
是使用SqlSessionFactory
产生dao
代理对象间接控制,然后使用代理对象调用其操作数据库的dao
方法,这就是Mybatis
的主要工作所在了。
而Mybatis
涉及到dao
层的代理对象,也涉及到与数据源有关的SqlSessionFactory
总的来说,整合的思路:
主要是获取sqlSession对象,通过MapperScannerConfigurer 自动装配SqlSessionFactory 或 SqlSessionTemplate,MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中
整合方式详解:
IOC控制反转和依赖注入
控制反转:我们不需要去new
对象,只需要告诉Spring
去把我们这个对象的控制权交给Spring
依赖注入:告诉Spring
我要用哪个对象,这个对象之前是被Spring
控制的。