0% menganggap dokumen ini bermanfaat (0 suara)
10 tayangan101 halaman

Panduan Lengkap Kerangka Spring

Dokumen ini menyajikan kursus pemrograman web lanjutan dengan Spring. Ini memperkenalkan Spring, menjelaskan arsitekturnya, dan mempersembahkan praktik terbaik seperti pemecahan menjadi lapisan, pemrograman berdasarkan kontrak, dan inversi kontrol.

Diterjemahkan oleh

ScribdTranslations
Hak Cipta
© All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
10 tayangan101 halaman

Panduan Lengkap Kerangka Spring

Dokumen ini menyajikan kursus pemrograman web lanjutan dengan Spring. Ini memperkenalkan Spring, menjelaskan arsitekturnya, dan mempersembahkan praktik terbaik seperti pemecahan menjadi lapisan, pemrograman berdasarkan kontrak, dan inversi kontrol.

Diterjemahkan oleh

ScribdTranslations
Hak Cipta
© All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd

1

Pemrograman Web Lanjutan


tingkat 2 (Bagian 1):
Musim Semi
2

Presentasi kursus
•Tujuan: mengetahui cara membuat aplikasi Spring dari
dari ujung ke ujung
▫Dengan memahami dengan benar cara kerja
kerangka kerja
▫Dengan cepat memahami bagian-bagian dari Spring
•Mengenal alat yang digunakan dalam
industri
•Kursus ini didasarkan pada versi berikut
▫Spring Framework 4.3
▫JPA 2.1
3

Bibliographie
•Spring par la pratique par Julien Dubois, Jean-
Philippe Retaillé, Thierry Templier, Eyrolles, 2006
517 hlm., (ISBN2212117108)
•Spring sebagai contoh oleh Gary Mak, PEARSSON,
2008, 492 hlmn., (ISBN2744023396)
•Kursus Musim Semi, Mohamed Youssefi.
•Framework Spring, Claude Duvallet.
4

•Pengantar ke Spring
•Arsitektur Spring
•Praktik terbaik dalam Spring
5

Pengenalan ke Spring (1/4)


Masalah
Pengembangan Java/JEE, terutama yang
yang menggunakan EJB, terkenal kompleks, baik
en terme de développement que de tests et de
pemeliharaan.
▫JEE memberlakukan platform eksekusi yang berat,
yang menimbulkan masalah interoperabilitas antara
berbagai implementasi.
Pengembangan JEE dicirikan oleh mereka
ketergantungan yang kuat dan seringkali sulit untuk
penguji
6

Pengenalan ke Spring (2/4)


Motivasi
•Menyederhanakan dan menyusun pengembangan JEE
cara untuk menghormati praktik terbaik
arsitektur perangkat lunak.

Menggunakan kerangka kerja Spring untuk merancang


aplikasi yang berkinerja tinggi, rendah
dijodohkan, mudah diuji dan yang
kode yang dapat digunakan kembali
7

Pendahuluan ke Spring (3/4)


Apa itu Spring?
•Kerangka kerja yang menawarkan kerangka pengembangan di
berdasarkan "praktik baik"
•Pada awalnya berorientasi Java dan Java EE
▫Hari ini implementasi lain ada: .NET
et Python
•Kontainer "ringan"
▫Memfasilitasi pengembangan dengan POJO (Plain Old)
Java Object) yang tidak perlu dijalankan dalam
sebuah kontainer/server aplikasi spesifik
▫Memungkinkan untuk memiliki komponen yang "terhubung lemah"
▫Meningkatkan kualitas kode dan memudahkan pengujian
8

Pengenalan ke Spring (4/4)


Evolusi dan sejarah
9

Arsitektur Musim Semi (1/5)


•Springse terdiri dari sebuah inti (Core Container) dan
beberapa modul
10

Arsitektur Musim Semi (2/5)


•Kontainer Inti Spring: mengelompokkan modul-modul
dasar untuk menerapkan kontainer
▫Spring Core dan Spring Beans: berisi
fungsi dasar terutama kontainer dan
alat-alat
▫Konteks Musim Semi: menawarkan dukungan untuk definisi
konteks Spring (konfigurasinya) tetapi juga dari
fungsi dasar seperti email,
internasionalisasi, JNDI, ...
▫Spring Expression Language (SpEL) : menawarkan sebuah
bahasa ekspresi untuk menanyakan dan memanipulasi
objek yang dikelola oleh kontainer
11

Arsitektur Musim Semi (3/5)


•AOP dan Instrumentasi: memungkinkan untuk memasang
mengimplementasikan pemrograman berorientasi aspek secara internal melalui
Spring atau oleh pengguna Spring
•Akses/Integrasi Data: mengelompokkan modul
akses ke data
▫Spring JDBC: menawarkan abstraksi penggunaan
dari JDBC dengan khususnya hierarki pengecualian
didedikasikan
▫Spring ORM: menawarkan dukungan untuk alat-alat
tipe ORM (JPA, JDO, Hibernate, iBatis)
▫Transaksi Musim Semi: mengusulkan dukungan deklaratif dan
melalui pemrograman pengelolaan transaksi
▫Spring OXM: mengusulkan abstraksi untuk pemetaan
objek/XML
Spring JMS: menawarkan fungsi untuk mempermudah
pelaksanaan JMS dengan Spring
12

Arsitektur Musim Semi (4/5)


•Web: mengelompokkan modul untuk pengembangan
aplikasi web
▫Ini terutama mengandung Spring Web MVC, yang
solusi Spring untuk aplikasi Web, dan
mengusulkan integrasi dengan banyak
kerangka kerja Web dan teknologi tampilan.
•Uji: mengusulkan fitur untuk pengujian
diotomatisasi dengan Spring dengan dukungan JUnit
et TestNG
13

