1.1 简化Java开发
DI(依赖注入)
帮助应用对象彼此之间保持松散耦合
通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。依赖关系将被自动注入到需要它们的对象当中去。
基于XML的配置
<bean id = "knight" class = "com.springinaction.knights.BraveKnight"> //注入Quest bean
<constructor-arg ref="quest" />
</bean>
<bean id = "quest" class = "com.springinaction.knights.SlayDragonQuest"> //创建SlayDragonQuest
<constructor-arg value="#(T(System).out)" />
</bean>
基于Java的配置,可作为XML的替代方案
@Configuration
public class KnightConfig {
@Bean
public Knight knight(){
return new BraveKnight(quest());
}
@Bean
public Quest quest(){
return new SlayDragonQuest(System.out);
}
}
不论使用的是 基于XML的配置 还是 基于Java的配置 ,DI所带来的收益是相同的。
AOP (面向切面编程)
允许你把遍布应用各处的功能分离出来形成可用的组件。
AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之,AOP能够确保POJO的简单性。
这里使用了Spring的 aop 配置命名空间把 Minstrel bean 声明为一个切面。
1.首先,把Minstrel声明为一个bean,然后在aop:aspect元素中引用该bean;
2.利用aop:pointcut定义名为embark的切入点。配置expression属性来选择所应用的通知。
3.声明(使用aop:before)在embarkOnQuest()方法执行前调用Minstrel的singBeforQuest()方法,这种方式被称为前置通知(before
advice)
4.同时声明(使用aop:after)在embarkOnQuest()方法执行后调用singAfterQuest()方法,这种方式被称为后置通知(before
advice)
通过少量的XML配置,把Minstrel声明为一个Spring切面
<bean id="minstrel" class="com.springinaction.knights.Minstrel"> //声明Minstrel bean
<constructor-arg value="#(T(System).out)" />
</bean>
<aop:config>
<aop:aspect ref="minstrel">
<aop:pointcut id="embark" expression="execution(* *.embarkOnQuest(..))" /> //定义切点
<aop:before pointcut-ref="embark" method="singBeforQuest" /> //声明前置通知
<aop:after pointcut-ref="embark" method="singAfterQuest" /> //声明后置通知
</aop:aspect>
</aop:config>
使用模板消除样板式代码
Spring旨在通过模板封装来消除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板代码成为了可能
1.2 容纳你的Bean
在基于Spring的应用中,你的应用对象生存于Spring容器中。Spring容器负责创建对象、装配他们、配置他们并管理它们的整个生命周期,从生存到死亡(在这里,可能就是new到finalize)
Spring容器并不是只有一个,Spring自带了多个容器实现,可以归为两种不同的类型。bean工厂是最简单的容器,提供基本的DI支持。应用上下文基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
使用应用上下文
Spring自带了多种类型的应用上下文,下面罗列几种:
- AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文
- AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文
- ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源
- FileSystemXmlApplicationContext:从系统文件下的一个或多个XML配置文件中加载上下文定义
- XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义
将bean加载到 bean工厂
FileSystemXmlApplicationContext:
ApplicationContext context = new FileSystemXmlApplicationContext(“c:/knight.xml”);
ClassPathXmlApplicationContext:
ApplicationContext context = new ClassPathXmlApplicationContext(“knight.xml”);
Spring容器中bean的生命周期
Spring模块