A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庭院深深深几许 金牌黑马   /  2019-4-18 15:15  /  1051 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


第1章 Spring框架
Spring框架是一个开源的企业应用开发框架,作为一个轻量级的解决方案,它包含20多个不同的模块。本书主要关注Core、Spring Bean、Spring MVC和Spring MVC Test模块。
本章主要介绍Core和Spring Bean这两个模块,以及它们如何提供依赖注入解决方案。为方便初学者,本书会深入讨论依赖注入概念的细节。后续介绍开发MVC应用的章节将会使用到本章介绍的技能。
依赖注入
在过去数年间,依赖注入技术作为代码可测试性的一个解决方案已经被广泛应用。实际上,Spring、谷歌Guice等框架都采用了依赖注入技术。那么,什么是依赖注入技术?
很多人在使用中并不区分依赖注入和控制反转(IoC),尽管Martin Fowler在其文章中已分析了两者的不同:
http://martinfowler.com/articles/injection.html
简单来说,依赖注入的情况如下。
有两个组件A和B,A依赖于B。假定A是一个类,且A有一个方法importantMethod用到了B,如下:
public class A {
public void importantMethod() {
B b = ... // get an instance of B
b.usefulMethod();
...
}
...
}
要使用B,类A必须先获得组件B的实例引用。若B是一个具体类,则可通过new关键字直接创建组件B实例。但是,如果B是接口,且有多个实现,则问题就变得复杂了。我们固然可以任意选择接口B的一个实现类,但这也意味着A的可重用性大大降低了,因为无法采用B的其他实现。
依赖注入是这样处理此类情景的:接管对象的创建工作,并将该对象的引用注入需要该对象的组件。以上述情况为例,依赖注入框架会分别创建对象A和对象B,将对象B注入到对象A中。
为了能让框架进行依赖注入,程序员需要编写特定的set方法或者构建方法。例如,为了能将B注入到A中,类A会被修改成如下形式:
public class A {
private B b;
public void importantMethod() {
// no need to worry about creating B anymore
// B b = ... // get an instance of B
b.usefulMethod();
...
}
public void setB(B b) {
this.b = b;
}
}
修改后的类A新增了一个set方法,该方法将会被框架调用,以注入B的一个实例。由于对象依赖由依赖注入,类A的importantMethod方法不再需要在调用B的usefulMethod方法前去创建B的一个实例。
当然,也可以采用构造器方式注入,如下所示:
public class A {
private B b;
public A(B b) {
this.b = b;
}
public void importantMethod() {
// no need to worry about creating B anymore
// B b = ... // get an instance of B
b.usefulMethod();
...
}
}
本例中,Spring会先创建B的实例,再创建实例A,然后把B注入到实例A中。
注:
Spring管理的对象称为beans。
通过提供一个控制反转容器(或者依赖注入容器),Spring为我们提供一种可以“聪明”地管理Java对象依赖关系的方法。其优雅之处在于,程序员无需了解Spring框架的存在,更不需要引入任何Spring类型。
从1.0版本开始,Spring就同时支持setter和构造器方式的依赖注入。从2.5版本开始,通过Autowired注解,Spring支持基于field方式的依赖注入,但缺点是程序必须引入org.springframework.beans.factory.annotation.Autowired,这对Spring产生了依赖,这样,程序无法直接迁移到另一个依赖注入容器间。
市场需求大,Java培训越好越火。使用Spring,程序几乎将所有重要对象的创建工作移交给Spring,并配置如何注入依赖。Spring支持XML或注解两种配置方式。此外,还需要创建一个ApplicationContext对象,代表一个Spring控制反转容器,org.springframework.context.ApplicationContext接口有多个实现,包括ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。这两个实现都需要至少一个包含beans信息的XML文件。ClassPathXmlApplicationContext尝试在类加载路径中加载配置文件,而FileSystemXmlApplicationContext则从文件系统中加载。
下面是从类路径中加载config1.xml和config2.xml的ApplicationContext创建的一个代码示例。
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"config1.xml", "config2.xml"});
可以通过调用ApplicationContext的getBean方法获得对象。
Product product = context.getBean("product", Product.class);
getBean方法会查询id为product且类型为Product的bean对象。
注:
理想情况下,我们只需在测试代码中创建一个ApplicationContext,应用程序本身无需处理。对于Spring MVC应用,可以通过一个Spring Servlet来处理ApplicationContext,而无需直接处理。
1.1 XML配置文件
从1.0版本开始,Spring就支持基于XML的配置;从2.5版本开始,增加了通过注解的配置支持。下面介绍如何配置XML文件。配置文件的根元素通常为beans:
< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
...
< /beans>
如果需要更强的Spring配置能力,可以在schema location属性中添加相应的schema,也可以指定schema版本:
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
不过,笔者推荐使用默认schema,以便升级spring库时无需修改配置文件。
配置文件既可以是一份,也可以分解为多份,以支持模块化配置。ApplicationContext的实现类支持读取多份配置文件。另一种选择是,通过一份主配置文件,将该文件导入到其他配置文件。
下面是导入其他配置文件的一个示例:
< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
< import resource="config1.xml"/>
< import resource="module2/config2.xml"/>
< import resource="/resources/config3.xml"/>
...
< /beans>
bean元素的配置后面将会详细介绍。



传智Java培训拥有6大课程优势——http://www.itcast.cn/javaee/
①独有的一站式IT职业教育体系,让学员通过6个月的线下学习实现高起点就业, 12个月的线上在职进阶课实现升职加薪,大幅提升学员的职场晋升速度。
②60+套技术解决方案,覆盖职场常见开发问题,让学员就业后快速上手开发难题,轻松成为核心员工。
③超大项目库,覆盖7大就业主流热门行业,让学员边学习边积累项目开发经验。
④超千人投入的3大课程研发库,每年耗资千万打造领先行业的优质课程。
⑤传智&华为课程共建,持续为课程输出前沿技术。
⑥120+超强师资团队,多为总监、架构师出身,除了专业技能,还为你规划适合你的职业发展路线。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马