当前位置:   article > 正文

Java面试之springboot项目常见问题(附带代码持续更新中...)_java springboot面试

java springboot面试

目录

1、你是如何配置Spring Boot应用程序的?

2、你如何实现Spring Boot应用程序的日志记录?

3、你如何处理Spring Boot应用程序的异常?

4、你如何处理Spring Boot应用程序的安全性?

5、你如何实现Spring Boot应用程序的缓存?

6、你如何实现Spring Boot应用程序的数据库访问?

7、你如何实现Spring Boot应用程序的RESTful API?

8、你如何实现Spring Boot应用程序的测试?

9、你如何实现Spring Boot应用程序的部署和监控?

10、你如何使用aop进行编程?


以下是一些可能会被问到的Spring Boot项目面试问题:

1、你是如何配置Spring Boot应用程序的?

当面试官问到你如何配置Spring Boot应用程序时,你可以回答如下:

1. 配置文件:Spring Boot应用程序的配置文件是application.properties或application.yml,可以在其中配置应用程序的各种属性。例如,可以配置应用程序的端口号、数据库连接信息、日志级别等。配置文件的优先级按照以下顺序:命令行参数 > 系统属性 > 环境变量 > application.properties > application.yml。

2. 自动配置:Spring Boot提供了自动配置的功能,可以根据应用程序的依赖自动配置应用程序的各种组件。例如,如果应用程序引入了Spring Data JPA依赖,Spring Boot会自动配置JPA相关的组件,包括数据源、实体管理器、事务管理器等。

3. 配置类:Spring Boot应用程序可以使用@Configuration注解的配置类来配置各种组件。配置类可以使用@Bean注解来声明组件,也可以使用@Conditional注解来根据条件选择不同的配置。

4. 外部化配置:Spring Boot应用程序可以使用外部化配置的方式来配置应用程序的属性。外部化配置可以使用命令行参数、系统属性、环境变量、属性文件等方式来配置应用程序的属性。

在回答这个问题时,你需要详细介绍Spring Boot应用程序的配置方式和优先级,以及自动配置和配置类的使用方法。同时,你还需要强调外部化配置的重要性,并举例说明如何使用命令行参数、系统属性、环境变量、属性文件等方式来配置应用程序的属性。

2、你如何实现Spring Boot应用程序的日志记录?

当面试官问到你如何实现Spring Boot应用程序的日志记录时,你可以详细回答如下:

1. 引入slf4j依赖:在pom.xml文件中引入slf4j的依赖,例如:

  1. <dependency>
  2. <groupId>org.slf4j</groupId>
  3. <artifactId>slf4j-api</artifactId>
  4. <version>${slf4j.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. <version>${logback.version}</version>
  10. </dependency>

2. 配置logback:在src/main/resources目录下创建logback.xml文件,并配置logback,例如:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  4. <encoder>
  5. <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  6. </encoder>
  7. </appender>
  8. <root level="INFO">
  9. <appender-ref ref="CONSOLE" />
  10. </root>
  11. </configuration>

3. 使用slf4j:在应用程序中使用slf4j进行日志记录,例如:

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. @RestController
  4. @RequestMapping("/users")
  5. public class UserController {
  6. private static final Logger logger = LoggerFactory.getLogger(UserController.class);
  7. @GetMapping("/{id}")
  8. public User getUserById(@PathVariable Long id) {
  9. logger.info("根据ID获取用户信息,ID={}", id);
  10. // ...
  11. }
  12. @PostMapping
  13. public User createUser(@RequestBody User user) {
  14. logger.info("创建用户,用户信息={}", user);
  15. // ...
  16. }
  17. // ...
  18. }

在回答这个问题时,你需要详细介绍如何使用slf4j进行日志记录,并且需要强调日志记录的重要性。同时,你还需要举例说明如何在logback.xml文件中配置logback,以及如何在控制器类中使用slf4j进行日志记录。

3、你如何处理Spring Boot应用程序的异常?

当面试官问到你如何处理Spring Boot应用程序的异常时,你可以详细回答如下:

1. 异常处理方式:Spring Boot应用程序可以使用@ControllerAdvice和@ExceptionHandler注解来处理异常。@ControllerAdvice注解用于定义全局异常处理类,@ExceptionHandler注解用于定义异常处理方法。

2. 全局异常处理类:全局异常处理类可以处理所有Controller中抛出的异常,例如:

  1. @ControllerAdvice
  2. public class GlobalExceptionHandler {
  3. @ExceptionHandler(Exception.class)
  4. public ResponseEntity<ErrorResponse> handleException(Exception ex) {
  5. ErrorResponse error = new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
  6. return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);
  7. }
  8. }

