Spring拥有两大特性:IOC(控制反转),AOP(面向切面编程)。
Spring注解
Spring为我们提供了多个方便的注解,例如:
@Controller:标明为控制层组件
@Service:服务层组件
@Repository:DAO层
@Compoent:标明是受Spring本身所管理的一个组件
@Bean:注解的方法会产生一个Bean对象,该对象由Spring管理并放到IoC容器中
@Autowired和@Resource 这两个注解用的比较多,这里就不做阐述了
接下来我们说说控制反转(IOC)
控制反转,简单点说,就是创建对象的控制权,被反转到了Spring框架上。
通常,我们实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工交给了Spring容器。
IOC主要依靠依赖注入的方式去实现
组件不做定位查询,只提供标准的Java方法让容器去决定依赖关系。容器全权负责组件的装配,把符合依赖关系的对象通过Java Bean属性或构造方法传递给需要的对象。
IOC容器
IoC容器:具有依赖注入功能的容器,可以创建对象的容器。IoC容器负责实例化、定位、配置应用程序中的对象并建立这些对象之间的依赖。
依赖注入
依赖注入:又叫DI,由IoC容器动态地将某个对象所需要的外部资源(包括对象、资源、常量数据)注入到组件(Controller, Service等)之中。简单点说,就是IoC容器会把当前对象所需要的外部资源动态的注入给我们。
Spring依赖注入的方式主要有四个,基于注解注入方式、set注入方式、构造器注入方式、静态工厂注入方式。我们一般都使用注解注入,配置较少,比较方便。
面向切面编程(AOP)
AOP:AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。从而达到了 将不同的关注点分离出来的效果。
以下图为例:
业务ABC现在需要一个相同的操作,传统方法我们可能需要在ABC中都加入相关操作代码,而应用AOP就可以只写一遍代码,ABC共用这段代码。并且,当ABC需要增加新的操作时,可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。
AOP三大关键概念:Pointcut、Advice和Advisor。
Pointcut(切入点)
介绍之前,先得清楚Join Point(连接点)的概念。oin Point指的是程序运行中的某个阶段点,如某个方法调用、异常抛出等。
Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发。
org.springframework.aop.Pointcut 接口用来指定通知到特定的类和方法。
Pointuct.java源码如下:
public interface Pointcut {
//用来将切入点限定在给定的目标类中
ClassFilter getClassFilter();
//用来判断切入点是否匹配目标类给定的方法
MethodMatcher getMethodMatcher();
Pointcut TRUE = TruePointcut.INSTANCE;
}
在接口Pointcut中,主要包含两个接口:ClassFilter和MethodMatcher,有利于代码的重用。
Advice(通知)
Advice是某个连接点所采用的处理逻辑,也就是向连接点注入的代码。前面示例中提取出来输出日志信息的代码就是一个Advice,表示要在Join Point加入这段代码。
Advisor
Advisor是Pointcut和Advice的配置器,它包括Pointcut和Advice,是将Advice注入程序中Pointcut位置的代码。