Small tip - I've found it helpful to modularize and clearly label my Spring xml context files based on application concern. Here's an example for a web app I worked on:
- `MyProject / src / main / resources / spring /`
- _**datasource.xml**_ - My single data source bean.
- _**persistence.xml**_ - My DAOs/Repositories. Depends on `datasource.xml` beans.
- _**services.xml**_ - Service layer implementations. These are usually the beans to which I apply transactionality using AOP. Depends on `persistence.xml` beans.
- _**controllers.xml**_ - My Spring MVC controllers. Depends on `services.xml` beans.
- _**views.xml**_ - My view implementations.
This list is neither perfect nor exhaustive, but I hope it illustrates the point. Choose whatever naming strategy and granularity works best for you.
In my (limited) experience, I've seen this approach yeild the following benefits:
**Clearer architecture**
Clearly named context files gives those unfamiliar with your project structure a reasonable
place to start looking for bean definitions. Can make detecting circular/unwanted dependencies a little easier.
**Helps domain design**
If you want to add a bean definition, but it doesn't fit well in any of your context files, perhaps there's a new concept or concern emerging? Examples:
- Suppose you want to make your Service layer transactional with AOP. Do you add those bean definitions to `services.xml`, or put them in their own `transactionPolicy.xml`? Talk it over with your team. Should your transaction policy be pluggable?
- Add Acegi/Spring Security beans to your `controllers.xml` file, or create a `security.xml` context file? Do you have different security requirements for different deployments/environments?
**Integration testing**
You can wire up a subset of your application for integration testing (ex: given the above files, to test the database you need to create only `datasource.xml` and `persistence.xml` beans).
Specifically, you can annotate an integration test class as such:
@ContextConfiguration(locations = { "/spring/datasource.xml" , "/spring/persistence.xml" })
**Works well with Spring IDE's Beans Graph**
Having lots of focused and well-named context files makes it easy to create custom BeansConfigSets to visualize the layers of your app using Spring IDE's [Beans Graph][1]. I've used this before to give new team members a high-level overview of our application's organization.
[1]:
[To see links please register here]