3. Controller异常处理:Controller中的异常处理方法可以处理Controller中抛出的异常,例如:

  1. @RestController
  2. @RequestMapping("/users")
  3. public class UserController {
  4. @Autowired
  5. private UserService userService;
  6. @GetMapping("/{id}")
  7. public User getUserById(@PathVariable Long id) {
  8. User user = userService.getUserById(id);
  9. if (user == null) {
  10. throw new UserNotFoundException("用户不存在");
  11. }
  12. return user;
  13. }
  14. @ExceptionHandler(UserNotFoundException.class)
  15. public ResponseEntity<ErrorResponse> handleUserNotFoundException(UserNotFoundException ex) {
  16. ErrorResponse error = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
  17. return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
  18. }
  19. }

在回答这个问题时,你需要详细介绍如何处理Spring Boot应用程序的异常,并且需要强调异常处理的重要性。同时,你还需要举例说明如何使用@ControllerAdvice和@ExceptionHandler注解来定义全局异常处理类和Controller异常处理方法,并且需要说明处理异常的流程和注意事项。

4、你如何处理Spring Boot应用程序的安全性?

当面试官问到你如何处理Spring Boot应用程序的安全性时,你可以详细回答如下:

1. 引入安全依赖:在pom.xml文件中引入Spring Security的依赖,例如:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. <version>${spring-boot.version}</version>
  5. </dependency>

2. 配置安全:在application.properties或application.yml文件中配置安全,例如:

  1. spring.security.user.name=user
  2. spring.security.user.password=password

3. 创建安全配置类:创建安全配置类,继承自WebSecurityConfigurerAdapter,并重写configure方法,例如:

  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. @Override
  5. protected void configure(HttpSecurity http) throws Exception {
  6. http.authorizeRequests()
  7. .antMatchers("/users/**").authenticated()
  8. .anyRequest().permitAll()
  9. .and()
  10. .formLogin()
  11. .and()
  12. .logout();
  13. }
  14. @Override
  15. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  16. auth.inMemoryAuthentication()
  17. .withUser("user")
  18. .password("{noop}password")
  19. .roles("USER");
  20. }
  21. }

这段代码是Spring Security中的配置代码,用于配置应用程序的安全性。具体来说,这段代码做了以下事情:

  1. 获取一个ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry对象,用于配置请求的认证和授权。

  2. 配置忽略认证和授权的路径,即ignoredUrlsProperties.getUrls()中的路径。

  3. 配置表单登录方式,即用户需要通过登录页面进行登录认证,登录成功后会调用successHandler,登录失败后会调用failHandler。

  4. 配置注销功能,即用户可以通过/logout路径进行注销。

  5. 配置请求授权,即所有请求都需要身份认证。

  6. 关闭跨站请求防护。

  7. 配置会话管理策略,即不使用session。

  8. 配置自定义权限拒绝处理类。

  9. 添加JWT过滤器,除/login路径之外的所有请求都需要经过此过滤器进行认证和授权。

这段代码主要是为了保护应用程序的安全性,确保只有经过认证和授权的用户才能访问应用程序中的资源。同时,它还使用JWT过滤器对请求进行认证和授权,增加应用程序的安全性。需要注意的是,这里的配置是一个示例,实际应用中需要根据具体需求进行配置和实现。
4. 使用安全:在应用程序中使用安全,例如:

  1. @RestController
  2. @RequestMapping("/users")
  3. public class UserController {
  4. @GetMapping("/{id}")
  5. public User getUserById(@PathVariable Long id) {
  6. // ...
  7. }
  8. @PostMapping
  9. public User createUser(@RequestBody User user) {
  10. // ...
  11. }
  12. // ...
  13. }

