2.Spring IoC快速入门
Spring核心内容的基本开发步骤:
下载开发包,导入jar包
编写代码(基础代码和调用代码)
编写配置文件
2.1.Spring的开发包
开发包的下载
Spring官方:http://spring.io/
下载网址:http://repo.spring.io/libs-release-local/org/springframework/spring/
我采用的版本是:3.2.x的版本(企业主流版本,框架整合也需要对应版本jar):
Spring3.2版本开发包目录结构:
规范文档中基本内容了解:
第三章 核心技术 (IoC和AOP)
第四章 数据访问 持久层 (JdbcTemplate、声明式事务管理)
第五章 表现层 SpringMVC
第六章 集成 零散技术 , 需要在项目实战讲解
开发过程中还需要其他开源技术框架依赖Jar包集(dependencies,作用是方便依赖的其他技术的jar的导入):
2.2.开发环境测试搭建(Jar的导入)
新建Web工程:spring3_day1,导入jar:
1.Spring项目的核心容器的最基本Jar包(4个):
2.Spring框架所需的日志包(2个,依赖jar库中找):
默认采用commons-logging日志框架+log4j的日志实现,还需要添加log4j的配置文件。
关于java日志的补充阅读:
Java的常见的日志系统有log4J,jdk-jul,logback等,这些日志系统各自独立,编程方式也不一致。如果你一个系统要用到多个框架库,而这些框架库又可能要用不同的日志系统,那么你一个系统中就得使用多套日志系统,那多套日志系统如何融合在一起是个很大的问题。
那么如何解决呢?进行抽象,抽象出一个接口层,对每个日志实现都适配或者转接,这样这些提供给别人的库都直接使用抽象层即可,不需要关注具体的日志实现。常见的日志抽象出来的框架有Apache commons-logging和slf4j。
这里有个故事:最新是开源社区提供了commons-logging抽象,被称为JCL日志框架,出色地完成了兼容主流的日志实现(log4j、JUL、simplelog),基本一统江湖,就连顶顶大名的spring也是依赖了JCL。
看起来事物确实是美好,但是美好的日子不长,接下来另一个优秀的日志框架slf4j的加入导致了更加混乱的场面。比较巧的是slf4j的作者(Ceki Gülcü)就是log4j的作者,他觉得JCL不够优秀,所以他要自己搞一套更优雅的出来,于是slf4j日志体系诞生了,并为slf4j实现了一个亲子——logback,确实更加优雅。
但是由于之前很多代码库已经使用JCL,虽然出现slf4j和JCL之间的桥接转换,但是集成的时候问题依然多多,对很多新手来说确实会很懊恼,因为比单独的log4j时代“复杂”多了,可以关注下这个,抱怨声确实很多。到此本来应该完了,但是Ceki Gülcü觉得还是得回头拯救下自己的“大阿哥”——log4j,于是log4j2诞生了,同样log4j2也参与到了slf4j日志体系中。日志体系的江湖又将面临血雨腥风的混乱了。
2.3.业务代码编写(业务层、数据持久层)
采用的示例业务是模拟用户登录。
service和dao:
测试代码:
【思考分析】
代码过于耦合,上层代码过度依赖于下一层代码的实现:
UserDAO userDAO = new UserDAOImpl();
如果要更换实现类,必须要修改原来的业务代码!
解决方案:采用IoC(Inverse of Control,控制反转)的思想。
简单的说就是引入工厂(第三者),将原来在程序中手动创建管理的UserDAO对象,交给工厂来创建管理。在Spring框架中,这个工厂就是Spring中的工厂,因此,也可以说,将创建管理UserDAO对象的控制权被反转给了Spring框架了。
IoC中文翻译为控制反转,指以前程序自己创建对象,现在将创建对象的控制权交给了第三方(Spring)了。
IoC底层实现:工厂+ 反射 + 配置文件。
2.4.IoC控制反转的实现
2.4.1.Spring核心配置文件的编写
IoC控制反转的理解和实现
习惯上: 在src建立applicationContext.xml (位置:src目录或者 WEB-INF目录)
引入xml的头部信息bean schema约束,可以参考规范文档中的的xsd-config.html
找到下列章节的示例,拷贝到工程中:
结果如下:
核心配置文件编写:
2.4.2.通过Spring的工厂获取Bean完成相关操作
基本过程是:在程序中读取Spring配置文件,得到Spring的Bean工厂,通过Spring框架获得Bean,完成相应操作
service代码编写:
2.5.DI依赖注入的实现
DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件(简单的说,可以将例外一个bean对象动态的注入到另外一个bean中。)
【面试题】IoC和DI的区别 ?
DI和IoC是同一件事情,都是将对象控制权交给第三方(Spring)管理,只是站在不同角度而已。
IoC:
耦合代码变成依赖注入代码的方法:
即:Spring创建了Service、DAO对象,在配置中将DAO传入Servcie,那么Service对象就包含了DAO对象的引用。
service:
核心文件配置:
2.6.Spring的工厂
ApplicationContext直译为应用上下文,是用来加载Spring框架配置文件,来构建Spring的工厂对象,它也称之为Spring容器的上下文对象,也称之为Spring的容器。
ApplicationContext 只是BeanFactory(Bean工厂,Bean就是一个java对象) 一个子接口:
为什么不直接使用顶层接口对象来操作呢?
ApplicationContext 更加强大, 所以现在开发基本没人使用BeanFactory。
提示:后面还有个FactoryBean,注意区别。
【示例了解】
2.7.Spring工厂的直接获取(两种方式)
如何选择:
如果applicationContext.xml 在 src下, ClassPathXmlApplication读取
如果applicationContext.xml 在WEB-INF下,FileSystemXmlApplicationContext读取