Untuk memperkenalkan pengaturcaraan berorientasikan aspek (AOP), anda perlu terlebih dahulu mempertimbangkan senario seperti ini: Syarikat itu mempunyai sistem pengurusan sumber manusia pada masa ini. telah berada dalam talian, tetapi sistem berjalan tidak stabil dan kadangkala berjalan dengan sangat perlahan Untuk mengesan pautan yang mempunyai masalah, pembangun ingin memantau masa pelaksanaan setiap kaedah, dan kemudian menentukan masalah berdasarkan masa pelaksanaan ini. Apabila masalah telah diselesaikan, keluarkan monitor ini. Sistem sedang berjalan Jika anda mengubah suai secara manual beribu-ribu kaedah dalam sistem, beban kerja akan menjadi terlalu banyak, dan kaedah pemantauan ini perlu dialih keluar pada masa hadapan. Jika anda boleh menambah kod secara dinamik semasa sistem berjalan, masalah dapat diselesaikan dengan baik. Pengaturcaraan berorientasikan aspek (AOP) ialah cara menambahkan kod secara dinamik pada masa jalan sistem. Spring Boot menyediakan sokongan yang baik untuk AOP. Dalam AOP, terdapat beberapa konsep biasa untuk difahami:
Mata gabungan ialah kaedah dalam kelas yang boleh dipertingkatkan. Sebagai contoh, jika anda ingin mengubah suai fungsi kaedah itu, maka kaedah itu ialah titik sambungan
Pointcut merujuk kepada mentakrifkan operasi memintas titik gabungan. Takrifan ini merujuk kepada memintas semua kaedah bermula dengan sisipan sebagai titik masuk
Selepas memintas Joinpoint, operasi yang perlu dilakukan ialah menghantar pemberitahuan. Sebagai contoh, pemantauan log cetakan yang dinyatakan sebelum ini. Pemberitahuan dibahagikan kepada prapemberitahuan, pascapemberitahuan, pemberitahuan pengecualian, pemberitahuan akhir dan pemberitahuan sekitar
Aspek: gabungan Pointcut dan Nasihat
Sasaran (objek sasaran): Kelas yang akan dipertingkatkan menjadi Sasaran
Spring Boot menyediakan automasi untuk konfigurasi AOP berdasarkan pada Spring penyelesaian spring-boot-starter-aop, mula-mula perkenalkan dependencies, seperti berikut:
<!-- AOP 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
Kemudian buat kelas UserService di bawah pakej com.sang.aop.service, seperti berikut:
@Service public class UserService { public String getUserById(Integer id){ System.out.println("get..."); return "user"; } public void deleteUserById(Integer id){ System.out.println("delete..."); } }
Kemudian cipta Aspek, seperti berikut:
@Component @Aspect public class LogAspect { @Pointcut("execution(* com.sang.aop.service.*.*(..))") public void pc1() { } @Before(value = "pc1()") public void before(JoinPoint jp) { String name = jp.getSignature().getName(); System.out.println(name + "方法开始执行..."); } @After(value = "pc1()") public void after(JoinPoint jp) { String name = jp.getSignature().getName(); System.out.println(name + "方法执行结束..."); } @AfterReturning(value = "pc1()", returning = "result") public void afterReturning(JoinPoint jp, Object result) { String name = jp.getSignature().getName(); System.out.println(name + "方法返回值为:" + result); } @AfterThrowing(value = "pc1()",throwing = "e") public void afterThrowing(JoinPoint jp, Exception e) { String name = jp.getSignature().getName(); System.out.println(name+"方法抛异常了,异常是:"+e.getMessage()); } @Around("pc1()") public Object around(ProceedingJoinPoint pjp) throws Throwable { return pjp.proceed(); } }
Penerangan kod:
@Anotasi aspek menunjukkan bahawa ini ialah kelas aspek
@Pointcut( ) anotasi digunakan dalam kaedah pc1() untuk mentakrifkan pointcut.. * pertama dalam pelaksanaan menunjukkan bahawa kaedah mengembalikan sebarang nilai, yang kedua * menunjukkan mana-mana kelas di bawah pakej perkhidmatan, yang ketiga * menunjukkan sebarang kaedah dalam kelas, dan dua titik dalam kurungan menunjukkan bahawa parameter kaedah adalah sewenang-wenangnya, seperti yang diterangkan. di sini Titik masuk ialah semua kaedah dalam semua kelas di bawah pakej perkhidmatan
kaedah sebelum() menggunakan anotasi @Before, menunjukkan bahawa ini adalah pra-pemberitahuan dan kaedah itu dilaksanakan sebelum kaedah sasaran dilaksanakan. Parameter JoinPoint boleh memberikan nama, pengubah suai dan maklumat lain tentang kaedah sasaran
kaedah selepas() menggunakan anotasi @After, menunjukkan bahawa ini ialah pemberitahuan selepas. kaedah berada dalam kaedah sasaran Laksanakan selepas pelaksanaan
kaedah afterReturning() menggunakan anotasi @AfterReturning, menunjukkan bahawa ini adalah pemberitahuan pulangan dan nilai pulangan kaedah sasaran boleh diperolehi dalam kaedah ini. Parameter pemulangan dalam anotasi @AfterReturning mewakili nama pembolehubah nilai pulangan yang sepadan dengan parameter kaedah. Ambil perhatian bahawa jenis hasil ditakrifkan dalam parameter kaedah sebagai Objek, yang bermaksud bahawa nilai pulangan kaedah sasaran boleh dari mana-mana jenis Jika jenis parameter hasil adalah Panjang, maka kaedah ini hanya boleh mengendalikan situasi di mana nilai pulangan kaedah sasaran ialah Panjang
Kaedah afterThrowing() menggunakan anotasi @AfterThrowing, menunjukkan bahawa ini ialah pemberitahuan pengecualian, iaitu, apabila pengecualian berlaku dalam sasaran kaedah, kaedah akan dipanggil Jenis pengecualian ialah Pengecualian, yang bermaksud bahawa semua pengecualian akan dimasukkan Dieksekusi dalam kaedah ini, jika jenis pengecualian ialah ArithmeticException, ia bermakna hanya apabila kaedah sasaran membuang pengecualian ArithmeticException, kaedah itu akan menjadi. dimasukkan untuk diproses
Versi perenggan ini yang ditulis semula: Kaedah around() yang dianotasi dengan @Around dipanggil nasihat sekeliling. Pemberitahuan keliling mempunyai fungsi yang paling berkuasa daripada semua pemberitahuan Ia boleh melaksanakan pra-pemberitahuan, pasca-pemberitahuan, pemberitahuan pengecualian dan pemberitahuan kembali. Selepas kaedah sasaran memasuki pemberitahuan sekeliling, kaedah sasaran meneruskan pelaksanaan dengan memanggil kaedah proceed bagi objek ProceedingJoinPoint Pembangun boleh mengubah suai parameter pelaksanaan, nilai pulangan, dsb. kaedah sasaran di sini dan mengendalikan pengecualian kaedah sasaran <. 🎜>
kaedah getUserById mula dilaksanakan...Lain-lainHalaman alu-aluan tersuaiget...
nilai pulangan kaedah getUserById ialah: pengguna
perlaksanaan kaedah getUserById tamat...
Kaedah deleteUserById mula dilaksanakan...
padam...
nilai pulangan kaedah deleteUserById ialah: null
perlaksanaan kaedah deleteUserById tamat...
例如,如果想使用静态的 index.html 页面作为项目的首页,只需在 resources/static 目录下创建 index.html 文件疾苦。若想使用动态页面作为项目首页,则需在 resources/templages 目录下创建 index.html (使用Thymeleaf 模板) 或者 index.ftl(使用 FreeMarker 模板),然后在 Controller 中返回逻辑视图名,如下:
@Controller public class IndexController { @RequestMapping("/index") public String index(){ return "index"; } }
运行项目,输入"http://localhost:8081",查看结果
favicon.ico 是浏览器选项卡左上角的图标,可以放在静态资源路径下或者类路径下,静态资源路径下的 favicon.ico 优先级高于类路径下的 favicon.ico
可以使用在线转换网站:https://www.bitbug.net/ 将一张普通图片转为 .ico 图片,转换成功后,将文件重命名为 favicon.ico ,然后复制到 resources/static 目录下,如图
启动项目,查看效果
注意:清缓存,然后 Ctrl+F5 强制刷新
Spring Boot 中提供了大量的自动化配置类,在 Spring Boot 的入口类上有一个 @SpringBootApplication 注解。该注解是一个组合注解,由 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 组成,其中 @EnableAutoConfiguration 注解开启自动化配置,相关的自动化配置就会被使用。要移除某个自动化配置,开发者可以按照以下方法进行相应的配置更改
@SpringBootApplication @EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class}) public class Chapter04Application { public static void main(String[] args) { SpringApplication.run(Chapter04Application.class, args); } }
在 @EnableAutoConfiguration 注解中使用 exclude 属性去除 Error 的自动化配置类,这时如果在 resources/static/error 目录下创建 4xx.htnl、5xx.html ,访问出错时就不会自动跳转了。由于 @EnableAutoConfiguration 注解的 exclude 属性值是一个数组,因此有多个要排除的自动化配置文件只需要继续添加即可。另外一种配置方法是在 application.properties 文件中进行配置,示例如下:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
添加前
添加后
Atas ialah kandungan terperinci Bagaimana untuk mengkonfigurasi integrasi AOP SpringBoot dengan Web. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!