Spring主要分为
控制反转(IOC)和
面向切面编程(AOP)
1、控制反转(IOC)
a.如果不使用Spring,我们一般是通过new关键字实现一个对象的初始化,比如我们如果在多个业务逻辑(Service)中要使用一个Dao对象,那么我们必须在每个业务逻辑处理类种都通过new的方式去生成Dao对象(确切的说,对象的生成是由程序员进行控制的),如下:
public class ServiceA {
private Dao dao = new Dao();
}
public class ServiceB {
private Dao dao = new Dao();
}
public class ServiceC {
private Dao dao = new Dao();
}
很显然,这3个业务逻辑类种的dao对象并不是同一个
b.如果使用了Spring,我们一般是在Spring上下文配置文件中(也即applicationContext.xml),或者是直接添加@Controller、@Service、@Repository、@Component其中任一个注解。然后在业务逻辑类中直接注入即可。这样对象的生成并不是由程序员进行控制,因为我们并没有通过new关键字去创建这个对象,对象是由Spring容器进行管理(负责其创建、初始化、销毁等)的。这样相当于对象的生成权限由程序员变为Spring容器了。所以说是控制反转了。即java对象的生成由程序员反转为Spring容器。如下图,这样的好处也是比较明显的,那就是不同Service类中的dao对象是同一个。
@Service
public class ServiceA {
@Autowired
private Dao dao;
}
@Service
public class ServiceB {
@Autowired
private Dao dao;
}
@Service
public class ServiceC {
@Autowired
private Dao dao;
}
2、面向切面编程
通常,我们在编程中会有这样一种需求,那就是比如我做多个操作,都要验证一个用户的权限;或者我调用某个方法前,我都想打印下日志。如果采用硬编码方式,那么我们我们需要在每一个方法中都要加入这段重复的代码。某天如果我们想要重新修改下验证逻辑,那我们需要把每个方法里面的验证方法都要同步修改下,这样不仅显得麻烦,还极有可能出错。AOP恰好解决了这一个问题。
AOP的原理是基于动态代理实现的。AOP一般用于日志、缓存、拦截器、事务等场景。