您的位置:首页 > 运维架构

基于代理类ProxyFactoryBean的AOP实现---环绕通知编码实例

2017-02-11 15:10 417 查看
 代码:

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+"的用户被删除");
}

}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: