Spring_AOP_Proxy AOP靜態代理的實現,springaop動態代理

來源:互聯網
上載者:User

Spring_AOP_Proxy AOP靜態代理的實現,springaop動態代理

Spring中AOP的靜態代理實現:

在我們的項目中會有日誌記錄和許可權管理及其他與商務邏輯無關的內容,這些我們需要抽取到單獨得模組去處理這些內容!

下面是AOP的靜態代理實現,AOP圖解;


用日誌的例子來說明,下面我們先建立一個專門記錄日誌的類:

package com.spring.log;import java.util.Date;/** * 日誌 * @author sunlight * */public class Logger {public static void info(String info){//此處編輯日誌輸出內容System.out.println(new Date()+"===========>>"+info);}}

我們在執行資料庫操作的時候添加日誌記錄,編寫一個User的靜態代理的Dao類並實現IUserDao介面,代碼如下:
package com.spring.dao;import javax.annotation.Resource;import org.springframework.stereotype.Component;import com.spring.log.Logger;import com.spring.model.User;/** * 在沒有原始碼的情況或者許可權控制及部分開放 代理類 *  * @author sunlight * */@Component("userProxyDao")public class UserProxyDao implements IUserDao {private IUserDao userDao;public IUserDao getUserDao() {return userDao;}@Resourcepublic void setUserDao(IUserDao userDao) {this.userDao = userDao;}@Overridepublic void add(User user) {// 不破壞原來的代碼Logger.info("添加了使用者");userDao.add(user);}@Overridepublic void delete(int id) {Logger.info("刪除了使用者");userDao.delete(id);}@Overridepublic User load(int id) {return null;}}

在Service處注入時,我們使用靜態代理的UserProxyDao注入,代碼如下:
package com.spring.service;import javax.annotation.Resource;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;import com.spring.dao.IUserDao;import com.spring.model.User;//@Component(value="userService")@Service("userService")//業務層一般用@Service注入public class UserService implements IUserService {private IUserDao userDao;public IUserDao getUserDao() {return userDao;}//預設通過名稱注入,在JSR330中提供了@Inject來注入@Resource(name="userProxyDao")//此處用代理類注入public void setUserDao(IUserDao userDao) {this.userDao = userDao;}@Overridepublic void add(User user) {userDao.add(user);}@Overridepublic void delete(int id) {userDao.delete(id);}@Overridepublic User load(int id) {return userDao.load(id);}}

其他代碼詳見:Spring中IOC的Annotation實現

執行結果:





使用Spring AOP代理方式實現聲明式事務的原理

首先將sessionFactory注入到HibernateTransactionManager中,再將HibernateTransactionManager對象注入到TransactionProxyFactoryBean對象中~應該還有一段對sessionFactory的定義

AOP就是面向代理的模式,本來一個應用程式要對某個對象進行操作的,但是這個對象中包含了很多與他本身不相關的商務邏輯,不如日誌、鎖等等。所以就要想辦法把這些無關的東西全部抽離出來。被抽離過的對象就是被代理對象。

此時應用程式再調用的時候,會去調用代理對象,這個對象中包含了對被代理對象的調用以及被抽離出來的無關的商務邏輯方法。被代理對象則是純粹的商務邏輯。

至於觸發的話因為在容器起來的時候,比如tomcat或者jboss,會定義到指定的xml檔案然後這些誰注入到誰的東西會被自動識別的。
 
AOP的實現方式有哪幾種?

常見有三種實現方式:
1.利用代理模式動態實現AOP,從具體的技術細節又可以分為靜態代理,動態代理,CGLIB產生子類代理。
2.使用先行編譯的方法靜態進行代理。
3.使用自訂載入器的方法動態進行代理。
後兩種代理都可以代理更多的內容(比如建構函式,靜態方法,靜態塊,final方法,私人方法等)。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.