深入理解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的原理,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章