Spring 框架是以简化 JAVA EE 应用程序的开发为目标而创建的,它为企业级开发提供了丰富的功能,但这些功能的底层都依赖于他的两个核心特性:依赖注入(DI)和面向切面编程(AOP)。
本文主要是讲 Spring 在项目中 Bean 容器如何初始化。环境概述:
- JDK 11
- Spring 5.3.10-SNAPSHOT
简单案例
下面是一个简单的 Spring Bean 容器使用的案例:
// 创建容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取 Bean 对象
UserService serviceService = applicationContext.getBean(UserService.class);
// 打印 Bean 对象
System.out.println(serviceService);
在这个例子中,我们可以看到 Spring 的使用非常简单。 往往大家都会有这个问题:我们为什么要使用 Spring? Spring 能给我们提供哪些开发能力?
- 还有就是 Spring 本身是一个 Bean 容器,可以帮我们管理对象。例如:默认创建单实例 Bean, 也可以通过标记快速创建原型对象,解决了我们在对象引用,或者对象回收的一系列的问题。
- Spring 还能能够提供快速的和三方框架的整合能力比如:MyBatis,MVC,RocketMQ 等常用中间件。
下面我们将从 Bean 的创建, Aop 实现,Transaction 实现等三个方面来学习 Spring 的基本使用。
Bean 创建
Bean 的定义
Spring Bean 是 Spring 通过 Spring 容器创建的 Java 对象。它们被 Spring IOC 容器初始化、装配和管理。这些 Bean 通过容器中配置的元数据创建。
Spring 框架中定义的 Bean 默认都是单例的。可以通过 @Scope("singleton")
注解进行标记,如果需要申明为原型 Bean 那么就可以用 @Scope("prototype")
。
如何创建 Bean
我们可以在方法上增加 @Bean
注解进行创建 Bean ,或者在类上面增加 @Component
� 如下所示:
// bean 注解
private UserService user() {
return new UserService();
}
public class UserService {
}
Aop 实现
申明切面
public class UserAspect {
//匹配所有ServiceImpl包下面的所有类的所有方法
("execution(* com.ctc.ServiceImpl.*.*(..))")
public void addLog(){}
}
定义 Advice
Advice注解一共有五种,分别是: 1.@Before前置通知 前置通知在切入点运行前执行,不会影响切入点的逻辑 2.@After后置通知 后置通知在切入点正常运行结束后执行,如果切入点抛出异常,则在抛出异常前执行 3.@AfterThrowing异常通知 异常通知在切入点抛出异常前执行,如果切入点正常运行(未抛出异常),则不执行 4.@AfterReturning返回通知 返回通知在切入点正常运行结束后执行,如果切入点抛出异常,则不执行 5.@Around环绕通知 环绕通知是功能最强大的通知,可以在切入点执行前后自定义一些操作。环绕通知需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行 举个例子:
//使用 addLog 这个切入点进行增强
("addLog()")
public void before() {
System.out.println("before 前置通知......");
}
使用代理对象
申明 UserService
public class UserService {
public void test() {
System.out.println("orderService:" + orderService);
}
}
调用 test 方法
public class AopTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
UserService serviceService = applicationContext.getBean(UserService.class);
serviceService.test();
}
}
// AppConfig.java
(UserAspect.class)
public class AppConfig {
private UserService userService() {
return new UserService();
}
}