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

基于代理类ProxyFactoryBean的AOP实现---后置通知编码实现

2017-02-11 14:47 585 查看
    代码:

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>

<!-- 定义代理类,名 称为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>
</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;
}

@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("这是特意抛出的异常信息!");
}

}


 

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 {

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

}

 

4.编写方面代码

  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);
}
}

 

  AfterLogAdvice.java

package com.springtest1.aop;

import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
public class AfterLogAdvice implements AfterReturningAdvice {

private Logger logger=Logger.getLogger(LogAdvice.class);
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
// TODO Auto-generated method stub
//获取被调用的类名
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.截图



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