第一步: 模拟用户权限
package com.inter;
public class Helper {
public static String role = "AAAA";
}
第二步: 业务方法接口
package com.inter;
public interface IDao {
public void addUser();
public void delUser();
public void updateUser();
public void queryUserInf();
}
第三步: 业务实现类
package com.inter.dao;
import com.inter.IDao;
public class UserDao implements IDao {
/* (non-Javadoc)
* @see com.inter.dao.IDao#addUser()
*/
public void addUser() {
System.out.println("增加用户.....");
}
/* (non-Javadoc)
* @see com.inter.dao.IDao#delUser()
*/
public void delUser() {
System.out.println("删除用户.....");
}
/* (non-Javadoc)
* @see com.inter.dao.IDao#updateUser()
*/
public void updateUser() {
System.out.println("修改用户...");
}
/* (non-Javadoc)
* @see com.inter.dao.IDao#queryUserInf()
*/
public void queryUserInf() {
System.out.println("查询用户");
}
}
第四步:AOP执行方法之前 执行:前置方法
package com.interceptor;
import java.lang.reflect.Method;
import org.apache.log4j.helpers.Loader;
import org.springframework.aop.AfterReturningAdvice;
import com.log.Loger;
public class AfterReturingAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("进入了前置通知哦");
Loger log= Loger.getLoger();
log.loger.info("这里进入了"+method.getName()+"方法");
log.WriteINFOLog("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
}
}
第五步: 环绕方法: 在执行方法时
package com.interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.inter.Helper;
import com.log.Loger;
public class AroundAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
Object obj = null;
if (Helper.role.equals("admin")) {
System.out.println("权限足够,继续执行");
//Loger.log.debug("权限足够,继续执行");
obj = arg0.proceed();
} else {
Loger.getLoger().WriteWARNLog("没有权限对此进行操作");
try{
int i=20/0;
}catch (Exception e) {
Loger.getLoger().loger.error("AroundAdvice.java 23行"+e.getMessage());
}
}
return obj;
}
}
第六步;执行方法后 后置方法
package com.interceptor;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
import com.log.Loger;
public class BeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("进入了后置通知哦");
//Loger.log.debug("进入了后置通知哦");
}
}
第七步: LOG4j 日志类
package com.log;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
//单列模式
public class Loger {
public Logger loger=null;
private static Loger log;
private Loger()
{
loger =Logger.getLogger(this.getClass());
PropertyConfigurator.configure("C:\\Users\\jsontwo\\Workspaces\\MyEclipse 8.5\\AopLoger\\resources\\log.properties");
}
//记录自己的日志
public void WriteINFOLog(String logMessage)
{
loger.info(logMessage);
}
public void WriteDEBUGLog(String logMessage)
{
loger.info(logMessage);
}
public void WriteERRORLog(String logMessage)
{
loger.info(logMessage);
}
public void WriteWARNLog(String logMessage)
{
loger.info(logMessage);
}
public static Loger getLoger()
{
if(log!=null)
return log;
else
return new Loger();
}
}
第八步:测试方法:
package com.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.inter.IDao;
public class MyTset {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//从spring的代理类中得到UserDao
IDao dao = (IDao)ctx.getBean("proxyBean");
dao.delUser();
}
}
Spring 配置文件:
<?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-3.0.xsd">
<!-- 定义bean -->
<bean id="userDao" class="com.inter.dao.UserDao"></bean>
<bean id="productDao" class="com.inter.dao.ProductDao"></bean>
<!-- 定义拦截器 -->
<bean id="beforeAdvice" class="com.interceptor.BeforeAdvice"></bean>
<bean id="afterAdvice" class="com.interceptor.AfterReturingAdvice"></bean>
<bean id="aroundAdvice" class="com.interceptor.AroundAdvice"></bean>
<!-- 使用正则表达式的包装类去包装拦截器 -->
<bean id="aroundAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="aroundAdvice"/>
</property>
<property name="patterns">
<list>
<value>.*.*</value>
</list>
</property>
</bean>
<!-- 定义代理类使用拦截器 -->
<bean id="proxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 配置使用的接口,没有可以不写 -->
<property name="interfaces">
<list>
<value>com.inter.IDao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>beforeAdvice</value>
<value>afterAdvice</value>
<value>aroundAdvisor</value>
</list>
</property>
<property name="target">
<ref bean="userDao"/>
</property>
</bean>
</beans>