代碼:
1.設定檔
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><!-- 配置建立UserDAOImpl的執行個體 --><bean id="userDAO" class="com.springtest1.dao.UserDAOImpl"> </bean><!-- 配置建立UserBizImpl的執行個體 --><bean id="userBiz" class="com.springtest1.biz.UserBizImpl"> <!-- 依賴注入資料訪問層組件 --> <property name="userDAO" ref="userDAO" /></bean><!-- 定義前置通知 --><bean id="logAdvice" class="com.springtest1.aop.LogAdvice"></bean><!-- 定義代理類,名 稱為ub,將通過ub訪問業務類中的方法 --><bean id="ub" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>com.springtest1.biz.UserBiz</value> </property> <property name="interceptorNames"> <list> <value>logAdvice</value> </list> </property> <property name="target" ref="userBiz"></property></bean></beans>
2.編寫商務邏輯層
UserBiz.java
package com.springtest1.biz;public interface UserBiz { //添加使用者public void addUser(String username,String password);//刪除使用者public void delUser(int id);}
UserBizImpl.java
package com.springtest1.biz;import com.springtest1.dao.UserDAO;import com.springtest1.dao.UserDAOImpl;public class UserBizImpl implements UserBiz {//使用UserDAO介面聲明了一個對象//並為其添加set方法,用於依賴注入UserDAO userDAO;public void setUserDAO(UserDAO userDAO){this.userDAO=userDAO;}@Overridepublic void addUser(String username, String password) {// TODO Auto-generated method stub userDAO.addUser( username, password);}@Overridepublic void delUser(int id) {// TODO Auto-generated method stub userDAO.delUser(id); throw new RuntimeException("這是特意拋出的異常資訊。");}}
3.編寫資料訪問層
UserDAO.java
package com.springtest1.dao;public interface UserDAO { //添加使用者public void addUser(String username,String password);//刪除使用者public void delUser(int id);}
UserDAOImpl.java
package com.springtest1.dao;public class UserDAOImpl implements UserDAO {@Overridepublic void addUser(String username, String password) {// TODO Auto-generated method stub System.out.println(username+"使用者添加成功");}@Overridepublic void delUser(int id) {// TODO Auto-generated method stub System.out.println("編號為"+id+"的使用者被刪除");}}
4.編寫AOP切面編程
LogAdvice.java
package com.springtest1.aop;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;import org.apache.log4j.Logger;public class LogAdvice implements MethodBeforeAdvice {private Logger logger=Logger.getLogger(LogAdvice.class);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);}}
5.測試類別
AOPTest.java
package com.springtest1;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.springtest1.biz.UserBiz;public class AOPTest {public static void main(String[] args) {// TODO Auto-generated method stub//載入applicationContext.xml配置ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");//擷取配置中的UserBizImpl執行個體UserBiz userBiz =(UserBiz)context.getBean("ub");userBiz.addUser("zhangsan","123");userBiz.delUser(1);}}
6.截圖