在回答这个问题时,你需要详细介绍如何使用Spring Security处理Spring Boot应用程序的安全性,并且需要强调安全性的重要性。同时,你还需要举例说明如何在application.properties或application.yml文件中配置安全,以及如何创建安全配置类,并在控制器类中使用安全。需要注意的是,这里的示例代码仅仅是一个简单的示例,实际应用中需要根据具体需求进行配置和实现。

5、你如何实现Spring Boot应用程序的缓存?

1. 添加Redis依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2. 配置Redis连接:

  1. spring.redis.host=localhost
  2. spring.redis.port=6379

3. 创建一个缓存管理类:

  1. @Component
  2. public class RedisCacheManager implements CacheManager {
  3. private final RedisTemplate<String, Object> redisTemplate;
  4. public RedisCacheManager(RedisTemplate<String, Object> redisTemplate) {
  5. this.redisTemplate = redisTemplate;
  6. }
  7. @Override
  8. public Cache getCache(String name) {
  9. return new RedisCache(name, redisTemplate);
  10. }
  11. @Override
  12. public Collection<String> getCacheNames() {
  13. return Collections.emptyList();
  14. }
  15. }

- `@Component`注解表示这是一个Spring Bean。
- `RedisCacheManager`实现了`CacheManager`接口,用于管理缓存。
- `RedisTemplate`是Spring提供的Redis客户端模板,用于操作Redis。
- `getCache`方法用于获取一个指定名称的缓存实例。
- `getCacheNames`方法返回所有缓存的名称。

4. 创建一个Redis缓存类:

  1. public class RedisCache implements Cache {
  2. private final String name;
  3. private final RedisTemplate<String, Object> redisTemplate;
  4. public RedisCache(String name, RedisTemplate<String, Object> redisTemplate) {
  5. this.name = name;
  6. this.redisTemplate = redisTemplate;
  7. }
  8. @Override
  9. public String getName() {
  10. return name;
  11. }
  12. @Override
  13. public Object getNativeCache() {
  14. return redisTemplate;
  15. }
  16. @Override
  17. public ValueWrapper get(Object key) {
  18. Object value = redisTemplate.opsForValue().get(key.toString());
  19. return value != null ? new SimpleValueWrapper(value) : null;
  20. }
  21. @Override
  22. public <T> T get(Object key, Class<T> type) {
  23. Object value = redisTemplate.opsForValue().get(key.toString());
  24. return value != null ? type.cast(value) : null;
  25. }
  26. @Override
  27. public void put(Object key, Object value) {
  28. redisTemplate.opsForValue().set(key.toString(), value);
  29. }
  30. @Override
  31. public void evict(Object key) {
  32. redisTemplate.delete(key.toString());
  33. }
  34. @Override
  35. public void clear() {
  36. redisTemplate.execute((RedisCallback<Object>) connection -> {
  37. connection.flushDb();
  38. return null;
  39. });
  40. }
  41. }

- `RedisCache`实现了Spring的`Cache`接口,用于操作缓存。
- `name`表示缓存的名称。
- `redisTemplate`是Redis客户端模板,用于操作Redis。
- `getName`方法返回缓存的名称。
- `getNativeCache`方法返回Redis客户端模板。
- `get`方法用于获取缓存中指定键的值。
- `put`方法用于向缓存中添加一个键值对。
- `evict`方法用于从缓存中删除指定键的值。
- `clear`方法用于清空缓存。