Arsitektur Musim Semi (5/5)


•Ekstensi Spring lainnya:
Spring Security
▫Musim Semi Android
▫Musim Semi .Net
Dsb.
14

Penggunaan Kerangka Kerja Spring


15

Praktik baik dalam Spring

Dekomposisi Pemrograman Inversi dari


di sofa sesuai kontrak kontrol

Pemrograman
Singleton
par Aspek
16

Praktik baik dalam Spring:


Dekomposisi dalam lapisan (1/2)
•Prinsip: pembagian dalam lapisan adalah sebuah teknik
umum untuk membongkar secara logis sebuah
sistem kompleks
Menguraikan sistem menjadi lapisan-lapisan memiliki
berbagai keuntungan, terutama yang berikut ini :
kemungkinan untuk mengisolasi suatu lapisan, agar memudahkan
pemahaman dan perkembangannya;
pengelolaan ketergantungan yang sangat baik;
▫kemungkinan untuk mengganti implementasi dari
sofa
▫penggunaan kembali yang dipermudah;
▫testabilitas diutamakan (berkat isolasi dan pada
kemungkinan untuk menggantikan implementasi).
17

Praktik baik dalam Spring


Dekomposisi dalam lapisan (2/2)

Presentasi (misalnya, JSP, JSF,) Vue

Koordinasi (misalnya, Spring MVC, Struts) Pengendali

Métier (POJO) Layanan

Akses ke data (misalnya, JDBC, Hibernate,


JPA) DAO
Gudang
Ketekunan (misalnya, basis data)
data
18

Praktik baik dalam Spring:


Pemrograman berdasarkan kontrak (1/9)

•Principe:consiste à séparer la spécification d'une


lapisan perangkat lunak dari realisasinya.

Spesifikasi menghasilkan penciptaan


d'uneinterfaceet la réalisation fournit uneclasse
siapa yang mengimplementasikan antarmuka ini.

▫Kita dapat memproduksi beberapa penerapan yang berbeda


dari antarmuka yang sama.
19

Praktik baik dalam Spring:


Pemrograman dengan kontrak(2/9)
•Keuntungan:
▫Mengurangi ketergantungan: Kelas implantasi
ne se connaissent pas. Elles dialoguent au moyen des
antarmuka. Oleh karena itu, kita dapat dengan mudah mengubah sebuah
perimplantasi melawan yang lain tanpa harus memperbarui
totalitas perangkat lunak.
▫Mempermudah pengujian:Setiap lapisan perangkat lunak memiliki
spesifikasi yang jelas, mudah untuk mengaitkannya dengan sebuah permainan
tes yang dapat digunakan terlepas dari jenis penempatan.
▫Sederhanakan kode: Dalam beberapa kasus, kode
sebuah metode adalah deretan pertimbangan yang tidak terhubung
langsung antara mereka. Pemrograman berdasarkan kontrak akan
mempermudah pembangunan penempatan fasad yang
memikul masing-masing bagian dari pekerjaan.
▫Organisasi pengembangan.
20

Praktik baik dalam Spring:


Pemrograman berdasarkan kontrak(3/9)
•Contoh:
interfaceIUserDAO{
publik void tambahPengguna (Pengguna pengguna);

public User getUserById(Long Id);


}

kelas UserImplJDBC mengimplementasikan IUserDAO{}


//tambah metode yang belum diimplementasikan

} kelas UserImplJPAimplementsIUserDAO{
//tambah metode yang belum diimplementasikan

}
21

Praktik baik dalam Spring:


Pemrograman berdasarkan kontrak(4/9)
•Keuntungan utama: membangun aplikasi
terkait lemah

Couplage faible

Pengikatan kuat
22

Praktik baik dalam Spring


Pemrograman berdasarkan kontrak (5/9)
Couplage fort vs couplage faible
•Couplage fort: Ketika kelas A terhubung dengan kelas B,
dikatakan bahwa kelas A sangat terikat pada
kelas B.
Kelas A hanya dapat berfungsi di hadapan kelas
B.
Jika versi baru dari kelas B (yaitu B2) dibuat, kita
harus mengubah di kelas A.
▫Mengubah sebuah kelas melibatkan:
Harus memiliki kode sumber.
Anda harus mengompilasi ulang, menerapkan, dan mendistribusikan yang baru.
aplikasi untuk pelanggan.
Apa yang menimbulkan mimpi buruk dalam hal pemeliharaan
dari aplikasi
23

Praktik terbaik dalam Spring


Pemrograman berdasarkan kontrak (6/9)
Keterkaitan kuat vs keterkaitan lemah
•Contoh pengikatan kuat: Setiap layanan bisnis
mengandung referensi ke objek akses ke
data.

LayananPengguna UserDAOImplJPA

Ketergantungan antara layanan bisnis dan DAO


(pasangan kuat)
24

Praktik baik dalam Spring


Pemrograman berdasarkan kontrak (7/9)
Couplage fort vs couplage faible
•Kopling lemah: terdiri dari menggunakan antarmuka
untuk mengurangi ketergantungan antara kelas-kelas.
•Contoh pengikatan lemah:
▫Pengenalan antarmuka untuk DAO memungkinkan
memisahkan layanan dari implementasi DAO.
▫Antarmuka mendefinisikan kontrak komunikasi,
sementara implementasi DAO mengisinya:
layanan akan dapat menggunakannya, bahwa teknologi dari
persistance sousjacente soit JPA ou JDBC.
25

