1.简述IOC以及它的主要实现方式:
IOC(Inversion of Control,控制反转)是一种软件设计原则,用于实现依赖关系的解耦和提高代码的灵活性。它的核心思想是将控制权从应用程序中转移到框架或容器中,从而使应用程序更加模块化和可测试。
主要的IOC实现方式有以下几种:
-
依赖注入(DI,Dependency Injection):
- 构造函数注入:依赖对象通过构造函数传递给类。适用于必须提供依赖的情况。
- 属性注入:依赖对象通过公共属性设置。适用于可选依赖。
- 方法注入:依赖对象通过方法参数传递。适用于需要在方法调用时注入依赖的场景。
-
服务定位器(Service Locator):
- 通过一个专门的服务定位器对象来获取所需的依赖。服务定位器提供了一种集中管理依赖的方式,但可能会导致代码对服务定位器的强耦合。
-
事件驱动(Event-Driven):
- 使用事件和监听器模式来实现控制反转。通过发布和订阅事件来管理对象之间的依赖关系。
-
工厂模式(Factory Pattern):
- 通过工厂对象创建和提供依赖对象,工厂模式可以帮助封装对象创建逻辑,减少对具体类的依赖。
在实际应用中,依赖注入是最常见的IOC实现方式,因为它通过将依赖关系注入到对象中,使得代码更加灵活和易于测试。各种依赖注入框架(如Spring、Guice、Dagger等)也提供了丰富的功能来简化依赖注入的过程。
2.Spring常用的注解有哪些?都有什么用?
Spring框架提供了多种注解,用于简化配置和管理Spring应用程序中的各种组件。以下是一些常用的Spring注解及其用途:
核心注解
-
@Component
- 用于标记一个普通的Spring组件类,使其成为Spring容器中的一个Bean。通常用于自定义的组件类。
-
@Service
- 继承自@Component,用于标记服务层的类,表明这个类的主要职责是提供服务。
-
@Repository
- 继承自@Component,用于标记数据访问层的类,表明这个类负责与数据库进行交互,并处理数据库相关的异常。
-
@Controller
- 继承自@Component,用于标记Web控制器类,处理HTTP请求并返回视图名称。
-
@RestController
- 组合注解(包含@Controller和@ResponseBody),用于RESTful Web服务控制器类,自动将返回值转换为JSON或XML。
-
@Configuration
- 标记一个类为配置类,Spring会从中加载Bean定义。通常与@Bean注解一起使用,用于替代XML配置文件。
-
@Bean
- 用于方法上,表示该方法将返回一个Spring管理的Bean。与@Configuration注解一起使用。
注入相关注解
-
@Autowired
- 自动注入依赖。可以用于构造函数、字段、方法上,Spring会根据类型自动注入相应的Bean。
-
@Inject
- 与@Autowired类似,用于自动注入依赖。是JSR-330规范的一部分。
-
@Resource
- 用于按名称自动注入依赖。默认按名称注入,如果找不到相应的Bean则按类型注入。
-
@Qualifier
- 配合@Autowired或@Inject使用,用于指定注入的Bean的名称,解决依赖注入中的歧义问题。
事务管理注解
- @Transactional
- 用于声明事务管理,指定方法或类上所有方法在一个事务中执行。
Spring Boot注解
-
@SpringBootApplication
- 组合注解(包括@Configuration、@EnableAutoConfiguration和@ComponentScan),用于标记Spring Boot应用的启动类。
-
@EnableAutoConfiguration
- 启用Spring Boot的自动配置功能,Spring Boot会根据类路径中的依赖自动配置应用程序的Bean。
-
@ComponentScan
- 指定要扫描的包路径,以便Spring找到并注册Bean。
-
@ConfigurationProperties
- 绑定外部配置(如application.properties或application.yml)到一个Bean的属性中。
Web相关注解
-
@RequestMapping
- 用于映射HTTP请求到控制器的方法上。可以指定请求的URL、请求方法等。
-
@GetMapping
- 用于处理HTTP GET请求,是@RequestMapping的快捷方式。
-
@PostMapping
- 用于处理HTTP POST请求,是@RequestMapping的快捷方式。
-
@PutMapping
- 用于处理HTTP PUT请求,是@RequestMapping的快捷方式。
-
@DeleteMapping
- 用于处理HTTP DELETE请求,是@RequestMapping的快捷方式。
-
@PathVariable
- 用于提取URL路径中的变量。
-
@RequestParam
- 用于提取HTTP请求中的查询参数。
-
@ResponseBody
- 将方法的返回值直接写入HTTP响应体中,通常与@RestController一起使用。
AOP相关注解
-
@Aspect
- 标记一个类为切面,Spring会将其识别为AOP切面。
-
@Before
- 指定切面方法在目标方法执行前运行。
-
@After
- 指定切面方法在目标方法执行后运行。
-
@Around
- 指定切面方法在目标方法执行前后运行,允许对方法调用进行增强。
-
@AfterReturning
- 指定切面方法在目标方法执行成功后运行,并允许获取方法的返回值。
-
@AfterThrowing
- 指定切面方法在目标方法抛出异常后运行,并允许获取异常信息。
这些注解帮助开发者简化Spring应用程序的配置和管理,提高开发效率和代码的可读性。