深入理解spring核心技术02---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的原理,

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值