Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
在传统的JAVA开发过程中,我们可能会写出类似下面这些代码:
public class BookManage {
public List<Books> queryAllBooks(){
BookDao dao=new BookImpl();
List<Books> ls=dao.queryAll();
return ls;
}
public boolean deleteBook(String id){
BookDao dao=new BookImpl();
boolean issuccess=false;
if(dao.deleteBook(id)>0){
issuccess=true;
}
return issuccess;
}
}
这种代码有一个很大的弊端:我们每调用一次这些方法都会实例化一个新的BookImpl对象,这显然是不必要的。为此,我们可以对它作出改进:
public class BookManage {
public List<Books> queryAllBooks(BookDao dao){
List<Books> ls=dao.queryAll();
return ls;
}
public boolean deleteBook(String id, BookDao dao){
boolean issuccess=false;
if(dao.deleteBook(id)>0){
issuccess=true;
}
return issuccess;
}
}
我们可以看到,这次代码不同于上面代码的是,所依赖的对象是作为参数传进来的。类似于这种方式,把所依赖的对象交给容器管理,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。这种方式称为依赖注入。
在前一个代码中,所依赖对象由方法主动创建,其控制权在BookManage对象中。采用依赖注入后,容器全权负责组件的装配,控制权交到了容器手中,称为控制反转。
在生活中,你可能会遇到这种情况:你去一个酒店就餐,在你进酒店之前,服务员会说“您好,欢迎光临”,而在你就餐完毕出酒店后,服务员会说“请慢走,欢迎您的下次光临”。把这一事件写成程序,可能会类似下面代码:
public class Waiter { //服务员类
public void beforeYouCome(){ //你进酒店之前调用的方法
System.out.println("您好,欢迎光临");
}
public void afterYouLeave(){ //你出酒店之后调用的方法
System.out.println("请慢走,欢迎您的下次光临");
}
}
public class Guest { //客人类
Waiter waiter = new Waiter();
public void goToRestaurant(){
waiter.beforeGuestCome();
System.out.println("进行就餐");
waiter.afterGuestLeave();
}
}
你仔细想想的话可能会发现,服务员的问候事件应该由客人来管理吗?这显然是不合理的。为此,面向切面应运而生。在使用面向切面编程时,我们仍在一个地方定义通用功能,但是可以通过声明的方式定义这个功能要以何种方式在何处应用,而无需修改受影响的类。在本例中,我们可以将客人声明为切点,将服务员声明为切面。在面向切面术语中,切面的工作被称为通知,通知定义了切面是什么以及何时使用。
原文:https://www.cnblogs.com/miou/p/12240106.html