这两件事都有点2。只是想验证一下这种场景下,finally到底怎么执行。
简单的Filter链,只是为了验证。
public interface Filter {
void doFilterHttp(Object request, Object response, FilterChain chain);
}
public class FilterChain {
private List<FilterConfig> filterConfigs = new ArrayList<FilterConfig>();
private Iterator<FilterConfig> iterator = null;
public void doFilter(Object request,Object response){
if(this.iterator==null){
this.iterator=filterConfigs.iterator();
}
if(this.iterator.hasNext()){
FilterConfig config=this.iterator.next();
Filter filter=config.getFilter();
filter.doFilterHttp(request, response, this);
}
}
public void addFilterConfig(FilterConfig config){
this.filterConfigs.add(config);
}
}
public class FilterConfig {
private Filter filter;
public Filter getFilter() {
return filter;
}
public void setFilter(Filter filter) {
this.filter = filter;
}
}
public class Test1Filter implements Filter {
public void doFilterHttp(Object request, Object response, FilterChain chain) {
try{
System.out.println("handle filter"+this.getClass().getName());
chain.doFilter(request, response);
}finally{
System.out.println(this.getClass().getName()+" finally");
}
}
}
public class Test2Filter extends Test1Filter {
}
public class Test3Filter implements Filter {
public void doFilterHttp(Object request, Object response, FilterChain chain) {
if(true){
System.out.println("handle filter"+this.getClass().getName());
chain.doFilter(request, response);
return ;
}
try{
System.out.println(this.getClass().getName()+" try");
}finally{
System.out.println(this.getClass().getName()+" finally");
}
}
}
public class Test4Filter implements Filter {
public void doFilterHttp(Object request, Object response, FilterChain chain) {
try{
if(true){
System.out.println("handle filter"+this.getClass().getName());
chain.doFilter(request, response);
return ;
}
System.out.println(this.getClass().getName()+" try");
}finally{
System.out.println(this.getClass().getName()+" finally");
}
}
}
来看测试:
public class FilterTest {
/**
* @param args
*/
public static void main(String[] args) {
FilterChain chain=new FilterChain();
Test1Filter filter1=new Test1Filter();
Test2Filter filter2=new Test2Filter();
Test3Filter filter3=new Test3Filter();
Test4Filter filter4=new Test4Filter();
FilterConfig config1=new FilterConfig();
config1.setFilter(filter1);
FilterConfig config2=new FilterConfig();
config2.setFilter(filter2);
FilterConfig config3=new FilterConfig();
config3.setFilter(filter3);
FilterConfig config4=new FilterConfig();
config4.setFilter(filter4);
chain.addFilterConfig(config1);
chain.addFilterConfig(config3);
chain.addFilterConfig(config4);
chain.addFilterConfig(config2);
chain.doFilter(null, null);
}
}
handle filter org.jport.sample.designpattern.responsebilitychain.Test1Filter
handle filter org.jport.sample.designpattern.responsebilitychain.Test3Filter
handle filter org.jport.sample.designpattern.responsebilitychain.Test4Filter
handle filter org.jport.sample.designpattern.responsebilitychain.Test2Filter
org.jport.sample.designpattern.responsebilitychain.Test2Filter finally
org.jport.sample.designpattern.responsebilitychain.Test4Filter finally
org.jport.sample.designpattern.responsebilitychain.Test1Filter finally
如果chain.doFilter在try{}finally{}块中,那么finally是一定会执行的。加了return后也一样。只不过return后面的语句不再执行了而已。