DI(依赖注入)和AOP(面向切面编程)的概念
DI时IoC(控制反转)中的一种方式,而IoC是面向对象编程中的一种设计原则,用来降低代码之间的耦合度。
例子:
public class A {
private AInterface a;
public A() {}
public AMethod() {
a = new AInterfaceImp();
}
}
便可以说A和AInterfaceImp有依赖关系,产生了代码耦合。IoC把耦合从代码中移出去,放到统一的XML文件中,通过容器在需要的时候把依赖关系形成,即把需要的接口实现注入到需要它的类中,就是DI的来源了。IoC类似工厂模式。
AOP允许你把遍布应用各处的功能分离出来形成可重用的组件。目的:确保POJO的简单性
DI的方式
1、构造器注入
package com.yeweiyi.springtest
public class BraveKnight implement Knight {
private Quest quest;
public BraveKnight(Quest quest) {
this.quest = quest; //作为构造器的参数被传入
}
public void embarkOnQuest() {
quest.embark(); //quest与BraveKnight是松耦合的,传入的quest实现了Quest接口即可
}
}
package com.yeweiyi.springtest
public class SlayDragonQuest implement Quest {
//实现了Quest接口,可作为quest注入到Knight中
private PrintStream stream;
public SlayDragonQuest(PrintStream stream) {
this.stream = stream;
}
public void embark() {
stream.println(“Embarking on quest to slay the dragon!”);
}
}
<!—使用xml来装配quest和knight —>
<bean id=“knight” class=“com.yeweiyi.springtest.BraveKnight”>
<!— 构造器传入的参数为id为quest的bean的引用—>
<constructor-arg ref=“quest” />
</bean>
<bean id=“quest” class=“com.yeweiyi.springtest.SlayDraonQuest”>
<constructor-arg value=“#{T(System).out}” />
</bean>
AOP例子
package com.yeweiyi.springtest
//构造一个游吟诗人,目的是在骑士执行任务前、后唱歌
public class Minstrel {
private PrintStream stream;
public Minstrel(PrintStream stream) {
this.stream = stream;
}
public void singBeforeQuest() {
stream.println(“fa lala”);
}
public void singAfterQuest() {
stream.println(“Tee hee hee”);
}
}
如果不使用AOP,需要骑士在调用embark()的前后调用Minstrel的方法。
使用AOP则可以使用XML完成装配。在上述的XML中添加内容。
<!—定义游吟诗人bean—>
<bean id=“minstrel class=“com.yeweiyi.springtest.Minstrel” />
<constructor-arg value=“#{T(System).out}” />
</bean>
<!—配置aop—>
<aop:config>
<!—定义切面为游吟诗人—>
<aop:aspect ref=“minstrel”>
<!—定义切点,切点为调用embark方法的时间点—>
<aop:pointcut id=“embark”
expression=“execution(* *.embarkOnQuest(..))” />
<!— 切点前/后置通知,由before和after指定,pointcut-ref为选择的切点的id,method为调用方法,为切面引用的方法—>
<aop:before pointcut-ref=“embark”
method=“singBeforeQuest” />
<aop:after pointcut-ref=“embark”
method=“singAfterQuest” />
</aop:aspect>
</aop:config>
Spring容器:bean工厂、应用上下文ApplicationContext
两者都可以实现Spring容器,但bean工厂往往太低级,因此常常使用后者。
应用上下文
1、AnnotationConfigApplicationContext:基于Java配置类加载Spring
2、AnnotationConfigWebApplicationContext:基于Java配置类加载Spring Web
3、ClassPathXmlApplicationContext:类路径下,基于XML配置文件加载
4、FileSystemXmlApplicationContext:文件系统下,基于XML配置文件加载
5、XmlWebApplicationContext:Web应用下,基于XML配置文件加载