什么是控制反转和依赖注入?
控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是Spring框架的核心概念。
控制反转指的是将对象的创建、组装和管理的责任从应用程序代码中翻转到框架或容器中。传统的编程模型中,应用程序需要负责自己创建和管理对象,而在IoC中,这个责任交给了框架。框架通过读取配置信息,并利用反射等方式实例化对象并管理它们的生命周期。这样可以降低应用程序的耦合性,提高可维护性和可扩展性。
依赖注入是IoC的一种具体实现方式,它是指通过外部注入的方式向对象提供所依赖的其他对象。在依赖注入中,对象不再负责创建或查找它所依赖的对象,而是由框架或容器负责将依赖的对象注入到目标对象中。依赖注入可以通过构造方法、属性或接口进行注入,使得对象之间的关系更加松散,易于测试和扩展。
什么是AOP?
AOP(Aspect-Oriented Programming)是一种编程思想和技术,旨在解决系统中的交叉关注点问题。AOP通过将系统的业务逻辑划分为核心关注点和横切关注点,将核心关注点与横切关注点分离开来。核心关注点包含了系统的主要业务逻辑,而横切关注点则是那些可能在系统各个模块中都存在的功能,如日志记录、事务管理等。
AOP的核心思想是什么?
AOP的核心思想是通过在程序运行期间动态地将横切关注点织入到核心关注点中,从而实现对系统的增强和扩展。它基于面向对象的编程模型,通过使用切面(Aspect)来描述横切关注点,并将切面织入到目标对象的执行流程中。这样可以在不修改源代码的情况下,实现诸如日志记录、性能监控、安全性控制等通用功能。
AOP有哪些增强处理类型及特点?
AOP有以下几种增强处理类型及特点:
- 前置增强(Before Advice):在目标方法执行前执行额外的逻辑。
- 后置增强(After Returning Advice):在目标方法成功返回后执行额外的逻辑。
- 异常增强(After Throwing Advice):在目标方法抛出异常后执行额外的逻辑。
- 最终增强(After Finally Advice):在目标方法执行完成后无论是否成功返回或抛出异常,都执行额外的逻辑。
- 环绕增强(Around Advice):在目标方法的前后都执行额外的逻辑,可以控制目标方法的执行过程。
Spring在Maven中包括的jar
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!-- 1.Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 2.Spring dao依赖-->
<!-- spring-jdbc包括了一些如jdbcTemplate的工具类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 3.Spring web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 4.Spring test依赖:方便做单元测试和集成测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
</dependencies>
Spring.xml文件的头部代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>