5. 在需要使用缓存的地方注入CacheManager:

  1. @Service
  2. public class MyService {
  3. private final CacheManager cacheManager;
  4. public MyService(CacheManager cacheManager) {
  5. this.cacheManager = cacheManager;
  6. }
  7. @Cacheable(value = "myCache", key = "#id")
  8. public String getValueById(String id) {
  9. // 从数据库中获取数据
  10. return "value";
  11. }
  12. @CachePut(value = "myCache", key = "#id")
  13. public void updateValueById(String id, String value) {
  14. // 更新数据库中的数据
  15. }
  16. @CacheEvict(value = "myCache", key = "#id")
  17. public void deleteValueById(String id) {
  18. // 从数据库中删除数据
  19. }
  20. }

- `@Service`注解表示这是一个Spring Service Bean。
- `MyService`类中注入了`CacheManager`实例,用于操作缓存。
- `@Cacheable`注解表示这个方法的返回值将被缓存。
- `@CachePut`注解表示这个方法的返回值将被缓存,并且会更新缓存中的值。
- `@CacheEvict`注解表示这个方法将从缓存中删除指定键的值。

下面是一个使用上面提供的缓存管理类和Redis缓存类的例子:

  1. @RestController
  2. public class MyController {
  3. private final MyService myService;
  4. public MyController(MyService myService) {
  5. this.myService = myService;
  6. }
  7. @GetMapping("/get/{id}")
  8. public String getValueById(@PathVariable String id) {
  9. return myService.getValueById(id);
  10. }
  11. @PostMapping("/update")
  12. public void updateValueById(@RequestParam String id, @RequestParam String value) {
  13. myService.updateValueById(id, value);
  14. }
  15. @DeleteMapping("/delete/{id}")
  16. public void deleteValueById(@PathVariable String id) {
  17. myService.deleteValueById(id);
  18. }
  19. }
  • MyController是一个Spring MVC的控制器,用于处理HTTP请求。
  • MyService是一个Spring Service Bean,用于操作缓存。
  • getValueById方法使用@Cacheable注解,表示这个方法的返回值将被缓存,如果缓存中存在指定键的值,则直接返回缓存中的值,否则从数据库中获取值并缓存起来。
  • updateValueById方法使用@CachePut注解,表示这个方法的返回值将被缓存,并且会更新缓存中的值。
  • deleteValueById方法使用@CacheEvict注解,表示这个方法将从缓存中删除指定键的值。
  • MyController中注入了MyService实例,用于操作缓存。
  • @GetMapping@PostMapping@DeleteMapping注解分别表示处理HTTP GET、POST和DELETE请求。

6、你如何实现Spring Boot应用程序的数据库访问?

当面试官问到你如何实现springBoot应用程序的数据访问时,你可以详细回答如下:

1. 引入数据访问依赖:在pom.xml文件中引入数据访问依赖,例如:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. <version>${spring-boot.version}</version>
  5. </dependency>

2. 配置数据源:在application.properties或application.yml文件中配置数据源,例如:

  1. spring.datasource.url=jdbc:mysql://localhost:3306/mydb
  2. spring.datasource.username=root
  3. spring.datasource.password=root
  4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3. 创建实体类:创建与数据库表对应的实体类,例如:

  1. @Entity
  2. @Table(name = "user")
  3. public class User {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Long id;
  7. private String name;
  8. private Integer age;
  9. // ...
  10. }

4. 创建数据访问接口:创建数据访问接口,继承自JpaRepository或其他的Repository接口,例如:

  1. public interface UserRepository extends JpaRepository<User, Long> {
  2. User findByName(String name);
  3. }

5. 使用数据访问接口:在应用程序中使用数据访问接口进行数据访问,例如:

  1. @RestController
  2. @RequestMapping("/users")
  3. public class UserController {
  4. @Autowired
  5. private UserRepository userRepository;
  6. @GetMapping("/{id}")
  7. public User getUserById(@PathVariable Long id) {
  8. return userRepository.findById(id).orElse(null);
  9. }
  10. @PostMapping
  11. public User createUser(@RequestBody User user) {
  12. return userRepository.save(user);
  13. }
  14. // ...
  15. }

在回答这个问题时,你需要详细介绍如何使用Spring Boot进行数据访问,并且需要强调数据访问的重要性。同时,你还需要举例说明如何在application.properties或application.yml文件中配置数据源,以及如何创建实体类和数据访问接口,并在控制器类中使用数据访问接口进行数据访问。

