学如逆水行舟,不进则退。
昨天我已经将杀恶龙的探险任务类DestoryDragonQuest 实现,而且我们也知道了在骑士BraveKnight 类中存在一个Quest 引用,那么问题来了,怎么将这个探险任务交给骑士BraveKnight 类呢?
创建应用组件之间协作的行为通常称为装配(wiring)。Spring有多种装配bean的方式。
1.采用XML是很常见的一种装配方式
2.Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来
package chapter1;import org.springframework.context.support.ClassPathXmlApplicationContext;import infs.Knight;public class KnightMain { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("questBean.xml"); Knight knight = context.getBean(Knight.class); knight.embarkOnQuest(); context.close(); }}
3.降低Java开发复杂性,Spring的第三种策略:基于切面和惯例进行声明式编程。
3.1 面向切面编程(aspect-oriented programming,AOP)
面向切面编程允许把遍布应用各处的功能分离出来形成可重用的组件。
系统由许多不同的组件组成,每一个组件各负责一块特定功能。除了自身核心的功能之外,还经常承担额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心服务 逻辑的组件中,这些系统服务通常被称为横切关注点。
如果这些关注点分散到多个组件中,将会导致代码双重的复杂性。
1) 耦合度高,可重用性差。即使将其抽象为一个独立的模块,但方法的调用还是会重复出现在各个模块。
2) 组件代码中除了自身的狠心业务代码,还有这些功能的代码。而一个方法应该只关注它本身要做的事情,而不应该关注它是不是安全的或是否需要支持事务。
在整个系统内,关注点(如日志和安全)的调用经常散步到各个模块中,而这些关注点并不是模块的核心业务。
AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中。我们可以把切面想象为覆盖在很多组件智商的一个外壳。应用那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活应用到系统中。
利用AOP,系统范围内的关注点覆盖在它们所影响组件之上。
与传统直接在组件代码中调用方式不一样,Spring AOP通过在配置文件中设置该组件的切入点,然后在该组件运行至该切入点时,才会运行如日志、安全等服务。
4.通过切面和模板减少样式代码
在许多编程场景中往往会产生许多样板式代码,其中一个常见惯例就是使用JDBC访问数据库查询数据,其次还有JMS、JNDI和使用REST服务。
Spring旨在通过模板封装来消除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板式代码成为可能。