5.增强(xml配置方式)

一.配置文件方式

1.UserServiceImpl.java

package cn.qf.spring.service.impl;

import cn.qf.spring.dao.impl.UserDaoImpl;
import cn.qf.spring.pojo.User;
import cn.qf.spring.service.UserService;

public class UserServiceImpl implements UserService{
	//注入方式2:构造注入,通过构造方法给属性赋值
	public UserServiceImpl() {}
	public UserServiceImpl(UserDaoImpl udi) {
		this.udi = udi;
	}
	
	//注入方式1:设值注入
	private UserDaoImpl udi;
	public UserDaoImpl getUdi() {
		return udi;
	}
	public void setUdi(UserDaoImpl udi) {
		this.udi = udi;
	}
	
	//对应cn.qf.spring.dao.impl中的addUser(User user)方法
	public void addUser(User user) {
		//事物处理
		//异常处理
		//记录日志
		//只完成核心功能代码
		this.udi.addUser(user);
	}
	
}

2.AddUserServlet.java

package cn.qf.spring.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.qf.spring.pojo.User;
import cn.qf.spring.service.UserService;

/**
 * Servlet implementation class AddUserServlet
 */
public class AddUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddUserServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		User user = new User();
		user.setUserCode(request.getParameter("uc"));
		user.setUserName(request.getParameter("un"));
		user.setPassword(request.getParameter("up"));
		//获取UserServiceImpl类的对象
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService us = (UserService)ac.getBean("UserService");
		us.addUser(user);
		PrintWriter pw = response.getWriter();
		pw.print("success");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

3.前置和后置增强
OperLog.java

package cn.qf.spring.aop;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;

public class OperLog {
	//记录日志的方法
	public static final Logger logger=Logger.getLogger(OperLog.class);
	
	//前置增强方法:在执行核心功能之前调用的方法
	//记录日志
	//JoinPoint 是springAOP里的对象:连接点对象
	//作用:把spring的代理对象所执行的核心方法信息都封装在此对象中:方法名,返回值,参数列表
	//jp.getTarget()  获取核心方法所在的类
	//jp.getSignature() 核心方法的名字
	//jp.getArgs() 获取核心方法的参数列表,是数组
	public void beforeLog(JoinPoint jp) {
		logger.debug("执行了"+jp.getTarget()+"类里的"+jp.getSignature()
		+"方法"+",方法的参数列表为:"+Arrays.toString(jp.getArgs()));
	}
	
	//后置增强方法:在执行核心功能之后调用的方法
	//参数1:连接点对象,封装了核心方法的信息
	//参数2:方法的执行结果,代理对象会自动传递实参给此方法
	public void afterLog(JoinPoint jp,Object result) {
		logger.debug(jp.getTarget()+"类中的"+jp.getSignature()+"方法执行结束,方法的返回值:"
				+result);
	}
}

4.==异常处理增强和最终增强
ExceptionLog.java

package cn.qf.spring.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;

public class ExceptionLog {
	private static final Logger logger = Logger.getLogger(ExceptionLog.class);
	
	//异常处理增强:当核心方法发生异常后,执行的通用功能
	public void catchException(JoinPoint jp,RuntimeException ex) {
		logger.error(jp.getTarget()+"类里的"+jp.getSignature()+"方法发生异常,异常信息如下:"
				+ ex.getMessage());
	}
	
	//最终增强:当执行核心方法的finally语句块时,执行的通用功能
	public void runFinally(JoinPoint jp) {
		logger.debug(jp.getTarget()+"类里的"+jp.getSignature()+"方法执行结束");
	}
}

5.环绕增强方式(相当于以上几种增强的集合)
Arround.java

package cn.qf.spring.aop;

import java.util.Arrays;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;

public class Arround {
	private static final Logger logger = Logger.getLogger(Arround.class);
	//环绕增强,只有一个方法就行
	public Object arroundLogger(ProceedingJoinPoint jp) {
		//声明变量存放目标方法的返回值
		Object result = null;
		//1.相当于前置增强的方法
		logger.debug("环绕增强--执行了:"+jp.getTarget()+"对象里的:"+jp.getSignature()+"方法,"
				+"方法的参数是:"+Arrays.toString(jp.getArgs()));
		//相当于异常处理增强和最终增强
		try {
			//调用目标对象的方法,proceed()是代理方法
			result = jp.proceed();
			
		}  catch (Throwable e) {
			//2.异常处理增强
			logger.error("环绕增强--执行"+jp.getSignature()+"方法发生异常:异常信息如下:"+e.getMessage());
			e.printStackTrace();
		} finally {
			//3.相当于最终增强
			logger.debug("环绕增强--执行"+jp.getSignature()+"方法结束");
		}
		//4.相当于后置增强
		logger.debug("环绕增强--执行了后置增强方法");
		return result;
	}
}

6.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:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.2.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
	
	<!-- 配置UserDaoImpl类的对象 -->
	<bean id="dao" class="cn.qf.spring.dao.impl.UserDaoImpl"></bean>
	
	<!-- 配置UserServiceImpl类的对象 -->
	<bean id="UserService" class="cn.qf.spring.service.impl.UserServiceImpl">
		<!-- 1.设值注入 -->
		<!--
		<property name="udi" ref="dao"></property>
		-->
		
		<!-- 2.构造注入 -->
		<constructor-arg>
			<ref bean="dao"/>
		</constructor-arg>
	</bean>
	
	<!-- 一.配置增强方法类的对象 -->
	<bean id="theLog" class="cn.qf.spring.aop.OperLog"></bean>
	<bean id="theException" class="cn.qf.spring.aop.ExceptionLog"></bean>
	<bean id="theArround" class="cn.qf.spring.aop.Arround"></bean>
	<!-- 进行aop的配置 -->
	<aop:config>
		<!-- 二.配置切入点(执行的核心方法)
			有两种配置方式:
			1.明确核心方法的名字
			2.通过通用表达式来配置核心方法:代表一类方法
		 -->
		 <aop:pointcut expression="execution(public void addUser(cn.qf.spring.pojo.User))" 
		 			   id="addUserPoint"/>
		 		   
		 <!-- 在切面中配置增强方法   切面:所有增强方法的集合 -->
		 <aop:aspect ref="theLog">
		 	<!-- 在切面中指定哪种增强:前置,后置,异常处理,最终 -->
		 	<!-- aop:before  前置增强 -->
		 	<aop:before method="beforeLog" pointcut-ref="addUserPoint"/>
		 	<!-- aop:after-returning 后置增强 -->
		 	<aop:after-returning method="afterLog" pointcut-ref="addUserPoint" returning="result"/>
		 </aop:aspect>
		 
		 <!-- 在切面中配置异常处理增强,最终增强 -->
		 <aop:aspect ref="theException">
		 	<!-- 异常处理增强 -->
		 	<aop:after-throwing method="catchException" pointcut-ref="addUserPoint" throwing="ex"/>
		 	<!-- 最终增强 -->
		 	<aop:after method="runFinally" pointcut-ref="addUserPoint"/>
		 </aop:aspect>
		 
		 
		 <!-- 三.配置环绕增强 -->
		 <aop:aspect ref="theArround">
		 	<aop:around method="arroundLogger" pointcut-ref="addUserPoint"></aop:around>
		 </aop:aspect>
	</aop:config>
	
</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值