基于代理类ProxyFactoryBean的AOP实现---环绕通知编码实例
2017-02-11 15:10
417 查看
代码:
1.配置文件
applicationContext.xml
2.数据访问层
UserDAO.java
UserDAOImpl.java
3.编写业务逻辑层
UserBiz.java
UserBizImpl.java
4.编写方面代码
LogAroundAdvice.java
5.测试类
AOPTest.java
6.截图
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+"的用户被删除"); } }
相关文章推荐
- 基于代理类ProxyFactoryBean的AOP实现---后置通知编码实现
- Spring AOP-编程的方式创建代理类(ProxyFactoryBean)
- Spring学习笔记 —— AOP(面向切面编程) 之使用ProxyFactoryBean实现AOP
- Spring AOP实现机制(二)--ProxyFactoryBean---将Spring AOP和Spring IoC容器相结合
- Spring源码分析之ProxyFactoryBean方式实现Aop功能的分析
- Spring源码阅读-使用ProxyFactoryBean实现AOP
- Quartz+Spring实例应用【一】基于Spring的MethodInvokingJobDetailFactoryBean实现
- Spring的AOP实现方式—ProxyFactoryBean配置方式实现源码剖析
- Spring Mvc那点事---(28)Spring Mvc基于ProxyFactoryBean的传统AOP
- ProxyFactoryBean 实现 Aop 功能源码分析
- spring 直接使用ProxyFactoryBean 实现AOP 流程小结
- Spring ProxyFactoryBean 是如何实现所有的AOP proxy都有可能转为Advised接口的?
- Spring Mvc那点事---(29)Spring Mvc基于ProxyFactoryBean的传统AOP使用正则拦截
- 基于代理类ProxyFactoryBean的AOP实现---异常通知编码实例
- spring aop(五)--ProxyFactoryBean创建代理的实现
- 做一个合格的程序猿之浅析Spring AOP源码(十四) 分析ProxyFactoryBean
- Spring AOP小测试(ProxyFactoryBean)
- Spring 通过来AOP 实现前置,环绕,异常通知,注解(转)
- springAOP基于xml的配置前后环绕通知
- Spring -- org.springframework.aop.framework.ProxyFactoryBean