spring IoC和AOP的原理

下面为spring的主要原理:

IoC(Inversion of Control):依赖注入, IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),这要就把应用

和对象之间解耦,控制权交给了外部容器。即Don’t call me ,I’ll call you!所以IoC也称DI(依赖注入)对象的创建和维护依赖于外部

容器.

class UserService{

private UserDao userDao = new UserDaoImpl();  //让业务层与数据访问层耦合在一起,不利用以后模块的替换.

private UserDao userDao_IoC = null;

public void SetUserDao(UserDao userDao){

this.userDao_IoC = userDao

}

public void save(User user){

userDao.save(user);

}

}

AOP(Aspect Oriented Programming):面向切面编程。就是把一些贯穿在各个模块之间相同的功能抽象出来,然后封装成一个面。

AOP一般都是通过代理来实现,利用代理就有目标对象是什么,拦截哪些点(方法),拦截后要做什么。

JoinPoint(连接点):被拦截到的点. Advice(通知):拦截JoinPoint之前与之后要做的事。

PointCut(切入点):对joinPoint进行拦截的定义。Target(目标对象):代理的目标对象。

对于异常处理,日志功能,权限的检查,事务等都是贯穿到各个模块之中,因此进行AOP.

代理技术有面向接口和生成子类.

public Object getProxy(final Object targetObj) { 

Obejct obj = Proxy.newProxyInstance( 

    targetObj.getClass().getClassLoader(),       //被代理类的类加载器

    targetObj.getClass().getInterfaces(),   //被代理类接口的字节码

    new InvocationHandler() {   //类似于一个回调函数 代理功能就在里面实现

        @Override 

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

    try{ 

beforeAdvice();   //前置通知

        method.invoke(targetObj, args);  //拦截的点

afterAdvice();    //后置通知

    }catch (Exception e) { 

        exceptionAdvice();   //异常通知

    }finally{ 

                        finalAdvice();   //必须执行通知

                    } 

                   return obj; 

 } 

 }); 

 }

还一个用子类实现的同理 要采用CGlib库来实现 JDK6之前未提供,估计JDK以后会提供。

    原文作者:AOP
    原文地址: https://blog.csdn.net/u011257574/article/details/50976882
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