Praktik terbaik dalam Spring:


Pemrograman dengan kontrak(8/9)
Couplage fort vs couplage faible
•Contoh penggabungan lemah

LayananPengguna IUserDAO

UserDAOImplJDBC UserDAOImplJPA

Ketergantungan antara layanan bisnis dan DAO


(couplage faible)
26

Les bonnes pratiques dans Spring:


Pemrograman berdasarkan kontrak(9/9)

Dalam sebuah aplikasi


Musim semi, seluruhnya dari
komponen (pengontrol,
layanan dan DAO) adalah
dikelola oleh kontainer
ringan.

Komunikasi antar lapisan melalui antarmuka


27

Praktik baik dalam Spring:


Le singleton (1/2)
Singleton
Ini pasti adalah pola desain yang paling
terkenal.
•Sebenarnya, itu (sangat) digunakan di banyak bidang.
Model ini memastikan bahwa akan selalu ada
sebuah instance dari kelas tertentu yang akan diinstansiasi
dalam mesin virtual.
•Tujuannya sederhana:
▫Hindari waktu instansiasi kelas.
Hindari konsumsi memori yang tidak perlu.
•Model ini, bagaimanapun, memberlakukan suatu kendala
penting, kelas yang menyediakan layanan tidak boleh
memiliki pemahaman tentang sesi.
28

Praktik baik dalam Spring:


Le singleton (2/2)
Tujuannya adalah untuk menjamin keunikan instance, untuk itu ia
harus melarang penciptaan segala instance di luar
pengawasan kelas.
•Dengan tujuan ini, konstruktor dibuat privat dan sebuah metode
yang mengembalikan instance dari kelas disediakan.
public class Singleton {
private static Singleton instance= new Singleton();

privateSingleton() {}

public static Singleton getInstance() {


kembali instans;
}
}
29

Praktik baik dalam Spring:


Inversi kontrol (1/4)
•Ini adalah konsep sentral musim semi
•Disebut « prinsip Hollywood » sebagai referensi kepada
frasa mitos «jangan panggil kami, kami akan
appellerons ».

Ini adalah sebuah "pola desain" yang bertujuan untuk


memfasilitasi integrasi komponen satu sama lain.

•Konsep ini didasarkan pada pembalikan cara


tidak ada objek yang dibuat.
30

Praktik baik dalam Spring:


Inversi kontrol (2/4)
•Tujuan tidak lagi untuk menyediakan satu objek kepada yang lain
objek tetapi sebaliknya untuk memastikan bahwa, objek
jangan pada perlu, tahu sendiri apa yang dia punya
kebutuhan.

•Dan jika perlu jika salah satu objek yang diperlukan telah dia-
bahkan ketergantungan yang dia atasi untuk mereka
mendapatkan.

•Bentuk utama dari IoC:


"injeksi ketergantungan" (atau DI)
31

Praktik terbaik dalam Spring:


Inversi kendali (3/4)
Konsep injeksi ketergantungan
•Prinsip: bergantung pada objek pengumpul — yang
kontainer ringan—, mampu mengelola siklus
kehidupan komponen aplikasi, serta
ketergantungan mereka, dengan menyuntikkannya dengan cara
tepat.
•Avantages:
▫Komponen lebih independen dari mereka
lingkungan eksekusi.
▫Mereka tidak perlu khawatir tentang instansiasi mereka
ketergantungan dan dapat fokus pada tugas mereka
utama.
32

Praktik baik dalam Spring:


Pembalikan kontrol (4/4)
Konsep injeksi ketergantungan
Ada empat jenis injeksi:
▫Injeksi melalui konstruktor: sebuah objek diinjeksikan dengan
ketergantungan pada saat ia dibuat, yaitu melalui
argumen dari konstruktornya.

▫Injeksi melalui mutator (setter): sebuah objek dibuat, kemudian


ketergantungannya disuntikkan melalui setter.

▫Injeksi antarmuka: sebuah objek dibuat kemudian ...


ketergantungan disuntikkan kepadanya melalui metode lain
=> Menggunakan antarmuka untuk mendefinisikan metode injeksi ini

▫Injeksi oleh medan: metode ajaib yang semakin meningkat


populer
33

Praktik baik dalam Spring:


Pemrograman berbasis aspek (1/4)
•Sebuah modul atau komponen bisnis secara teratur
tercemar oleh banyak panggilan ke komponen
alat bantu eksternal.
34

Praktik baik dalam Spring:


Pemrograman berdasarkan aspek (2/4)
•Ini berarti:
▫Keterikatan kode.
▫Reusabilitas yang rendah.
▫Kualitas lebih rendah akibat kompleksitas kode.
Kesulitan untuk berkembang.
•Solution: externaliser tous les traitements non
terkait dengan logika bisnis di luar komponen.
Untuk melakukan ini, perlu dapat mendefinisikan pengobatan.
secara deklaratif atau pemrograman pada
poin kunci dari algoritma.
▫Biasanya sebelum atau setelah metode.
35

Praktik baik dalam Spring:


Pemrograman berdasarkan aspek (3/4)
•Penggunaan POA
▫Les classes pour la logique métier
▫Aspek untuk aspek teknis
36

Praktik baik dalam Spring:


Pemrograman berdasarkan aspek (4/4)
•Butuh seorang penenun aspek
▫misalnya AspectJ untuk bahasa JAVA
•Peran: menyatukan semua aspek di seluruhnya
kelas program.
▫Pada saat kompilasi
Pada saat pelaksanaan
37
38

Apa itu Spring Boot?


