1、AOP:
面向切面编程:Aspect Oriented Programming
2、AOP在Spring中的作用
提供声明式服务
允许用户实现自定义切面
AOP:在不改变原有代码情况下添加新的功能(通过代理来实现)
3、AOP的好处
4、名词解释
关注点:增加的某个业务,如安全,缓存,业务等
切 面:一个关注点的模块化
通 知:在切面某个特定的连接点执行的动作
织 入:把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象
5、使用Spring实现AOP
定义接口:UserService.java
package spring.aop.achieve;
public interface UserService {
public void add();
public void delete();
public void search();
public void update();
}
UserService.java
package spring.aop.achieve;
public class UserServiceImpl implements UserService {
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("add()");
}
@Override
public void delete() {
// TODO Auto-generated method stub
System.out.println("delete()");
}
@Override
public void search() {
// TODO Auto-generated method stub
System.out.println("search()");
}
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("update()");
}
}
Log.java
package spring.aop.achieve;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class Log implements MethodBeforeAdvice {
@Override
// before()即前置通知
// method:切入点的方法对象,args:被调用的方法的参数,target:目标对象
public void before(Method method, Object[] args, Object target)
throws Throwable {
// TODO Auto-generated method stub
System.out.println(target.getClass().getName() + "的" + method.getName()
+ "方法被执行");
}
}
TestAop.java
package spring.aop.achieve;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAop {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
UserService us = (UserService)ac.getBean("userService");
us.add();
}
}
beans.xml
注意dtd文件导入:
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
<bean id="userService" class="spring.aop.achieve.UserServiceImpl"/>
<bean id='log' class='spring.aop.achieve.Log'/>
<aop:config>
<!-- execute()是一个表达式,*spring.aop.achieve.UserService.*代表所有方法返回值 -->
<aop:pointcut expression="execution(* spring.aop.achieve.UserService.*)" id="pointcut"/>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
</aop:config>