代码:
1.配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="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>
<!-- 定义后置通知 -->
<bean id="afterLogAdvice" class="com.springtest1.aop.AfterLogAdvice"></bean>
<!-- 定义异常通知 -->
<bean id="throwsLogAdvice" class="com.springtest1.aop.ThrowsLogAdvice"></bean>
<!-- 定义环绕通知 -->
<bean id="logAroundAdvice" class="com.springtest1.aop.LogAroundAdvice"></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>
<!-- 织入后置通知 -->
<value>afterLogAdvice</value>
<!-- 织入异常通知 -->
<value>throwsLogAdvice</value>
<!-- 织入环绕通知 -->
<value>logAroundAdvice</value>
</list>
</property>
<property name="target" ref="userBiz"></property>
</bean>
</beans>
2.数据访问层
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 {
@Override
public void addUser(String username, String password) {
// TODO Auto-generated method stub
System.out.println(username+"用户添加成功");
}
@Override
public void delUser(int id) {
// TODO Auto-generated method stub
System.out.println("编号为"+id+"的用户被删除");
}
}
3.编写业务逻辑层
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;
}
@Override
public void addUser(String username, String password) {
// TODO Auto-generated method stub
userDAO.addUser( username, password);
}
@Override
public void delUser(int id) {
// TODO Auto-generated method stub
userDAO.delUser(id);
throw new RuntimeException("这是特意抛出的异常信息!");
}
}
4.编写方面代码
LogAroundAdvice.java
package com.springtest1.aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
public class LogAroundAdvice implements MethodInterceptor {
private Logger logger=Logger.getLogger(LogAdvice.class);
public Object invoke(MethodInvocation invocation) throws Throwable {
// TODO Auto-generated method stub
long beginTime=System.currentTimeMillis();
invocation.proceed();
long endTime=System.currentTimeMillis();
//获取被调用的方法名
String targetMethodName=invocation.getMethod().getName();
//日志格式字符串
String logInfoText="环绕通知: "+targetMethodName+"方法调用前时间"+beginTime+"毫秒,"+"调用后时间"+endTime+"毫秒";
//将日志信息写入配置的文件中
logger.info(logInfoText);
return null;
}
}
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.截图
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);
}
}
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;
}
@Override
public void addUser(String username, String password) {
// TODO Auto-generated method stub
userDAO.addUser( username, password);
}
@Override
public void delUser(int id) {
// TODO Auto-generated method stub
userDAO.delUser(id);
throw new RuntimeException("这是特意抛出的异常信息!");
}
}
package com.springtest1.dao;
public class UserDAOImpl implements UserDAO {
@Override
public void addUser(String username, String password) {
// TODO Auto-generated method stub
System.out.println(username+"用户添加成功");
}
@Override
public void delUser(int id) {
// TODO Auto-generated method stub
System.out.println("编号为"+id+"的用户被删除");
}
}