上一篇博客中给大家简单的介绍了一下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的原理,