程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring--基於代理類ProxyFactoryBean的AOP實現

Spring--基於代理類ProxyFactoryBean的AOP實現

編輯:關於JAVA

Spring--基於代理類ProxyFactoryBean的AOP實現。本站提示廣大學習愛好者:(Spring--基於代理類ProxyFactoryBean的AOP實現)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring--基於代理類ProxyFactoryBean的AOP實現正文


AOP—Aspect-oriented Programming

面向方面編程。

基於代理類的ProxyFactoryBean的AOP實現

ProxyFactoryBean是Factory接口的實現類。FactoryBean負責實例化一個Bean,

<bean id="logAdvice" class="com.xue.aop.LogAdvice"></bean>
而ProxyFactoryBean負責創建代理實例,他內部使用FactoryBean來完成這一工作。使用這個是創建AOP的最基本的方式。
例如:
數據訪問層:
項目的Userao接口中聲明兩個方法
public interface UserDao {
    public void addUser(String username,String password);
    public void delUser(int id);
}

UserDao的實現類:

public class UserDaoImpl implements UserDao {
    @Override
    public void addUser(String username, String password) {
        System.out.println(username+"用戶添加成功");
    }

    @Override
    public void delUser(int id) {
        System.out.println("編號為"+id+"的用戶被刪除");
    }
}

業務邏輯層:

在UserBiz中,聲明兩個方法:

public interface UserBiz {
    public void addUser(String username, String passworld);

    public void delUser(int id);
}

UserBiz的實現類:

public class UserBizImpl implements UserBiz {
    UserDao userDao;
    //set方法用於依賴注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void addUser(String username, String passworld) {
        userDao.addUser(username,passworld);
    }

    @Override
    public void delUser(int id) {
        userDao.delUser(id);
    }
}

方面代碼:

實現特定功能的方面代碼在AOP概念中被稱為“通知(Advice)”。通知分為前置通知、後置通知、環繞通知和異常通知。

前置通知:(log4j的配置不做介紹)

public class LogAdvice implements MethodBeforeAdvice {
    private Logger logger=Logger.getLogger(LogAdvice.class);
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        //獲取被調用的類名
        String targetClassname=target.getClass().getName();
        //獲取被調用的方法名
        String targetMethodname=method.getName();
        String logInfoText="前置通知:"+targetClassname+"類的"+targetMethodname+"方法開始執行";
        logger.info(logInfoText);
    }
}

配置ApplicationContext.xml文件:

    <bean id="userDao" class="com.xue.dao.UserDaoImpl"></bean>
    <bean id="userBiz" class="com.xue.dao.UserBizImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="logAdvice" class="com.xue.aop.LogAdvice"></bean>
    <!--使用spring代理工廠定義一個代理,通過他訪問業務類中的方法-->
    <bean id="ub" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!--指定代理接口-->
        <property name="proxyInterfaces">
            <value>com.xue.dao.UserBiz</value>
        </property>
        <!--指定通知-->
        <property name="interceptorNames">
            <list>
                <value>logAdvice</value>
            </list>
        </property>
        <!--指定目標對象-->
        <property name="target" ref="userBiz"></property>
    </bean>

測試類:

public class Test {

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserBiz userBiz= (UserBiz) context.getBean("ub");
        userBiz.addUser("zhangsan","123");
        userBiz.delUser(1);
    }
}

總結:雖然沒有看過源碼,但個人感覺,測試類中UserBiz通過getBean(“ub”)獲取實例,是ProxyFactoryBean會自動在配置的xml中返回實例,並且讓指定的通知在方法執行前執行。

LogAdvice(指定的通知)做的事:獲取類名、方法名,將其寫入日志中。

結果:

 

[INFO ] [18:02:32] com.xue.aop.LogAdvice - 前置通知:com.xue.dao.UserBizImpl類的addUser方法開始執行
zhangsan用戶添加成功
[INFO ] [18:02:32] com.xue.aop.LogAdvice - 前置通知:com.xue.dao.UserBizImpl類的delUser方法開始執行
編號為1的用戶被刪除

 

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved