1. 页面加入提交到logLogic方法的按钮
<form action="aopAction!logLogic.action" method="post">
<input type="submit" value="Submit to aopAction!logLogic"/>
</form>
2. AOPAction中加入logLogic方法。Action和Logic 都复制一份2,测试aop。页面加入提交aopAction2的logLogic的按钮。
public String logLogic(){
logic.print();
return SUCCESS;
}
3. Logic 改为接口实现,便于使用Spring配置aop。
4. 配置好struts.xml和applicationContext.xml.
struts加入一个Action2
<action name="aopAction2" class="aopAction2">
</action>
spring也加入2
<bean id="aopAction2" class="com.zhch.action.AOPAction2">
<property name="logic" ref="aopLogic2"/>
</bean>
<bean id="aopLogic2" class="com.zhch.logic.AOPLogicImpl2"/>
5. aop的内容:
5.1 写接口的拦截器。
package com.zhch.interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class AOPInterceptor implements MethodInterceptor {
// invoke方法返回调用的结果
public Object invoke(MethodInvocation invocation) throws Throwable {
String methodName = invocation.getMethod().getName();
System.out.println("Before name:"+methodName);
Object result = invocation.proceed();
System.out.println("After name:"+methodName);
return result;
}
}
5.2 applicationContext.xml中配置interceptor和aop代理。
<!-- interceptor -->
<bean id="aopInterceptor"
class="com.zhch.interceptor.AOPInterceptor">
</bean>
<!-- ProxyBean -->
<bean id="aopLogicProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.zhch.logic.AOPLogic</value>
</property>
<property name="target" ref="aopLogic"/>
<property name="interceptorNames">
<list>
<value>aopInterceptor</value>
</list>
</property>
</bean>
5.3 action中的logic引用代理。
<bean id="aopAction" class="com.zhch.action.AOPAction">
<property name="logic" ref="aopLogicProxy"/>
</bean>
6. 第二个Logic的配置方法也相同。
7. 如果有许多个Bean要代理的话,这样配置会很麻烦,可以用BeanNameAutoProxyCreator来自动代理。
8. 用BeanNameAutoProxyCreator代理。
8.1 将原来的<!-- ProxyBean -->删除。
8.2 配置BeanNameAutoProxyCreator。
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Logic</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>aopInterceptor</value>
</list>
</property>
</bean>
8.3 Action中还是引用原来的Logic的Bean的名字。
8.4 多个配置文件中的符合名字正则的都会被代理。
总结:
1. 用ProxyFactoryBean
1.1 接口和它的实现类都有了,写好。
1.2 写接口的拦截器
1.3 在spring中配置拦截器和代理,别的类引用就好了。
2. 用BeanNameAutoProxyCreator
2.1 接口和它的实现类都有了,写好。
1.2 写接口的拦截器
1.3 在spring中配置拦截器和代理,这里引用Bean还是引用原来的Bean就可以了,
BeanNameAutoProxyCreator会自动代理符合它名字正则表达式的bean。
附加1. Spring多配置文件
在web.xml中加入context-param元素,给listener用。
用*表示多个,也可以直接写名字。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml;
/WEB-INF/applicationContext-*.xml
</param-value>
</context-param>
附加2. struts2多配置文件
方法1.
在struts.xml中加入下面的文字就可以解决了
<include file="struts-default.xml">
<include file="struts_001.xml">
<include file="struts_002.xml">
如果是多级包含,主要的包含struts_001.xml,struts_001.xml包含struts_002.xml
则主要的里面是
<include file="struts_001.xml">
struts_001.xml里面是
<include file="struts_002.xml">
如果有多级目录则每一个包含都要写从class开始的全称目录
比如struts_001.xml,struts_002.xml都在com.zhch包中,主包含struts_001.xml,struts_001.xml包含struts_002.xml.
则主要里面是
<include file="com/zhch/struts_001.xml">
struts_001.xml里面是
<include file="com/zhch/struts_002.xml">