7、你如何实现Spring Boot应用程序的RESTful API?

当面试官问到你在Spring Boot项目中如何实现RESTful API时,你可以详细回答如下:

1. 引入Swagger依赖:在pom.xml文件中引入Swagger的依赖,例如:

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-swagger2</artifactId>
  4. <version>${swagger.version}</version>
  5. </dependency>

2. 配置Swagger:在Spring Boot的配置类中配置Swagger,例如:

  1. @Configuration
  2. @EnableSwagger2
  3. public class SwaggerConfig {
  4. @Bean
  5. public Docket api() {
  6. return new Docket(DocumentationType.SWAGGER_2)
  7. .select()
  8. .apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
  9. .paths(PathSelectors.any())
  10. .build()
  11. .apiInfo(apiInfo());
  12. }
  13. private ApiInfo apiInfo() {
  14. return new ApiInfoBuilder()
  15. .title("API文档")
  16. .description("这是一个用Swagger生成的API文档")
  17. .version("1.0.0")
  18. .build();
  19. }
  20. }

3. 添加Swagger注解:在控制器类和控制器方法上添加相应的Swagger注解,例如:

  1. @RestController
  2. @RequestMapping("/users")
  3. @Api(tags = "用户管理")
  4. public class UserController {
  5. @GetMapping("/{id}")
  6. @ApiOperation(value = "根据ID获取用户信息")
  7. public User getUserById(@PathVariable Long id) {
  8. // ...
  9. }
  10. @PostMapping
  11. @ApiOperation(value = "创建用户")
  12. public User createUser(@RequestBody User user) {
  13. // ...
  14. }
  15. // ...
  16. }

4. 访问Swagger UI界面:启动Spring Boot应用程序后,访问http://localhost:8080/swagger-ui.html即可进入Swagger UI界面,查看API文档和测试API的功能。

在回答这个问题时,你需要详细介绍Swagger的使用方法和配置方式,并且需要强调Swagger可以提高API的开发效率和质量。同时,你还可以举例说明如何在控制器类和控制器方法上添加Swagger注解,并介绍Swagger UI界面的使用方法。

8、你如何实现Spring Boot应用程序的测试?

在Spring Boot中,可以使用Spring Boot Test框架来进行测试。Spring Boot Test框架提供了许多工具和注解,可以方便地进行单元测试、集成测试和端到端测试。下面是一个简单的示例,演示如何使用Spring Boot Test框架进行单元测试:

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class MyServiceTest {
  4. @Autowired
  5. private MyService myService;
  6. @Test
  7. public void testMyService() {
  8. String result = myService.doSomething();
  9. assertEquals("expected result", result);
  10. }
  11. }

这段代码使用了

@RunWith注解和@SpringBootTes注解来启用Spring Boot Test框架。

@RunWith注解指定了测试运行器为SpringRunner.class。

@SpringBootTest注解指定了要测试的Spring Boot应用程序的入口类,这样就可以自动加载应用程序的配置和依赖项。

@Autowired注解用于自动注入MyService对象。

@Test注解用于标记测试方法。

在testMyService()方法中,调用myService的doSomething()方法,并使用assertEquals()方法断言结果是否符合预期。

需要注意的是,这里的示例仅仅是一个简单的示例,实际应用中需要根据具体需求进行配置和实现。

9、你如何实现Spring Boot应用程序的部署和监控?

