I’ve got a singleton Spring bean that creates a couple of tasks (java.util.concurrent.Callable‘s) at runtime to do its work in parallel. Right now, the Callable‘s are defined as inner classes in the singleton bean, and the singleton bean creates them simply by instantiating them with new Task(in), where in is a parameter known only at runtime.
Now I want to extract the inner Task class to a regular top-level class because I want to make the Task’s call() method transactional, so I need it to be a Spring bean.
I guess I need to give my singleton some kind of factory of Tasks, but the tasks have to be prototype Spring beans that take a runtime value as a constructor parameter. How can I accomplish this?
Spring’s bean factory and new are mutually exclusive. You can’t call new and expect that object to be under Spring’s control.
My suggestion is to inject those Tasks into the Singleton. Make them Spring beans, too.
You should recognize that the Task itself isn’t going to be transaction, but its dependencies can be. Inject those into the Tasks and let Spring manage the transactions.