这一篇在前一篇Springmvc的基础上,加上Spring。Spring的主要用途叫做控制反转(依赖注入,IoC/DI)和面向切面的编程(AOP),本文只介绍IoC,因为AOP主要的应用场景是记录日志,暂时不需要,等我要整合的几个框架都整合在一起的时候再加上。

pom.xml不需要新添加任何东西,因为spring-core等包都在导入spring-webmvc的时候作为依赖项被导入了,所以直接来看配置。

1. web.xml

Spring要在程序需要某个对象的时候,把这个对象的实例注入进去,默认情况下,Spring以单例的形式维护了所有需要注入的对象的实例,哪里需要就把对应的实例给哪里,Spring自己对实例、程序运行的管理构成了Spring自己的容器,第一步就是要在web.xml中注册,初始化这个容器:

contextConfigLocation

classpath:/META-INF/applicationContext.xml

org.springframework.web.context.ContextLoaderListener

这里注册一个ContextLoaderListener,并指定spring配置文件的位置,在类路径下的/META-INF/applicationContext.xml,现在在maven的resources资源包下,即src/main/resources下面创建目录META-INF,在这个目录下创建applicationContext.xml,这个文件就是spring的配置文件。

2. applicationContext.xml

applicationContext.xml是spring的核心配置文件,spring4和之前版本的一个很大的区别,就是推荐情况下bean不是在xml文件中配置,而是通过扫描固定annotation的类,根据对象的类型或者名字自动加载,以前在applicationContext.xml需要配置大量的bean,现在不用了,但是仍然要告诉spring,去哪个包下面找这些带着annotation等着被扫描的类:

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

前面这一堆东西先不用管,直接粘贴好了,其实很多现在还用不到,不过也没有关系,先放在这好了,真正有用的配置就一句话,需要spring管理的类,请到org.zhangfc.demo4ss.service下面去找。

3. UserService.java

下面写一个服务类,用来获得注册用户列表,创建package:org.zhangfc.demo4ss.service,在下面创建接口UserService,写一个方法获取所有用户名。

public interfaceUserService {public ListgetAllUsernames();

}

再创建一个类UserServiceImpl,实现这个接口:

@Servicepublic class UserServiceImpl implementsUserService {public ListgetAllUsernames() {

List users = new ArrayList();

users.add("zhangsan");

users.add("lisi");

users.add("wangwu");returnusers;

}

}

这里比较关键的就是@Service这个annotation,它告诉Spring,我是一个Service,需要你来管理我。

4. HomeController

回到控制器里,上一篇文章我写了一个方法叫json来返回一个json对象,现在改一下这个方法,通过前面写的UserService来获取用户列表并返回给客户端。

首先定义一个类的全局变量UserService:

@Autowiredprivate UserService userService;

这里要注意的是Autowire这个annotation,它是为了告诉spring,这个对象没有实例化,需要你来注入一个UserService的实例,那问题就是,UserSerivce是一个接口,不指定谁知道你想用的实现类是哪个,Spring会首先看自己的容器里有没有一个叫做userService的对象(刚才那个UserServiceImpl的对象名字就叫做userServiceImpl),如果找不到就在配置文件里配置的路径下面寻找UserService的实现类,找到了就把它的对象拿过来,除此之外刚才Service那个annotation还可以指定一个value:

@Service("userService")

这样一来,对于UserServiceImpl这个类的实例,Spring给它起的名字就不是userServiceImpl了,而是userService,如果某个接口的实现类有多个,就可以使用这种方法来指定用哪个实现类,个人认为,如果每个接口都只有一个实现类,那么这么做确实很方便,但如果有多个实现类并且可能会更换的话,就不如配置文件明了了(当然了,现在这种方式也可以把参数抽出来放到配置文件里,不过还是麻烦一些)。

然后修改json方法:

@RequestMapping("/json")

@ResponseBodypublic Listjson(){returnuserService.getAllUsernames();

}

Spring在这里的作用就是把HomeController需要的userService注入进来,运行程序,访问http://localhost:8080/demo4springmvc-spring/json:

["zhangsan","lisi","wangwu"]

