重生之我在地球当程序员-又遇Spring篇
主要讲述Spring的模块化以及常见的注解,以及整合单元测试。
Spring模块化
Spring主从配置文件,先配置一个主配置文件,然后在里面导入其它的配置文件。这样进行模块化,这样就避免了所有bean都配 置到同一个配置文件中,会使这个文件巨大,而且也不方便维护。
注意:
(1)同一个xml文件中不能出现相同名称的bean,如果出现会报错
(2)多个xml文件如果出现相同名称的bean,不会报错,但是后加载的会覆盖前加载的bean,所以企业开发中尽量保证bean的名称是唯一的。
Spring常见注解
Spring配置IoC容器可以实现解耦合,主要配置IoC主要有两种方式
(1)xml的方式进行配置(上篇已经讲过了)
(2)注解的方式(相对于xml配置,注解方式开发起来更加方便但是不利于维护)
注解 | 说明 标志在类上的注解 |
---|---|
@Component | 这是一个通用的注解,用于表示一个受 Spring 管理的组件(Bean),它可以用在任何层次 |
@Controller | 用于标记 Spring MVC 控制器(即处理 HTTP 请求的类),通常用于 Web 层的类上 |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean ,用于标记数据访问层的类 |
主要区别是 | 不同的注解加在不同的三层架构上 |
注解 | 说明 用于注入数据的注解 |
---------- | ------------------------------------------------------------ |
@Value | 注入普通属性 |
@Autowired | 自动按照类型注入。给以标记在变量、构造方法和其他方法上,如果存在一个类型对应多个值的情况将会报错 |
@Qualifier | 结合@Autowired一起使用用于根据名称进行依赖注入等同于xml中的id |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行注入,是java提供的,不是框架提供的 |
注意:
使用注解进行开发时,需要在applicationContext.xml(主配置文件)中配置组件扫描,作用
是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
base-package:扫描哪个包下面的类
<!--注解的组件扫描-->
<context:component-scan base-package="com.contorl"></context:component-scan>
整合测试单元
<properties>
<spring.version>5.2.5.RELEASE</spring.version>
</properties>
<!--此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--导入Spring整合Junit的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--导入spring的context依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest {
@Autowired
private ApplicationContext context;
@Test
public void test(){
...
}
}
(1) @RunWith(SpringJUnit4ClassRunner.class):
这是 JUnit 框架提供的注解之一,用于指定在运行测试时使用的运行器(Runner)
SpringJUnit4ClassRunner 是 Spring 提供的一个特殊的 JUnit 运行器,
它会在测试运行之前自动创建 Spring 应用程序上下文,并在测试运行完成后关闭该上下文。
(2) @ContextConfiguration(classes = {SpringConfiguration.class}):
这是 Spring Test Context Framework 提供的注解之一,用于指定 Spring 应用程序
上下文的配置。在这里,classes 属性指定了一个或多个配置类
(SpringConfiguration.class),用于告诉 Spring 如何配置应用程序上下文以供测试使用。
AOP机制
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)从应用程序的核心业务逻辑中分离出来,从而提高代码的模块性、可维护性和可重用性。
在 AOP 中,横切关注点指的是那些散布在应用程序中的功能,如日志记录、事务管理、安全性检查等,它们与应用程序的核心业务逻辑无关,但却存在于整个应用程序中。
AOP 主要通过以下几个核心概念来实现:
切面(Aspect):切面是横切关注点的模块化体现。它定义了要在应用程序中的哪些地方应用横切关注点,以及在这些地方要执行哪些具体的行为。通常,切面由切点和通知组成。切点指定了何处应用通知,而通知定义了在切点处执行的具体操作。
连接点(Join Point):连接点是在应用程序执行过程中能够插入切面的点。它是在代码中定义的某个点,比如方法的调用、异常的抛出等。
通知(Advice):通知是切面在连接点处执行的具体操作。通知可以分为多种类型,包括前置通知(Before advice)、后置通知(After advice)、返回通知(After-returning advice)、异常通知(After-throwing advice)和环绕通知(Around advice)。
切点(Pointcut):切点是一组连接点的集合,它定义了在哪些连接点上应用通知。切点使用表达式语言来描述要选择的连接点。
引入(Introduction):引入允许向现有的类添加新的方法或属性。
目标对象(Target Object):目标对象是被一个或多个切面通知的对象。
AOP 的核心思想是将横切关注点与核心业务逻辑分离,使得业务逻辑更加清晰,同时提高了代码的可维护性和重用性。通过在连接点上应用切面,开发者可以将各种横切关注点独立地模块化,并在需要时灵活地应用到应用程序中。
总的来说:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP 使用反射进行动态代理。
具体的未完成。。。。。。