Spring Boot应用程序的部署和监控可以通过以下方式实现:

  1. 部署方式
  • 打包成可执行的jar包:Spring Boot应用程序可以使用Maven或Gradle插件将其打包成可执行的jar包,然后可以直接使用java -jar命令来启动应用程序。
  • 打包成war包部署到Servlet容器:Spring Boot应用程序也可以打包成war包,然后部署到Tomcat、Jetty等Servlet容器中。
  1. 监控方式
  • Actuator:Spring Boot提供了Actuator模块,可以通过在pom.xml中添加依赖来使用。Actuator可以提供应用程序的健康状况、请求追踪、性能指标等信息。可以通过HTTP端点或JMX来访问这些信息。
  • Spring Boot Admin:Spring Boot Admin是一个开源的监控和管理Spring Boot应用程序的工具。它提供了一个Web界面,可以方便地查看应用程序的运行状态、性能指标、日志等信息,并可以对应用程序进行管理和操作。
  • 第三方监控工具:除了Actuator和Spring Boot Admin之外,还可以使用第三方监控工具来监控Spring Boot应用程序。例如,Prometheus、Grafana和ELK等工具都可以用于监控Spring Boot应用程序。

需要注意的是,部署和监控的具体实现方式会因为应用程序的不同而有所不同,需要根据具体需求进行选择和配置。

10、你如何使用aop进行编程?

AOP(Aspect Oriented Programming)即面向切面编程,是一种编程思想和技术,可以将应用程序的业务逻辑和横切关注点(如日志记录、事务管理、性能统计等)分离开来,从而提高代码的重用性、可维护性和可扩展性。

AOP实现的核心是切面(Aspect),切面是一个横切关注点的抽象,它包含了一些切点(Pointcut)和通知(Advice)。切点是一个表达式,用于指定哪些方法需要被拦截,通知是在切点被拦截时执行的代码。通知可以分为前置通知(Before)、后置通知(After)、环绕通知(Around)、异常通知(AfterThrowing)和最终通知(AfterReturning)等。

Spring框架提供了对AOP的支持,可以使用Spring AOP来实现AOP技术。Spring AOP使用了动态代理的方式,通过代理类来实现对切面的织入。同时,Spring AOP还提供了基于注解和XML配置的方式来定义切面和切点,使得使用AOP技术更加方便和灵活。

下面是一个使用Spring AOP实现日志记录的示例代码:

1.首先,定义一个切面类,用于实现日志记录:

  1. @Aspect
  2. @Component
  3. public class LoggingAspect {
  4. private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
  5. @Before("execution(* com.example.demo.service.*.*(..))")
  6. public void logBefore(JoinPoint joinPoint) {
  7. logger.info("Before method: " + joinPoint.getSignature().getName());
  8. }
  9. @After("execution(* com.example.demo.service.*.*(..))")
  10. public void logAfter(JoinPoint joinPoint) {
  11. logger.info("After method: " + joinPoint.getSignature().getName());
  12. }
  13. @AfterReturning(pointcut = "execution(* com.example.demo.service.*.*(..))", returning = "result")
  14. public void logAfterReturning(JoinPoint joinPoint, Object result) {
  15. logger.info("After returning method: " + joinPoint.getSignature().getName() + ", result: " + result);
  16. }
  17. @AfterThrowing(pointcut = "execution(* com.example.demo.service.*.*(..))", throwing = "exception")
  18. public void logAfterThrowing(JoinPoint joinPoint, Exception exception) {
  19. logger.error("After throwing method: " + joinPoint.getSignature().getName() + ", exception: " + exception.getMessage());
  20. }
  21. }

上述代码中,使用@Aspect注解标记该类为切面类,使用@Before、@After、@AfterReturning和@AfterThrowing注解定义了不同类型的通知。这些注解中,pointcut属性用于指定切点,即哪些方法需要被拦截。

2.然后,在需要记录日志的服务类中,添加@Loggable注解,标记该类需要被切面拦截:

  1. @Service
  2. @Loggable
  3. public class UserServiceImpl implements UserService {
  4. // ...
  5. }

3.最后,在Spring配置文件中,启用AOP功能:

<aop:aspectj-autoproxy />

这样,当调用UserService中的方法时,LoggingAspect中定义的通知就会被触发,从而实现对方法的日志记录。

需要注意的是,上述示例代码中,使用了Spring AOP的默认实现方式,即使用JDK动态代理。如果需要使用CGLIB代理,可以在Spring配置文件中添加以下配置:

<aop:aspectj-autoproxy proxy-target-class="true" />


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/262955
推荐阅读
相关标签
  

闽ICP备14008679号