简体   繁体   中英

How to share Repository and Service classes between 2 projects

I am working on 2 projects, one web app (Spring MVC) and one standalone backend service application (Spring boot) that heavily interact together. I am using hibernate for both and they are both coded using the Netbeans IDE.

My "issue" is that i end up with duplicate code in both project, mainly in the Repository and Service layers. My entities are obviously also duplicated since both projects use the same database.

Is there a way to make some sort of class library (a third project maybe?) and put all the common code in there? If that is indeed possible, how do you then change each project so they can still access this code as if it were part of them? I was thinking of putting all my Repositories, Services and entities in there to avoid code duplication and greatly reduce the risk of error.

Thank you!

Separate those Repository and Service classes to a submodule.

The structure looks like:

-- your app
  -- api    (dependent on `common` module)
  -- webapp (dependent on `common` module)
  -- common

Then the problem is to initialize beans inside common module. AFAIK, you have two options:

  1. In @Configuration class of api or webapp module, add base packages of common module to component scan packages
  2. In api or webapp resources folder, add Spring configuration factory /src/main/resources/META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=your.path.AutoConfiguration

    Define service/repository @Bean inside AutoConfiguration class

I am assuming in this answer your projects are connected to each other

You can set multiple properties within one Spring project, where you store your database connection parameters etc. with the help of multiple property files.
For example:

application-web.properties

application-backend.properties

You can use these in your project, by activating the needed properties file per application. The profile names will be web and backend in these cases.

When using maven, this is the command line I am using:

mvn spring-boot:run -Drun.profiles=<<profile>>

Now, back to your java code. If there are classes only one of your application is using, you can specify this by 'profile'. Example:

@Controller

@Profile({ "web" })
public class WebEndpoint {
}

This way you can make the shared code available for both applications, without duplicating most of the code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM