我个人对aop的理解就是在不改变原有代码的基础上嵌入一些公共的服务,aop的本质就是动态代理
在使用aop之前先要导入两个架包:
之后就是配置文件的一些配置,如下:
加入这些:
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"
之后就是代码部分
首先是service这个专注于业务
public class userServiceImpl implements userService{
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("添加用户");
}
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("删除用户");
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("更新用户");
}
@Override
public void search() {
// TODO Auto-generated method stub
System.out.println("搜索用户");
}
}
之后就是写要嵌入的公共服务
public class Log implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
// TODO Auto-generated method stub
System.out.println(method.getName()+"........."+target.getClass().getName());
}
}
这里这个类要实现MethodBeforeAdvice这个借口,然后这个类中的方法就会在service中的方法执行前执行了
之后就是beans.xml的配置了
<bean id="userService" class="com.yonyou.service.impl.userServiceImpl"></bean>
<bean id="log" class="com.yonyou.demo.Log"></bean>
<bean id="log2" class="com.yonyou.demo.delete"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.yonyou.service.impl.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="log2" pointcut-ref="pointcut"/>
</aop:config>
上面就是一种aop的实现方法
接下来是aop的第二种实现方法,service不变,但是公共服务的类要改变一下,此时不实现一些借口
public class Log{
public void before()
{
System.out.println("在方法执行前执行");
}
}
之后就是beans.xml的配置方式发生一些改变
<bean id="userService" class="com.yonyou.service.impl.userServiceImpl"></bean>
<bean id="log" class="com.yonyou.demo.Log"></bean>
<aop:config>
<aop:aspect ref="log">
<aop:pointcut expression="execution(* com.yonyou.service.impl.*.*(..))" id="pointcut"/>
<aop:before method="before" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
aop的第三种实现方式使用注解的形式实现的,这里beans.xml
的配置方式和以前不同了,代码如下:
<aop:aspectj-autoproxy/>
只需要在配置文件中加入这个就行
但是在写公共服务类的时候的时候需要用到注释了
@Aspect
public class Log{
@Before("execution(* com.yonyou.service.impl.*.*(..))")
public void before()
{
System.out.println("在方法执行前执行");
}
@After("execution(* com.yonyou.service.impl.*.*(..))")
public void after()
{
System.out.println("在方法执行之后执行");
}
@Around("execution(* com.yonyou.service.impl.*.*(..))")
public Object round(ProceedingJoinPoint pj) throws Throwable
{
System.out.println("环绕前置性");
Object object=pj.proceed();
System.out.println("环绕之后执行");
return object;
}
}
上面就是我最近所学,如有不对欢迎大家指出