Spring--基於代理類ProxyFactoryBean的AOP實現。本站提示廣大學習愛好者:(Spring--基於代理類ProxyFactoryBean的AOP實現)文章只能為提供參考,不一定能成為您想要的結果。以下是Spring--基於代理類ProxyFactoryBean的AOP實現正文
面向方面編程。
基於代理類的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的用戶被刪除