参考资料 关于 Spring AOP (AspectJ) 你该知晓的一切
1.Spring Ioc(控制反转,依赖注入,两者意思相同)和Aop(面向切面编程)
Ioc:
作用:通过Ioc容器实现对对象的管理,实现各组件之间的解耦
实现原理:反射
可以借助工厂+反射来理解
图示:
代码
interface Fruit{
· public void eat();
· }
· class Apple implements Fruit{
· public void eat(){
· System.out.println("吃苹果");
· }
· }
· class Orange implements Fruit{
· public void eat(){
· System.out.println("吃橘子");
· }
· }
· class Factory{ //工厂类
· public static Fruit getInstance(String className){
· Fruit f=null;
· if(className.equals("apple")){
· f=new Apple();
· }
· if(className.endsWith("orange")){
· f=new Orange();
· }
· return f;
· }
· }
· public class FactoryDemo{
· public static void main(String args[]){
· Fruit f=Factory.getInstance("apple");
· f.eat();
· }
· }
Aop:
含义:将业务核心模块与部分功能模块分离,是功能模块在特定的切入点切入核心模
块
理解:诸如日志,权限,事务,性能监测等业务几乎涉及到了所有的核心模块,如果
把这些特殊的业务代码直接到核心业务模块的代码中就会造成上述的问题,而
工程师更希望的是这些模块可以实现热插拔特性而且无需把外围的代码入侵
到核心模块中,这样在日后的维护和扩展也将会有更佳的表现,假设现在我们
把日志、权限、事务、性能监测等外围业务看作单独的关注点(也可以理解为
单独的模块),每个关注点都可以在需要它们的时刻及时被运用而且无需提前
整合到核心模块中,这种形式相当下图:
从图可以看出,每个关注点与核心业务模块分离,作为单独的功能,横切几个核心业务模块,这样的做的好处是显而易见的,每份功能代码不再单独入侵到核心业务类的代码中,即核心模块只需关注自己相关的业务,当需要外围业务(日志,权限,性能监测、事务控制)时,这些外围业务会通过一种特殊的技术自动应用到核心模块中,这些关注点有个特殊的名称,叫做“横切关注点”,上图也很好的表现出这个概念,另外这种抽象级别的技术也叫AOP(面向切面编程)