――Ich habe Clean Architecture gelesen und wollte sehen, was passiert, wenn ich einige Szenarien mit Spring Boot implementiere.
artifact-id | Namensraum | Inhalt |
---|---|---|
my-business | com.example.demo.business | Entität, Anwendungsfall, Repository-Schnittstelle |
my-repository1 | com.example.demo.repository | Hat den Inhalt des Endlagers(Beispiel: für MySQL) |
my-repository2 | com.example.demo.repository | Hat den Inhalt des Endlagers(Beispiel: Für Dateien) |
my-runner | com.example.demo.runner | Stapelverarbeitung starten main |
--my-running verwendet my-repository1. my-repository2 wird nicht verwendet.
SomeEntity.java
package com.example.demo.business;
public class SomeEntity {
public int id;
public String name;
}
SomeUseCase.java
package com.example.demo.business;
@Component
public class SomeUseCase {
@Autowired
private MyRepositoryInterface repo;
public void doSomething(String name) {
SomeEntity entity = new SomeEntity();
entity.name = name;
repo.save(entity);
}
}
MyRepositoryInterface.java
package com.example.demo.business;
public interface MyRepositoryInterface {
public void save(SomeEntity someEntity);
}
MyRepositoryImpl1.java
package com.example.demo.repository;
import org.springframework.stereotype.Component;
import com.example.demo.business.MyRepositoryInterface;
import com.example.demo.business.SomeEntity;
@Component
public class MyRepositoryImpl1 implements MyRepositoryInterface {
public void save(SomeEntity someEntity) {
System.out.println("save to mysql." + someEntity.name);
}
}
MyRepositoryImpl2.java
package com.example.demo.repository;
import org.springframework.stereotype.Component;
import com.example.demo.business.MyRepositoryInterface;
import com.example.demo.business.SomeEntity;
@Component
public class MyRepositoryImpl2 implements MyRepositoryInterface {
public void save(SomeEntity someEntity) {
System.out.println("save to file." + someEntity.name);
}
}
MyRunnerApplication.java
package com.example.demo.runner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages={"com.example.demo.runner, com.example.demo.business, com.example.demo.repository"})
public class MyRunnerApplication {
public static void main(String[] args) {
SpringApplication.run(MyRunnerApplication.class, args);
}
}
MyRunner.java
package com.example.demo.runner;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import com.example.demo.business.SomeUseCase;
@Component
public class MyRunner implements CommandLineRunner{
@Autowired
private SomeUseCase someUseCase;
@Override
public void run(String... args) throws Exception {
System.out.println("running runner...");
someUseCase.doSomething(args[0]);
}
}
--scanBasePackages listet alle Namespaces auf.
pom.xml
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
--Erstelle ein Glas für jedes Projekt außer für meinen Läufer. `mvn install -DskipTests = true
`
init.sh
$ mvn spring-boot:run -Dspring-boot.run.arguments="hello"
...
running runner...
save to mysql.hello
--Für scanBasePackages, wenn es mehrere detaillierte Module gibt, die möglicherweise in Zukunft gewechselt werden, sollte ich sie auflisten, wenn ich ohne Kompilieren wechseln möchte?
--Was ist, wenn Sie den Anwendungsfall und die Entität in separate Gläser trennen möchten? --Wie kann ich die Frühlingsanmerkungen in meinem Anwendungsfall entfernen? ――Was passiert, wenn Sie den Anwendungsfall-Ausgabeport (I), den Anwendungsfall-Eingabeport (I) und den Anwendungsfall-Interaktor einführen, die in Kapitel 22 des Buches aufgeführt sind?
Recommended Posts