带来了所有和这次方法调用有关的信息,包括方法参数,目标对象等等,所以一般要做日志记录的话会带上它。
接下来是测试类的代码,和以前的几乎没有任何不同,只不过现在直接访问的是man这个bean。源码如下所示:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
publicclass AOPTest {
publicstaticvoid main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Man man = (Man) ctx.getBean("man");
man.qq();
man.mm();
}
}
清单10.11 测试类AOPTest源码
Spring 1.2和2.0的简单AOP例子(6)
时间:2011-09-14
这个类的执行结果和上面的例子是类似的,如下所示:
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
FBI 发现张三正在进行 qq 活动。
我在聊QQ
FBI 发现张三正在进行 mm 活动。
我在泡MM
下面再介绍配置文件的写法,先看看完整的配置文件代码:
<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="fbi" class="FBI" />
<bean id="man" class="Man">
<property name="name">
<value type="java.lang.String">张三</value>
</property>
</bean>
<aop:config>
<aop:pointcut id="manPointcut"
expression="execution(* Man.*(..))" />
<aop:aspect id="beforeExample" ref="fbi">
<aop:before pointcut-ref="manPointcut" method="before" />
</aop:aspect>
</aop:config>
</beans>
清单10.12 AOP XML格式配置文件源码applicationContext.xml
将这个配置文件的代码和清单10.8进行对比,可以看到两个不同:
1. 配置文件的开头加入了aop命名空间,如代码中粗斜体所示。
2. 使用aop:config标签来定义AOP,不是使用ProxyFactoryBean来定义一个新的bean。
简要介绍一下这个配置。两个bean的定义都没有什么大的变化,一个是人的对象,另一个则是联邦调查局的探员。而aop:config中定义了所有的AOP设置信息。aop:pointcut定义了一个切入点,id给出了这个切入点的唯一名字,而expression定义了切入点的表达式,那么这个定义到底表示了什么信息呢?它的意思是表示一种场景,即执行(execution)Man对象的所有方法的这种情况,这就是表达式execution(* Man.*(..))的意义所在,Man.*(..)表示Man类的所有方法。接下来呢,需要定义一个切面,用aop:aspect来定义,它的ref属性指定了这个切面所对应的bean定义的id,这里指向fbi这个bean类;子标签aop:before则指示了当发生了名为manPointcut的切入点(情况)前(用pointcut-ref属性指定,pointcut-ref=”manPointcut”) |