一、XML方式实现AOP,步骤
1. 引入jar文件 【aop 相关jar, 4个】
2. 引入aop名称空间
3. aop 配置
配置切面类 (重复执行代码形成的类)
aop配置
引入切面类
拦截哪些方法 / 拦截到方法后应用通知代码
二、XML方式实现AOP,详解
2.1 AOP的XML配置
<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
<aop:config>
<aop:aspect ref="myAop">
<aop:before method="begin" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after method="end" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:around method="around" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after-returning method="afterReturing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after-throwing method="afeterThrowing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
</aop:aspect>
</aop:config>
前置通知:
<aop:before method="begin" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
method 用于指定切面类中的方法名
pointcut 用于指定切入点表达式
后置通知:
<aop:after method="end" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
2.2 切入点的设置
2.2.1 直接指定切入点表达式
<?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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userDao" class="org.jsoft.d_proxy_g_aop_xml.UserDao"></bean>
<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
<aop:config>
<aop:aspect ref="myAop">
<aop:after method="after1" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after-throwing method="afeterThrowing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
2.2.2 引用切入点表达式
<?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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userDao" class="org.jsoft.d_proxy_g_aop_xml.UserDao"></bean>
<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
<aop:config>
<aop:pointcut expression="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))" id="myPoint"/>
<aop:aspect ref="myAop">
<aop:after method="after1" pointcut=""/>
<aop:after-throwing method="afeterThrowing" pointcut-ref="myPoint"/>
</aop:aspect>
</aop:config>
</beans>
2.3 案例
>>>>>> 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:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="userDao" class="org.jsoft.d_proxy_g_aop_xml.UserDao"></bean>
<bean id="myAop" class="org.jsoft.d_proxy_g_aop_xml.Aop"></bean>
<aop:config>
<aop:aspect ref="myAop">
<aop:before method="begin" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after method="end" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:around method="around" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after-returning method="afterReturing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
<aop:after-throwing method="afeterThrowing" pointcut="execution(* org.jsoft.d_proxy_g_aop_xml.UserDao.*(..))"/>
</aop:aspect>
</aop:config>
</beans>
>>>>>> UserDao .java
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("DB 保存");
}
}
>>>>>> Aop.java
public class Aop {
public void begin() {
System.out.println("开启事务");
}
public void end() {
System.out.println("关闭事务");
}
public void afterReturing() {
System.out.println("afterReturing");
}
public void afeterThrowing() {
System.out.println("afeterThrowing");
}
public void around(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕前");
point.proceed();
System.out.println("环绕后");
}
}
>>>>>> App.java
public class App {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("org/jsoft/d_proxy_g_aop_xml/applicationContext.xml");
IUserDao proxy =(IUserDao) ac.getBean("userDao");
proxy.save();
}
}