学习spring的第4天
关于老式的spring+mybatis整合,使用了druid连接池,还使用了mybatis-spring依赖(用于整合的),但是这个依赖本身就使用了spring-jdbc的某些类来处理事务方面的内容,所以还需要额外再添加一个spring-jdbc依赖。
以前的mybatis是通过SqlSessionFactoryBuilder().build()创建出SqlSessionFactory,再调用openSession(true)创建出一个能够自动提交事务的sqlSession,再调用getMapper()得到一个dao类。而现在主要是通过spring的xml文件配置注入依赖。
1.原本的sqlSessionFactoryBuilder().build()在xml文件中改变成配置SqlSessionFactoryBean类的<bean>,有用到dataSource的set方法,获得了sqlSessionFactory对象(在spring容器加载的时候).
2.通过MapperFacotryBean类,这个类本身有一个setMapperInterface,其继承的SqlSessionDaoSupport类有一个setSessionFactory方法,通过在<bean>中配置这两个属性就可以得到一个dao类的对象(向上转型为接口的xxDao)
3.第二步已经把dao类得到了,再就是配置service,使用dao。
4.基本上的<bean>已经配置好了,但是为了方便获取ApplicationContext,也不是说方便,只是ApplicationContext如果通过每次在每个Servlet都new出来,然后又被垃圾回收销毁,而其又管理了多个<bean>,这样子耗时效率低下,也违背了被管理的<bean>的单例,通过监听器就在整个进程中获取一个ApplicationContext,当然你也可以不通过监听器而是直接写一个单例模式也是可以的。在Servlet下创建了一个上下文监听器,在tomcat启动时调用contextInitialized方法创建出一个ApplicationContexxt,具体代码如下:
public class InitializationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
// 这里是在web.xml文件下写了一个<context-param>设置了spring.xml的文件名,方便不过过java代 码改动
String configFile = servletContext.getInitParameter("configFile");
ApplicationContext context = new ClassPathXmlApplicationContext(configFile);
// 最好还是不要使用魔法值吧,context
servletContext.setAttribute("context", context);
}
// 下方的销毁方法没有内容,无视
}
同时为了获取到这个context,还写了一个类实现spring的ApplicationContextAware接口(实现了Aware的接口,只要在spring配置好<bean>,其中的set方法都会自动装配,应该是,我不是很确定),set方法中设置了ApplicationContext的赋值,同时额外写一个了方法getBean,直接通过该类调用,就不需要ApplicationContext.getBean
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static <T> T getBean(String name, Class<T> clz) {
return context.getBean(name, clz);
}
}
5.但是监听器的启动需要在web.xml文件中配置
<listener>
<listener-class>com.web.listener.InitializationListener</listener-class>
</listener>
而实现了ApplicationContextAware接口的类要被自动装配还需要配置一个<bean>,以自动装配调用set方法,设置了ApplicationContext对象,才能用到getBean,而不会报空指针异常。
applicationConfig.xml如下,最后一个<bean>是自动装配它自己的类的set方法,不用写id
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/demo"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean> <bean id="dao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.dao.DeptDao"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean> <bean id="service" class="com.service.impl.DeptServiceImpl">
<property name="deptDao" ref="dao"></property>
</bean> <bean class="com.web.listener.ApplicationContextHolder"></bean>
6.如此,dao模块就只需要写一个接口就行了,在方法上通过注解使用sql语句,service模块在impl类上设置一个dao的字段和对应的set方法。而Servlet中通过代码ApplicationHolder.getBean("service", XXX.class);就可以直接获取到service对象。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
DeptService service = ApplicationContextHolder.getBean("service", DeptService.class);
List<Dept> depts = service.queryAll();
req.setAttribute("depts", depts);
req.getRequestDispatcher("WEB-INF/home.jsp").forward(req, resp);
}
学习spring的第4天的更多相关文章
- 学习Spring——依赖注入
前言: 又开始动笔开了“学习Spring”系列的头…… 其实一开始写“学习SpringMVC”的几篇文章是出于想系统的了解下Spring以及SpringMVC,因为平时在公司中虽然每天都在使用Spri ...
- 菜鸟学习Spring——60s配置XML方法实现简单AOP
一.概述. 上一篇博客讲述了用注解的形式实现AOP现在讲述另外一种AOP实现的方式利用XML来实现AOP. 二.代码演示. 准备工作参照上一篇博客<菜鸟学习Spring--60s使用annota ...
- 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...
- 跟着刚哥学习Spring框架--创建HelloWorld项目(一)
1.Spring框架简介 Spring是一个开源框架,Spring是在2003年兴起的一个轻量级的开源框架,由Rod johnson创建.主要对JavaBean的生命周期进行管理的轻量级框架,Spri ...
- 学习Spring中遇到关于BeanFactory及测试类的问题
最近在学习Spring,使用的是Spring 5.0.1 学习书本中使用的是4.0 学习书本中使用以下来加载配置文件及设置 Resource resource = new ClassPathResou ...
- 学习Spring Boot:(一)入门
微服务 现在微服务越来越火了,Spring Boot热度蹭蹭直升,自学下. 微服务其实是服务化思路的一种最佳实践方向,遵循SOA(面向服务的架构)的思路,各个企业在服务化治理上面的道路已经走得很远了, ...
- 学习Spring Boot:(二十六)使用 RabbitMQ 消息队列
前言 前面学习了 RabbitMQ 基础,现在主要记录下学习 Spring Boot 整合 RabbitMQ ,调用它的 API ,以及中间使用的相关功能的记录. 相关的可以去我的博客/RabbitM ...
- 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
前言 由于 Ehcache 存在于单个 java 程序的进程中,无法满足多个程序分布式的情况,需要将多个服务器的缓存集中起来进行管理,需要一个缓存的寄存器,这里使用的是 Redis. 正文 当应用程序 ...
- 跟着刚哥学习Spring框架--AOP(五)
AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...
- 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)
组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...
随机推荐
- tomcat#结构
下面是一个tomcat的配置文件,通过分析tomcat配置文件的结构,和相关注释,可以大致了解tomcat的结构 <?xml version="1.0" encoding=& ...
- ibd2sdi — InnoDB表空间SDI提取实用程序
参考mysql8.0官方文档 https://dev.mysql.com/doc/refman/8.0/en/ibd2sdi.html ibd2sdi是一个实用程序,用于从表空间文件中提取 序列化的字 ...
- 使用Spring Cloud Gateway保护反应式微服务(一)
反应式编程是使你的应用程序更高效的一种越来越流行的方式.响应式应用程序异步调用响应,而不是调用资源并等待响应.这使他们可以释放处理能力,仅在必要时执行处理,并且比其他系统更有效地扩展. Java生态系 ...
- 开通博客第一天 写一个hello world
申请的博客第一天便被批准了,有了一个和大家交流学习的园地.在今后的日子里期待一起进步.
- 预备JS执行环境,预执行脚本
page.evaluateOnNewDocument(pageFunction, ...args) pageFunction <function|string> Function to b ...
- Jquery动画效果设置大全
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Jquery所有Dom操作汇总
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 域名配置DNS解析A记录,映射到主机
有很多域名的供应商,随便选,哪个便宜用哪个.godaddy一直支持支付宝,不用visa,虽然它是国外的. 我用的是godaddy,这两年有中文版的了,虽然它有了中文版,但是比以前的英文版还要慢. 进入 ...
- R 再也不用愁变量太多跑回归太麻烦!R语言循环常用方法总结
在高维数据分析过程中,为了筛选出与目标结局相关的变量,通常会用到回归分析,但是因为自变量较多,往往要进行多次回归.这就是统计编程语言发挥作用的时候了 有些大神们认为超过3次的复制粘贴就可以考虑使用循环 ...
- 《新标准C++程序设计》4.5(C++学习笔记15)
实例:长度可变的整型数组类 int main() { //要编写可变长整型数组类,使之能如下使用: CArray a; //开始里的数组是空的 ; i < ; ++i) a.push_back( ...