1、@RestController @RequestMapping("/api")这两个的作用分别是什么?如何相互区分?
@RestController
注解用于标识一个类是RESTful风格的Controller,它会将方法的返回值直接转换为HTTP响应体,通常用于返回JSON或XML格式的数据。如果一个类没有@RestController
注解,Spring将不会将其识别为一个Controller类,也就无法处理HTTP请求。
@RequestMapping
注解用于映射HTTP请求路径到Controller类或方法上。它可以用于类级别和方法级别,用于定义处理请求的路径。如果一个方法没有@RequestMapping
注解,Spring将不会将其识别为一个请求处理方法,也就无法处理对应的请求。
2、 @configuration的作用以及@bean的作用?
@configuration是Spring框架中的一个注解,用于定义配置类,配置类相当于传统的Spring XML配置文件,用来定义bean。
- 被
@Configuration
注解的类会被Spring容器识别并用来生成bean定义和服务请求。示例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();} }
在Spring框架中,
@Bean
注解的主要作用是告诉Spring容器一个方法会返回一个对象,该对象需要注册为Spring应用上下文中的一个bean。具体来说,@Bean
通常用于配置类中,并用于定义生成bean的方法。以下是
@Bean
注解的一些主要作用和用途:
定义bean:
@Bean
注解的方法会返回一个对象,该对象将被Spring容器管理。可以在该方法中配置对象的初始化、配置和依赖关系。@Configuration public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();} }
2.自定义初始化和销毁方法:可以在
@Bean
注解中指定自定义的初始化和销毁方法。@Bean(initMethod = "init", destroyMethod = "cleanup") public MyService myService() {return new MyServiceImpl(); }
3.依赖注入:
@Bean
方法可以使用参数来表明依赖关系,Spring容器会自动注入这些依赖。@Bean public MyService myService(Dependency1 dep1, Dependency2 dep2) {return new MyServiceImpl(dep1, dep2); }
4.作用域:可以使用
@Bean
注解来指定bean的作用域(如单例、原型等)。@Bean @Scope("prototype") public MyService myService() {return new MyServiceImpl(); }
5.条件化创建:通过结合其他注解(如
@Conditional
),可以根据某些条件有选择地创建bean。@Bean @Conditional(MyCondition.class) public MyService myService() {return new MyServiceImpl(); }
3、 @Autowired的作用是什么?
在Spring框架中,
@Autowired
注解用于实现自动依赖注入。它告诉Spring框架自动装配依赖对象。也就是说,Spring容器会自动寻找和注入匹配的bean到标记了@Autowired
注解的字段、构造器或方法中。以下是@Autowired
注解的主要作用和用法:自动注入依赖:
@Autowired
告诉 Spring 容器将匹配的 Bean 自动注入到标注了@Autowired
的构造函数、方法或字段中。简化依赖管理:不需要显式地在代码中手动创建或获取依赖对象,Spring 容器会自动处理依赖关系,使代码更加简洁和可维护。
支持不同的注入方式:支持构造函数注入、方法注入和字段注入。
4、 @Component的作用是什么?@Component和@bean的区别是什么?
@Component
是 Spring 框架中的一个注解,用于将一个类标记为 Spring 的组件(Bean),使其可以被 Spring 容器自动检测、管理和注入。@Component
是一个通用的注解,可以用于任何层的组件。Spring 容器在启动时会扫描带有@Component
注解的类,并将其实例化、配置并注册到容器中 。
@Component
的作用:
- 将类声明为 Bean:使用
@Component
注解的类会被 Spring 自动识别为 Bean,并纳入 Spring 容器的管理中。- 自动扫描和装配:Spring 容器会自动扫描带有
@Component
注解的类并自动实例化它们。- 简化配置:使用
@Component
可以减少 XML 配置文件中的手动 Bean 定义,简化配置过程。
@Component和@bean的区别:
使用场景:
@Component
:用于注解类。通常用于告诉 Spring 这个类需要被作为一个组件进行扫描并管理。它是类级别的注解,适用于那些你直接定义在类上的 Bean。@Bean
:用于注解方法。通常用于告诉 Spring 这个方法的返回值需要作为一个 Bean 被管理。它是方法级别的注解,适用于那些你需要以编程的方式创建和配置的 Bean。使用方式:
@Component
:结合组件扫描(如@ComponentScan
)使用,适合自动发现和装配。@Bean
:结合配置类(如@Configuration
)使用,适合显式定义和配置复杂的 Bean。
5、 @Aspect的作用?
@Aspect
是 Spring AOP(Aspect-Oriented Programming,面向切面编程)中的一个注解,用于定义一个切面(Aspect)。切面是一种横切关注点的模块化表示,它可以用于集中处理诸如日志记录、安全、事务管理等系统级服务,而无需在各个业务逻辑代码中重复这些代码。
@Aspect
的作用:
- 定义切面:
@Aspect
用于声明一个类为切面,切面包含了多个关注点(如日志记录、事务管理等)的具体实现。- 模块化横切关注点:通过切面,可以将那些分散在各个类中的横切关注点代码模块化,提升代码的可维护性和可重用性。
- 声明通知(Advice):在切面类中可以定义各种类型的通知(Advice),如前置通知、后置通知、环绕通知、异常通知等,通过这些通知可以在方法执行的不同阶段进行切入。
AOP 基本概念:
- 切面(Aspect):一个关注点的模块化表示。
- 连接点(Join Point):程序执行的某个具体点。
- 通知(Advice):切面在连接点处执行的代码。
- 切入点(Pointcut):匹配连接点的表达式。
- 目标对象(Target Object):被通知的对象。
- 代理(Proxy):通知目标对象后创建的对象。
- 织入(Weaving):将切面应用到目标对象来创建代理对象的过程。
6、@Resourse 的作用?和@Autowired注解的区别是什么?
主要作用
- 注入依赖:
@Resource
用于自动注入依赖对象,类似于 Spring 框架中的@Autowired
注解。- 名称匹配:
@Resource
默认按名称匹配(通过字段名或方法名),如果名称匹配不上,再按类型匹配。- 简化配置:简化配置,使代码更加简洁,便于理解和维护。
与
@Autowired
的对比
匹配方式:
@Resource
:默认按名称匹配,找不到匹配时按类型匹配。@Autowired
:默认按类型匹配,可以结合@Qualifier
注解按名称匹配。来源:
@Resource
:属于 Java EE 标准,适用于任何兼容 JSR-250 的框架和容器。@Autowired
:属于 Spring 框架特有的注解。配置灵活性:
@Resource
:支持name
和type
属性来精确控制注入。@Autowired
:可以与@Qualifier
配合使用,提供更灵活的配置选项。
7、 @Qualifier的作用是什么?
@Qualifier
注解是 Spring 框架中用于在依赖注入时区分多个 Bean 的注解。当一个类型有多个候选 Bean 时,@Qualifier
注解可以与@Autowired
或@Inject
注解结合使用,以指定需要注入的具体 Bean。它的作用是通过名称来明确指定要注入的 Bean,解决歧义问题。主要作用
- 解决歧义:在同一个类型有多个 Bean 时,通过
@Qualifier
注解指定要注入的 Bean 名称,解决依赖注入的歧义。- 精确注入:与
@Autowired
或@Inject
注解结合使用,实现精确的依赖注入。
示例如下:
public interface MyService {void performAction();
}@Service("serviceA")
public class ServiceA implements MyService {@Overridepublic void performAction() {System.out.println("ServiceA performing action");}
}@Service("serviceB")
public class ServiceB implements MyService {@Overridepublic void performAction() {System.out.println("ServiceB performing action");}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;@Component
public class MyComponent {private final MyService myService;@Autowiredpublic MyComponent(@Qualifier("serviceA") MyService myService) {this.myService = myService;}public void doSomething() {myService.performAction();}
}
8、 @Transactional是如何使用的?
@Transactional
注解是 Spring 框架中用于声明事务的方法。它能够简化事务管理,使得开发者不必显式地管理事务边界(如begin
、commit
和rollback
),而是通过注解的方式来声明某个方法需要事务支持。作用
- 声明式事务管理:通过注解声明事务边界,而不是通过编程的方式。
- 事务属性配置:可以配置事务的传播行为、隔离级别、超时时间等。
- 异常回滚:指定哪些异常会触发事务回滚。
@Transactional
可以应用在类或方法上,通常用于服务层(Service Layer)的类或方法。
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class UserService {public void createUser(User user) {// 事务代码}public void updateUser(User user) {// 事务代码}
}
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Transactionalpublic void createUser(User user) {// 事务代码}@Transactionalpublic void updateUser(User user) {// 事务代码}
}