Spring 思想入门
Spring主要有2个重点思想:
1、DI (Dependency Injection):依赖注入思想。又名“控制反转”。
2、AOP:面向切面编程。
一、依赖注入思想
假设有一个业务逻辑实现的是 “人吃饭” 这个功能。
1、硬编码方法实现:
public classPeopleEatFood {
public void eat(){
Foodf= new Egg();
f.eaten();
}
}
2、工厂模式实现:
工厂模式就是定义一个工厂类,这个类的职责就是创建实现了某个接口的类的对象。比如“食品工厂”。
这里把表示食物的字符串写到配置文件(food.prop)中,这样就不需要在eaten中硬编码了,实现了“解耦合”。
public classFoodFactory {
public void eat() throwInvalidPropertiesFormatException,IOException{
FoodFactoryfc=newFoodFactory();
Propertiesp=newFoodFactory();
p.loadFromXML(newFileInputStream(food.prop));
Foodf=fc.getFood(p.getProperty("food"));
f.eaten();
}
}
3、“食品工厂”的反射机制实现
想要动态的添加或者停产某些商品,用反射机制实现——“动态更新”和“配置式开发”。
现在比较提倡:将所有的功能开发为组件,组件之间通过配置文件松耦合,也可以通过配置文件装配软件的功能。
public classFoodFactoryByReflect{
punlicFood getFood(String name){
Foodf=null;
try{
f=(Food)Class.forName(name).newInstance();
}catch(Exception){
e.printStackTrace();
}
return f;
}
}
4、吃饭问题的反转控制:
Person不再关心吃什么食物,将控制权交给别人,自己只关心自己逻辑的思路称为“控制反转”(Inversion of Control, IoC)。Person依赖的食物交给框架管理,所以控制反转也称为依赖注入(DependencyInjection, DI),由框架将对象依赖的类注入给它。
public classPerson{
private String name="XiaoMing";
private Food food=null;
public void setFood(Food f){
food=f;
}
public void eat(){
food.eaten();
}
}
二、面向切面的编程
1、在软件开发中通常需要多个模块,每个模块负责一向功能。 但有的模块作为辅助性质,它与其他所有模块相关,导致了严重的耦合。
2、面向切面的编程思想,这个功能是横跨整个软件的。所有模块仅关心自己的事情,所有的记录应由日志模块来完成。
解耦合的编程实现,C和C++较难实现。而JAVA使用的方法是:截获一个方法的调用,通过java.lang.reflect.Proxy调用(反射机制的包库)。
面向切面这种机制需要从外部对每个模块的方法进行监控,用Proxy实现。
3、Spring中的面向切面编程:
在applicationContext.xml中天剑Father的bean定义后,继续定义切面:
切面使用<aop:config>标签描述。
切面处理的类用<aop.aspect>声明。
定义切入点:<aop:pointcut>,就是要监听的对象。
定义一个具体事件 <aop.before>