I think you'll need to read up on the Spring IOC container. Also pay attention to bean scopes.
The Spring container environment is app-wide. Beans where you don't specify a scope are singleton by default, like controllers, so there will only be a single instance of your search criteria bean.
If you want a separate instance per user, you need some way to get a new instance of the bean in either session scope, conversation scope, flow scope, or view scope. Since you want to use it as a model object, you can't use view scope. Since you only want to use it for these two pages, and since these two pages are only used within your flow, flow scope seems to be the best bet.
Now, there are a few ways to make this work the way you want.
My suggestion is likely the easiest. Use the var element within your flow definition. That creates a new instance, and scopes it to the flow. At that point you won't even need to declare it as a bean.
Alternatively, you can keep it as a bean, but scope it to the flow. There's some extra step you need to take to make this work, though, since Spring by default doesn't know about the extra scopes provided by SWF. You'll need to add something to your beans file, but I don't recall what it is, and I don't think it's documented well in the SWF reference guide. You might need to search through the forums here to find it. By now, maybe it's been changed so it automatically registers the extra scopes, but I'm not sure.
The third way to do this (and the way I favor, for beans which require spring-supplied autowiring or configuration) is defining the bean in your beans file, but using prototype scope, and exposing the bean under the name: "new<beanName>".
That way I can use a set action to put a new instance of the bean into whatever scope I wish, like so:
Code:
<set name="viewScope.searchCriteria" value="newSearchCriteria"/>
I usually prefer this because I have good visibility into what beans are used by the flow. If I'm using annotations, or specifically scoped beans, I lose that visibility.