Ini adalah Kerangka kerja yang dirancang terutama
untuk mengembangkan arsitektur berbasis mikro-
layanan
▫Idenya adalah membagi sebuah aplikasi menjadi kecil
unit yang diterapkan dalam bentuk mikro-layanan
▫Setiap mikro-layanan bertanggung jawab atas
fitur dasar, dikembangkan, diuji dan
dikerahkan secara independen dari yang lain
▫Setiap mikro-servis dapat dirancang menggunakan
bahasa dan teknologi apa pun
Couplage faible
39

Keuntungan Spring Boot


•Memfasilitasi pengembangan aplikasi
kompleks
•Memudahkan injeksi ketergantungan
•Memfasilitasi pengelolaan ketergantungan dengan Maven
•Mengurangi file konfigurasi dan mendukung
otomatisasi konfigurasi
•Menyediakan kontainer ringan tersemat (Tomcat)
40

Pembuatan proyek Spring Boot


41

Pembuatan proyek Spring Boot


42

Pembuatan proyek Spring Boot


43

Struktur sebuah proyek Spring Boot


44

Alat integrasi terus menerus: Maven atau


Gradle
•Alat-alat ini memainkan peran penting selama
manajemen dan otomatisasi produksi dari
perangkat lunak
▫Mengelola ketergantungan
▫Mulai kompilasi sumber
▫Lakukan pengujian unit
▪Menghasilkan paket (war, jar, ear, dll.)
▫Mengdeploy aplikasi di server
▫…
45

File [Link]
•Ini adalah cuplikan dari file:
dependencies>
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</ketergantungan>
<ketergantungan>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<ketergantungan>
<groupId>[Link]</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<ketergantungan>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<lingkup>runtime</lingkup>
</dependency>
…</dependencies>
46

Berkas [Link]
•Peran: mengatur konfigurasi sumber dari
data, server, dll.
•Contoh:
[Link]=jdbc:mysql://localhost:3306/SpringBoot?server
Timezone=UTC
[Link]=root
[Link]=
[Link]=[Link]
# Hibernate ddl auto (buat, buat-hapus, perbarui)
[Link]-auto=update
Dialek SQL membuat Hibernate menghasilkan SQL yang lebih baik untuk
basis data yang dipilih
[Link] =
[Link].MySQL5Dialect
47

Titik masuk sebuah aplikasi


Spring Boot
•Sebuah kelas yang ditandai dengan @SpringBootApplication
@SpringBootApplication
Kelas Publik FirstSpringProjectApplication {

publik statis void utama(String[] args) {


[Link]([Link],args);
}
}
•Anotasi ini setara dengan 3 anotasi ini
ansambel
@EnableAutoConfiguration: mengaktifkan autokonfigurasi
▫@ComponentScan: mencari bean di paket dari
aplikasi Anda
▫@Configuration: mendeklarasikan sebuah kelas sebagai
kelas konfigurasi
48

Percobaan Perdana
•Membuat proyek Spring Boot
•Ubah kode seperti berikut:
@SpringBootApplication
publik kelas NonWebSpringProjectApplicationmengimplementasikan
CommandLineRunner{

publik statis void utama(String[]args) {


[Link]([Link], argumen);
}
publik void run(String... args) lempar Exception {
[Link]("Halo Musim Semi");
}
}

•Jalankan aplikasi sebagai aplikasi


JAVA
49

Percobaan Kedua
@Komponen :
•Tambahkan kelas ini berkaitan dengan
@Komponen
Nama biji anotasi dasar
HaloKacang yang menandakan sebuah
publik kelas HelloBean {
publicString getMessage(String komponen yang dikelola oleh
pesan)
{
Musim semi.
kembali"Halo Musim Semi"+msg;
} Nama biji
@Komponen("monbean") monbean
} kelas Publik HelloBean {
publicString getMessage(String
pesan)
{
return "Halo Musim Semi" + msg;
}

}
50

Percobaan Kedua
•Injeksi ketergantungan bean HelloBean dengan
Penggunaan anotasi @Autowired dan pemanggilan metode
di kelas utama
@SpringBootApplication
kelas Publik NonWebSpringProjectApplication mengimplementasikan
CommandLineRunner{

@Autowired
privat HelloBeanbean;

publik statis void utama(String[] argumen) {


[Link]([Link],args);
}
publik void run(String...args) throws Exception {
[Link]([Link](" From ENIS Engineer"));
}
}
51

Percobaan Ketiga
•Jadi contoh berikut:
publik antarmuka IMedecinDAO {
publik void tambahDokter(Medecin obj);
publik void hapusDokter(Long id);
public void updateMedecin(Medecin obj);
publicMedecin findMedecinByID(Longid);
publicList<Medecin> temukanSemua();
}

publik kelas MedecinDAO mengimplementasikan IMedecinDAO {

}
52

Percobaan Ketiga: MedecinDAO


