深入理解spring核心技术---Spring中的AOP

上一篇博客中给大家简单的介绍了一下IOC容器,大家肯定对IOC还很陌生,没关系,大家只需要简单的了解下一就可以了,后面会给大家详细的介绍spring实现IOC的原理。既然已经知道了IOC容器的概念,那么我们今天就来聊聊spring框架中另外的一个核心部分—-AOP。
AOP全称叫做Aspect Oriented Programming 即面向切面编程。大家可能会好奇,AOP和OOP有什么关系吗?
先给大家简单的解释一下AOP的作用就是把我们程序重复的代码抽取出来,在需要执行的时候,使用特定的手段,在不修改源码的基础上,对我们的已有方法进行增强。
说的好像有点抽象,还是先来看看下面这段代码吧:

public interface ICusService {

    public void saveCustomer(Customer customer);

    public List<Customer> findAllCustomer();

    public void removeCustomer(Customer customer);

    public Customer findCustomerById(Long custId);

    public void updateCustomer(Customer customer);
}

上述代码是一个业务层接口的代码,主要定义了增删该查几个基本的方法,该接口的实现类代码如下:

public class CusServiceImpl implements ICusService {

    private ICustomerDao customerDao;

    @Override
    public void saveCustomer(Customer customer) {
        Session s = null;
        Transaction tx = null;
        try{
            s = HibernateUtil.getCurrentSession();
            tx = s.beginTransaction();
            customerDao.saveCustomer(customer);
            tx.commit();
        }catch(Exception e){
            tx.rollback();
            throw new RuntimeException(e);
        }   
    }
    @Override
    public List<Customer> findAllCustomer() {
        Session s = null;
        Transaction tx = null;
        try{
            s = HibernateUtil.getCurrentSession();
            tx = s.beginTransaction();
            List<Customer> customers = customerDao.findAllCustomer();
            tx.commit();
            return customers;
        }catch(Exception e){
            tx.rollback();
            throw new RuntimeException(e);
        }
    }
    @Override
    public void removeCustomer(Customer customer) {
        Session s = null;
        Transaction tx = null;
        try{
            s = HibernateUtil.getCurrentSession();
            tx = s.beginTransaction();
            customerDao.removeCustomer(customer);
            tx.commit();
        }catch(Exception e){
            tx.rollback();
            throw new RuntimeException(e);
        }
    }
    @Override
    public Customer findCustomerById(Long custId) {
        // TODO Auto-generated method stub
        Session s = null;
        Transaction tx = null;
        try{
            s = HibernateUtil.getCurrentSession();
            tx = s.beginTransaction();
            Customer c = customerDao.findCustomerById(custId);
            tx.commit();
            return c;
        }catch(Exception e){
            tx.rollback();
            throw new RuntimeException(e);
        }
    }
    @Override
    public void updateCustomer(Customer customer) {
        // TODO Auto-generated method stub
        Session s = null;
        Transaction tx = null;
        try{
            s = HibernateUtil.getCurrentSession();
            tx = s.beginTransaction();
            customerDao.updateCustomer(customer);
            tx.commit();
        }catch(Exception e){
            tx.rollback();
            throw new RuntimeException(e);
        }
    }
}



不知道大家发现了什么问题没有,仔细看的话不难发现,上述业务层接口的实现类中存在大量的重复代码,即每个方法中事务控制的代码都是重复的,大家可以想象一下,如果项目中有100个业务类的话那么将会有多少重复的代码??
针对这个问题,我们就需要抽取出重复的代码,而在spring框架中我们就不需要自己进行手动抽取了,因为spring中支持AOP编程,这就是今天要给大家介绍的AOP编程的思想。
到了这里相信大家对AOP有了一点认识了吧,**那么spring中是怎么实现AOP的呢?
先来想一下,我们怎么解决上述代码中重复的代码呢?
毫无疑问,动态代理就是一种很不错的方式,关于动态代理的概念大家应该都不陌生吧,**
回到今天的主题上,关于AOP现在大家应该都知道是怎么一回事了吧,好多书上都有这样一句话,AOP是OOP的延续,OOP是一种很好的设计思想,但是随着业务需变得越来越复杂,对于一些特定的场合OOP的设计方法也暴露出了一些问题,就比如上述代码中的事务控制。
在Spring中,为了将那些与业务无关,却为业务模块所共同调用的逻辑代码封装起来,于是就提供了面向切面的支持,也称为SpringAOP,这样就可以有效的减少了系统中的重复代码,同时也可以达到模块间的松耦合。
现在大家知道了AOP是个什么东西了吧,顺便说一下,目前最为流行的AOP只有两个,SpringAOP就是其中之一,还有一个就是AspectJ,(这里主要介绍Spring中的AOP,大家可以自行百度了解这个AOP框架)
继续回到这次的话题,既然已经知道了SpringAOP的一些概念,那么我们就应该要知道Spring中AOP的实现方式,
在Spring中主要通过JDK的动态代理和Cglib代理实现AOP的功能的,这两种方式的应用场景有所不同,
当明确指定目标类实现的业务接口时,比较适合使用动态代理来实现,
没有指定目标类实现的业务接口时在最好的方式自然就是使用Cglib进行字节码增强的技术来实现,
总结下一,AOP(面向切面编程)就是为了减少程序中的重复代码,提高开发效率,更易于后期项目的维护

好了,到这里相信大家已经对AOP有了一定的认识,在下一篇博客中将和大家一起讨论动态代理和Cglib代理两种实现AOP的原理,

猜你喜欢

转载自blog.csdn.net/qq_38701478/article/details/82354798