Spring笔记一
Spring的两个核心特性
依赖注入(dependency injection,DI)
面向切面编程(aspect-oriented programming,AOP)
为了降低Java开发的复杂性,Spring采取了一下四种关键策略:
- 基于POJO(Plain Ordinary Java Objects,实际就是普通javabeans,使用pojo名称是为了避免和ejb混淆起来)的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式变成
通过切面和模版减少样板式代码
public class BravaKnight implements Knight{ private Quest quest; public BraveKnight(Quest quest) {<----- Quest被注入进来 this.quest=quest; } public void embarkOnQuest(){ quest.embark(); }
上述方法是依赖注入的一种方式,即构造器注入(constructor injection).
BraveKnight没有与任何特定的Quest实现发生耦合,这是一种松耦合。
一个对象只通过接口(而不是具体实现或者初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换
import java.io.PrintStream;
public class SlayDragonQuest implements Quest{
private PrintStream stream;
public SlayDragonQuest(PrintStream stream){
this.stream=stream;
}
public void embark(){
stram.println("slaydragonquest");
将SlayDragonQuest交给BraveKnight,将PrintStream交给SlayDragonQuest
创建应用组件之间协作的行为称为装配(wiring)
xml配置方式
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmls:xsi="http://www.w3.org/2001/XMLSchema-instance" xmls:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="knight" class="com.srpinginaction.knights.BraveKnight"> <!--注入Quest Bean 在创建时传入了SlayDragonQuest Bean的引用,将其作为构造参数--> <constructor-arg ref="quest"/> </beans> <!--创建SlayDragonQuest --> <bean id="quest" class="com.springinaction.knights.SlayDragonQuest"> <!--使用了Spring表达式语言(Spring Expression Language),将System.out(这是一个PrintStream)传入到了SlayDragonQuest的构造器中 --> <constructor-arg value="#{T(System).out}" /> </bean>
java的配置方式
@Configuration public class KnightConfig{ @Bean public Knight knight(){ return new BraveKnight(quest()); } @Bean public Quest quest(){ return new SlayDragonQuest(System.out); }