@Repository
kelas Publik MedecinDAO menerapkan IMedecinDAO {
@ContextPersistence
privateEntityManagerem;
@Transactional
publik void tambahDokter(Medik obj) {
[Link](obj);
@Transactional
publik void hapusDokter(Long id) {
[Link]([Link]([Link],id));
@Transaksional
publik void updateMedecin(Medecin obj) {
[Link](obj);
publicMedecin findMedecinByID(Long id) {
[Link]([Link],id);
publicList<Medecin> findAll() {
Queryreq=[Link]("select m from Medecin
m");
[Link]();}}
53

Percobaan Ketiga: kelas utama


publik kelas FirstSpringProjectApplication mengimplementasikan
CommandLineRunner{
@Autowired
privateIMedecinDAOdao;
publik statis void utama(String[] args) {
[Link]([Link],
args);
}
publik void jalankan(String... argumen) melempar Pengecualian {
[Link](newMedecin("Faouzi","Njah",new
Tanggal(),"mohamed@[Link]",null,"2222"));
Dokter = [Link](3L);
[Link]("Mariam");
[Link](m);
[Link](2L);
}
}
54

Cara lain untuk mengakses data


55

Pengingat tentang arsitektur kami

Back-end

Sofa Lapisan dari Lapisan akses


Couche sécurité pameran dari
layanan profesi ke data
services

DAO
Layanan
Musim Semi
Musim Semi RESTful data
keamanan Pengendali
JPA
Entitas

Hibernate
56

Prinsip Spring Data (1/4)


Spring Data menawarkan beberapa antarmuka termasuk
interfaces des Repository peuvent hériter, afin de
dibuang secara otomatis saat mereka dihasilkan
implementasi fungsional:
▫CrudRepository<T,ID>

▫PagingAndSortingRepository<T, ID>

▫JpaRepository<T,ID>
57

Prinsip Spring Data (2/4)


•CrudRepository ditentukan oleh template
Generik, prototipe dalam tanda tangan kelasnya :
▫Definisi Tipe yang terkait dengan kelas model
(dia sendiri juga merupakan Entity JPA, sebuah kelas
mendeklarasikan @Entity).
▫Dan sebuah tipe, yang memungkinkan untuk mendefinisikan tipe kunci primer
terkait dengan entitas, baik itu unNumber (Integer, Long), atau
untuk Kunci Terkomposisi melalui kelas khusus,
dalam kedua kasus, tipe tersebut pasti Serializable
(pembatasan yang dikenakan).
CrudRepository menyediakan implementasi standar
dan secara default untuk metode umum berikut:
save, findOne, findAll, count, delete, exists, ...
Dengan demikian memungkinkan untuk memiliki metode utama
diperoleh dalam konteks layanan DAO (tidak perlu untuk mereka
ré-implémenter)
58

Prinsip Spring Data (3/4)


•PagingAndSortingRepositoryMewarisi dari
l’interfaceCrudRepository, dengan mengikuti yang sama
definisi templating Generics

•menyediakan metode tambahan untuk pengurutan


findAll(Sort), dan paginasi findAll(Pageable).
59

Prinsip Spring Data (4/4)


•JpaRepository mewarisi antarmuka
PagingAndSortingRepository, dengan menambahkannya
quelques méthodes spécifiques

•Antarmuka ini, yang paling canggih, mengelompokkan


seluruh rangkaian semua fitur yang ditawarkan
par Spring Data JPA.
60

SpringData melalui contoh (1/2)


•Untuk menggunakan Spring Data, perlu mendeklarasikan spring-
boot-starter-data-jpa sebagai ketergantungan dalam
[Link]

•Buat untuk setiap entitas yang persisten, sebuah antarmuka


Mewarisi antarmuka JpaRepository

publik antarmuka MedecinRepository memperluas JpaRepository<Medecin, Long>


{

}
61

Spring Data melalui contoh (2/2)


•Kita dapat menentukan Query JPQL kita sendiri
langsung di dalam tubuh antarmuka, di
mendefinisikan ulang implementasi standar dengan sebuah
@nnotation @Query(" select... " )
publik antarmuka MedecinRepository memperluas JpaRepository<Medecin, Long>
{
select m from Medecin m where [Link] like :x
publicList<Medecin> chercher(@Param("x")Stringmc);
}
62

Rappel de notre architecture

Back-end

Sofa
Lapisan Lapisan akses
Couche sécurité pameran
layanan profesi data
layanan

DAO
Layanan
Musim Semi
Musim Semi RESTful data
keamanan Pengendali
JPA
Entitas

Hibernate
63

Implementasi lapisan bisnis


(1/4)
•Menentukan antarmuka yang berisi spesifikasi dari
bagian bisnis dari sebuah aplikasi
•Mendefinisikan kelas yang mengimplementasikan antarmuka ini dan
menggunakan anotasi @Service
• Anotasi ini adalah bentuk khusus dari
anotasi @Component yang ditujukan untuk digunakan dalam
lapisan layanan.
•Contoh:
▫Menentukan antarmukaIPatientServiceserta
implementasi
▫Menentukan antarmuka IMedecinService serta
implementasi
▫Mendefinisikan interface IConsultationService serta
implementasi
64

Implementasi lapisan bisnis


(2/4)
publik interface IPatientService {
//Metode Crud
publikPasien tambahPasien(Pasienp);
publik void hapusPasien(Long id) ;
publicPatient updatePatient(Patientp);
publicPatient findPatient(Longid) ;
publicList<Patient> temukanSemua();
//Metode lain
publicMedecinGeneraliste findMG(LongpatientID);
publicCollection<MedecinSpecialiste> findMS(LongpatientID);
}

@Layanan
@Transaksional
publik kelasPatientServiceimplementsIPatientService {
@Autowired
PatientRepositorypatDao;
65

Implementasi lapisan bisnis


(3/4)
@Service
Transaksional
publik kelas LayananPasien mengimplementasikan IPelayananPasien {
@Autowired
PatientRepositorypatDao;
publicPatient addPatient(Patientp) {
[Link](p);
}
public voiddeletePatient(Longid) {
Optional<Patient> p = [Link](id);
jika(p!=null)
[Link]([Link]());
}
publikPembaruan pasien(Pasienp) {
[Link](p);
}
publicPatient findPatient(Longid) {
[Link](id);
}
66

Implementasi lapisan bisnis


(4/4)
publicList<Patient> findAll() {
[Link]();
}
publicMedecinGeneraliste findMG(LongpatientID) {
Optional<Patient>p=[Link](patientID);
jika(p!=null)
[Link]().getGeneraliste();
kembali null;
}
publicCollection<MedecinSpesialis> findMS(Long
patientID) {
Optional<Patient> p = [Link](patientID);
jika(p!=null)
[Link]().getSpesialis();
kembalikan null;
}
}
67

Pengingat tentang arsitektur kami

Back-end

Bantal
Lapisan Lapisan akses
Couche sécurité pameran dari
layanan profesi data
layanan

DAO
Service
Musim Semi
Musim Semi RESTful data
keamanan Pengendali
JPA
Entitas

Hibernate
68

Implementasi lapisan bisnis di


menggunakan layanan Web RESTful
•Layanan Web RESTful adalah kelas Java
dihiasi dengan anotasi @RestController
•@RestControllerest simplement la combinaison
dari dua anotasi:
▫@Controller di Spring yang memungkinkan untuk menunjuk sebuah
kelas sebagai pengendali, yang memiliki kemampuan untuk memproses
permintaan jenis GET, POST, dll.
Anotasi ini dapat digunakan untuk mengidentifikasi
pengendali untuk Spring MVC
▫@ResponseBody ditambahkan pada tingkat dari
metode yang harus menjawab langsung tanpa
passer par une vue.
69

Implementasi lapisan bisnis dalam


menggunakan layanan Web RESTful
Kami akan membuat layanan web RESTful
mempresentasikan API REST yang mengelola operasi CRUD
entitas pasien, dokter, dan konsultasi
▫[Link]
▫[Link]
▫[Link]
Setiap pengendali akan bertanggung jawab untuk menjawab kepada
permintaan CRUD dan melakukan operasi
diperlukan.
70

Implementasi lapisan bisnis dalam


menggunakan layanan Web RESTful
•Kami mencari untuk memanggil misalnya mikro-
layanan yang mengelola pasien di URL berikut:
▫Permintaan GET ke /Patients: menampilkan daftar semua
pasien;
▫Permintaan GET ke /Patients/{id}: menampilkan seorang pasien
melalui Idnya ;
▫Permintaan PUT ke /Patients/{id}: memperbarui seorang
pasien berdasarkan Id-nya ;
▫Permintaan POST ke /Patients: menambahkan seorang pasien;
▫Permintaan DELETE ke /Patients/{id}: menghapus sebuah
pasien berdasarkan Id-nya.
71

Implementasi lapisan bisnis di


menggunakan layanan Web RESTful
@RestController
kelas PublikKontrolerPasien {
@Autowired
PatientRepositorypRep;
@RequestMapping(value="/patients ", method=[Link])
publicList<Patient> findPatients ()
{
[Link]();
}
}

•@RequestMapping memungkinkan untuk menghubungkan antara URI


"/patients", invoquée via GET, et la méthodefindPatients()
•Anotasi ini digunakan pada tingkat kelas dan
metode.
•Kita bisa menggunakan sebagai pengganti @GetMapping
72

Implementasi lapisan bisnis dalam


menggunakan layanan Web RESTful
@RequestMapping(value="/pasien/{id}", method=[Link])
publicPatient findOnePatient(@PathVariableLongid)
{
[Link](id).get();
}

•@PathVariable Anotasi ini digunakan untuk menandai


argumen metode manajer permintaan.
•Metode ini hanya harus menjawab permintaan dengan
sebuah URI jenis /Patients/2 misalnya.
73

Implementasi lapisan bisnis dalam


menggunakan layanan Web RESTful
•Respons JSON yang diperoleh
74

Implementasi lapisan bisnis di


menggunakan layanan Web RESTful
@RequestMapping(value="/patients/MG/{id}", method=[Link])
publicMedecin findMG(@PathVariableLongid)
{ Mencari
Pasienp=[Link](id).get(); dokter
[Link](); umum
}

@PostMapping(value="/Pasien")
publicPatient savePatient(@RequestBodyPatientp)
{
[Link](p); Tambah
}

•@RequestBodyCette annotation demande à Spring que le


JSON yang terdapat dalam tubuh permintaan akan diubah
dalam objek
75

Implementasi lapisan bisnis dalam


menggunakan layanan Web RESTful
@RequestMapping(value="/patients/{id}", method=[Link])
publik void hapusPasien(@PathVariable Long id)
{
[Link](id);
} Hapus

@RequestMapping(value="/patients/{id}", method=[Link])
publicPatient updateContact(@PathVariable(name="id") Longid,
@RequestBodyPatientp)
{
[Link](id);
[Link](p);
} Modifier
76
77

Pengantar
Spring Security adalah Kerangka kerja keamanan
ringan yang menyediakan dukungan untuk mengamankan
aplikasi Musim Semi.
•Ia dilengkapi dengan implementasi algoritma
keamanan populer
SpringSecurity mencoba memberikan solusi untuk ini
dua permasalahan :
▫autentikasi (tahu siapa saya)
▫otorisasi (tahu apa yang saya berhak untuk
faire)
78

Keamanan dasar dengan Spring Security


•Untuk menggunakan Spring Security, sertakan ketergantungan ini
di file [Link] Anda
<ketergantungan>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Konfigurasi seperti itu memungkinkan untuk memiliki keamanan tingkat 0
▫Akses ke fitur situs harus dilakukan setelah
autentikasi
▫Untuk pengguna default "user", kata sandinya adalah
dihasilkan secara acak setiap kali dimulai:
79

Keamanan dasar dengan Spring security

{"nom": "mohamed", "prenom": "keskes",


"dateNaissance": "2018-10-16", "photo": null,
"email": "mohamed@[Link]", "tel": "2844777",
"numCnam": "15588123", "generaliste": { "id": 1,
"nom": "Faouzi", "prenom": "Njah",
localhost:8080/pasien/1 "dateNaissance": "2018-10-16", "email":
"mohamed@[Link]", "photo": null,
"codePublic": "2222" }, "id": 1}
80

Sécurité basique avec Spring security


•Kata sandi yang telah dibuat dapat diubah
melalui file [Link] seperti
suit
[Link]=user
[Link]=1111
81

Peran dan pengguna disimpan dalam memori


Peran dan pengguna yang disimpan dalam DB
82

Peran dan pengguna yang disimpan dalam memori


Autentikasi (1/6)
Langkah pertama adalah membuat sebuah kelas dari
konfigurasi
▫Menggunakan anotasi @Configuration
▫Menggunakan juga salah satu dari anotasi ini
@EnableWebSecurity, et/ou

@EnableGlobalMethodSecurity, et/ou

@EnableGlobalAuthentication.

▫Semua tergantung pada tingkat keamanan yang diaktifkan


83

Peran dan pengguna yang disimpan dalam memori


Autentikasi (2/6)
•Ini adalah contoh bean konfigurasi
@Configuration
@EnableKeamananWeb
publik kelas MySpringSecurityConfig diperluas
WebSecurityConfigurerAdapter{
@Autowired
publik void konfigurasiGlobal(AuthenticationManagerBuilder auth)
melemparPengecualian {
[Link]()
.withUser("user").password("{noop}123").roles("USER");
}
}

•Mode otentikasi dalam kode ini:


▫setiap pengguna didefinisikan secara manual dalam aplikasi. Sebagai contoh
Hanya pengguna "user" dengan peran "USER" yang dapat melakukan otentikasi.
84

Peran dan pengguna yang disimpan dalam memori


Autentikasi (3/6)
•Prefiks pada tingkat kata sandi{noop}adalah
digunakan untuk menjaga kesalahan encoder dari Spring
Keamanan 5 :NoOpPasswordEncoder
▫Ini bukan praktik yang baik untuk menyimpan kata sandi
dalam teks biasa
▫Encoder ini tidak aman, digunakan hanya untuk uji coba

Lebih baik menggunakan encoder


BCryptPasswordEncoder
85

Peran dan pengguna yang disimpan dalam memori


Autentikasi(4/6)
•Dans le cas de notre application Web:
@Konfigurasi
@EnableWebSecurity
publik kelas MySpringSecurityConfig memperluas
WebSecurityConfigurerAdapter{
@Autowired
publik void konfigurasiGlobal(AuthenticationManagerBuilder auth)
throwsException {
otentikasi
.inMemoryAuthentication()
.withUser("admin").password("{noop}1111").roles("ADMIN").and()
.denganPengguna("pasien").kataSandi("{noop}2222").peran("PASIEN").dan()
.withUser("medecin").password("{noop}3333").roles("MEDECIN");
}
}
86

Peran dan pengguna yang disimpan dalam memori


Otentikasi(5/6)
•Saat memuat bean ini, sebuah filter servlet
(springSecurityFilterChain) telah dibuat.
▫Dia yang akan mengatur seluruh keamanan
memvalidasi apakah pengguna terautentikasi atau tidak
memvalidasi apakah pengguna memiliki hak akses ke
sumber atau tidak
mengelola otentikasi dan pemutusan sambungan pengguna
mengelola kasus kesalahan dan mengarahkan pengguna ke
halaman kesalahan
87

Peran dan pengguna yang disimpan dalam memori


Authentification(6/6)
Anda harus benar-benar mendefinisikan satu dan hanya satu
AuthenticationManagerBuilder
aplikasi.
Kelas ini memungkinkan untuk menentukan apa mode yang akan digunakan
otentikasi pengguna.
▫autentikasiDalamMemori()
▫jdbcAuthentication()
88

Peran dan pengguna yang disimpan dalam memori


Otorisasi(1/5)
•Untuk menambahkan aturan keamanan dan sumber daya
yang ingin dilindungi, kita harus mendefinisikan ulang metodenya
berikutnya

@Override
protected voidconfigure(HttpSecurityhttp)throwsException {
//TODOMetode yang dihasilkan secara otomatis
[Link](http);
}
89

Peran dan pengguna yang disimpan dalam memori


Autorisasi: mengamankan URL (2/5)
• Kelas konfigurasi kami yang diberikan sebagai contoh
mengusulkan konfigurasi default yang adalah
selanjutnya:
dilindungi void konfigurasi(HttpSecurity http) melempar Pengecualian
{
http
.authorizeRequests() Aturan keamanan pertama:
Setiap permintaan harus diautentikasi
.anyRequest().authenticated()
.dan() Aturan keamanan kedua
.formLogin() Alihkan permintaan ke formulir masuk
.dan()
Aturan keamanan ketiga
.httpBasic();
}
90

Peran dan pengguna disimpan dalam memori


Otorisasi : mengamankan URL (3/5)
• Kita bisa kurang ketat atau lebih ketat.
dengan mendefinisikan ulang metode ini dan di
memersonakan sesuai kebutuhan kami
• Contoh:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/patients/**").hasRole("ADMIN")
.dan()
.formLogin()
.defaultSuccessUrl("/patients");;

}
91

Peran dan pengguna yang disimpan dalam memori


Otorisasi: mengamankan metode (4/5)
•Kita dapat menambahkan keamanan di sisi metode
•Anda harus menggunakan anotasi berikut pada kelas
konfigurasi keamanan Spring:
@EnableGlobalMethodSecurity(securedEnabled = true)
•Anda juga perlu menggunakan anotasi @securedau
tingkat metode sebagai berikut :
@Diamankan("ROLE_ADMIN")
publicvoiduneMethodeSecurisee() {
// kode yang hanya dapat dijalankan
oleh admin
}
N.B: Spring Security secara otomatis menambahkan
préfixeROLE_àn’importequel rôle
92

Peran dan pengguna yang disimpan dalam memori


Otorisasi: amankan metode (5/5)
•Contoh: Hanya administrator yang memiliki hak untuk
daftar semua pasien
@RequestMapping(value="/patients",method=[Link])
@Dijamin({"PERAN_ADMIN", "PERAN_MEDECIN"})
publicList<Patient> findPatients ()
{
[Link]();
}
93

Peran dan pengguna yang disimpan di BD

Pengguna Peran
* *
username: String
role: String
password: String
description: String
activated:boolean

•Harus membuat entitas-entitas ini


•Membuat lapisan DAO dengan mengimplementasikan antarmuka
UserRepositoyetRoleRepository
•Mengisi tabel dengan mendefinisikan misalnya 3 pengguna:
seorang administrator, seorang pasien dan seorang dokter
Anda dapat menambahkan layanan Rest untuk mengelola
pengguna dan peran
94

Peran dan pengguna yang disimpan di BD


Création des entités USER et ROLE
@Entitas
publik kelas Pengguna mengimplementasikan Serializable {
@Id
privateStringusername;
privateStringpassword;
private boolean aktif;
@ManyToMany
privateCollection<Role>roles;
// Getter, setter, dan konstruktor
}

@Entitas
public classRoleimplementsSerializable {
@Id
privateStringperan;
privateStringdeskripsi;
//Pengambil, penetap dan konstruktor
}
95

Rôles dan pengguna disimpan di BD


Pembuatan repository

publik antarmuka UserRepository memperluas JpaRepository<User, String>


{
}

publik antarmuka RoleRepository memperluas JpaRepository<Role, String> {

}
96

Peran dan pengguna yang disimpan di BD


Definisi pengguna dan peran
@Autowired
RoleRepositoryroleRepository;
publik statis void main(String[] args) {
[Link]([Link],args);
}
publik void run(String...args) melempar Exception {
//penyisipan peran aplikasi
Roleadmin=newRole("ADMIN","administrateur");
Rolepatient=newRole("PATIENT","patient");
Rolemedecin=newRole("MEDECIN","medecin");
[Link](admin);
[Link](patient);
[Link](medik)

}
97

Peran dan pengguna disimpan di BD


Definisi pengguna dan peran
insertion 3 pengguna
UseradminUser=newUser("admin","1111",true);
Collection<Role> lst = new ArrayList<>();
[Link]([Link]("ADMIN").get());
[Link](lst);
[Link](adminUser);

UserpUser=newUser("pasien1","p2222",true);
Collection<Role>lst1=newArrayList<>();
[Link]([Link]("PATIENT").get());
[Link](lst1);
[Link](pUser);

UsermUser=newUser("medecin1","m2222",true);
Collection<Role>lst2=newArrayList<>();
[Link]([Link]("MEDECIN").get());
[Link](lst2);
[Link](mUser);
98

Peran dan pengguna disimpan di DB


Autentikasi
@Autowired
publik void konfigurasiglobal(AuthenticationManagerBuilder auth,
DataSourcedataSource)throwsException {
[Link]()
.dataSource(dataSource)
.usersByUsernameQuery("select username as principal, password as
kredensial, benar dari pengguna dimana nama_pengguna=?
pihakBerwenangDenganKueriNamaPengguna("pilih user_username sebagai prinsipal,
roles_role sebagai peran dari user_roles di mana user_username=?
.rolePrefix("ROLE_");

•Dua permintaan ini digunakan oleh Spring Security untuk


▫Mengambil pengguna dan memeriksa keberadaan dan kata sandinya
de passe
▫Mengambil peran pengguna ini
99

Peran dan pengguna yang disimpan di BD


Pengkode Kata Sandi
•Tentukan pengkode kata sandi dalam kelas
konfigurasi Spring Security
@Bean
publicPasswordEncoder passwordEncoder(){
PasswordEncoder encoder = new BCryptPasswordEncoder();
returnencoder;
}
•Ini berarti bahwa kata sandi telah dimasukkan dalam
basis data terenkripsi
Stringpassword= passwordEncoder().encode("0000");
UseradminUser=newUser("superadmin",password,true);
Collection<Role> lst = newArrayList<>();
[Link]([Link]("ADMIN").get());
[Link](lst);
[Link](adminUser);
100

Pendalaman
•Tutorial tentang keamanan Spring dan JWT (Json Web)
Token)
•[Link]
Q4dk&list=PLI4OjXANJOaFv4XCI1wwO7ZDURpN
I18Iu
101

Kekurangan keamanan
Penyalahgunaan Permintaan Situs Silang (CRSF)
•Tipe kerentanan layanan
otentikasi Web
Serangan ini memungkinkan untuk mengirimkan kepada seorang
pengguna terautentikasi
•Sebuah permintaan HTTP palsu yang mengarah ke sebuah
tindakan internal di situs
•Agar dia melakukannya tanpa menyadarinya dan dalam
menggunakan haknya sendiri
•Pengguna menjadi komplotan dari sebuah serangan
tanpa menyadarinya

Anda mungkin juga menyukai