Spring的另一个功能AOP暂且不用,等需要记录日志的时候再写,当然,Spring本身也有很多复杂的机制,后面在具体问题中慢慢介绍。

java+se+ee+spring_【JavaEE】Springmvc+Spring整合及example相关推荐

  1. java se ee me都有什么区别?

    刚开始接触Java的小伙伴肯定都有一个疑问,学java就学java呗,为啥还分成了JavaSE.JavaSE.JavaMe,也不知道他们都是干嘛的,今天小千就来简单的给大家介绍一下三者的区别. 标题J ...

  2. JDK与Java SE/EE/ME的区别

    1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用 ...

  3. java.lang.module_如何修复“java.lang.module.FindException:module java.se.ee not found”错误

    我正在尝试打包我的kivy应用程序(python3),但是当我运行命令buildozer -v android debug时,看到这个错误# Cwd /home/javier/.buildozer/a ...

  4. java se与jdk的关系_JDK与Java SE/EE/ME的区别

    1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用 ...

  5. JAVA SE/EE/ME区别

    JDK与Java SE/EE/ME的区别 1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌 ...

  6. Java SE EE ME

    通俗点的,你把Java当成语言就是了,别往平台上想.Java你暂时就当是一种编程语言.JavaSE,就是Java的标准平台,JavaSE下,开发出来的,就是桌面程序,就是软件! JavaEE,就是Ja ...

  7. Java SE/EE/ME

    Java分三个版本:JavaSE(标准版).JavaEE(企业版).JavaME(微型版),其中JavaSE是Java编程语言的基础,JavaEE是用于公司的PC端开发的,而JavaME 是用于移动端 ...

  8. Java SE EE ME等有什么区别?

    Java SE=Java Standard Edition Java EE=Java Enterprise Edition Java ME=Java Mobile Edition SE标准版开发,主要 ...

  9. Java SE\EE\ME区别-下载什么jdk

    Java SE 是做电脑上运行的软件. Java EE 是用来做网站的-(我们常见的JSP技术) Java ME 是做手机软件的.

  10. java 定时任务插件_详解Spring整合Quartz实现动态定时任务

    最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

最新文章

  1. ​两院院士评选“2021年中国/世界十大科技进展新闻”揭晓
  2. 中的挂起是什么意思_数字博物馆是什么意思?数字博物馆用到了哪些技术?
  3. UA MATH567 高维统计III 随机矩阵4 欧氏空间上的集网与覆盖
  4. 【ThinkingInC++】61、非成员运算符
  5. 【转载】javascript下ie7,ie8的Date Bug的解决
  6. 转:Windows Phone 7 设计简介
  7. html收款页面模板,订单收款.html
  8. 【CodeForces - 527C】Glass Carving(线段树或者SBT或者set)
  9. 让油猴脚本只执行一次
  10. 《逻辑学导论》思路整理
  11. 分享一款在线转换工具,轻松将PDF转换成JPG格式
  12. app store无法下载、安装软件,一直在转圈的一个解决方法
  13. [AHK]如何更改键盘快捷方式,在 Windows 10 中的虚拟桌面之间切换
  14. SSL P2719 买礼物的艰辛
  15. Java并发编程(总结最全面的面试题)
  16. f下行到什么形成全音_乐理试题二
  17. mybatis-plus代码生成器一键生成代码
  18. Python 热门开源项目Top10
  19. ubuntu安装sougoupinyin[sogoupinyin_2.2.0.0108_amd64.deb]出坑(内附各种失败解决办法)
  20. Spfa算法总结(C/C++)

热门文章

  1. [转]华人总结“十个”出了国才能知道秘密!
  2. mysql 四种隔离级别
  3. mysql 创建和查询数据库和表格
  4. .net知识系列之五:(基本控件和数据绑定控件)
  5. 极速理解设计模式系列:24.解释器模式(Interpreter Pattern)
  6. vSphere 4系列之三:vCenter Server 4.0安装
  7. 深入理解SYN***.+防范思想及ROS设置
  8. CFS之vruntime记录
  9. Netlink 0002 -- 什么是Netlink
  10. 深入解读Linux内存管理系列(6)——地址空间划分