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 注解 @Bean private UserService user() { return new UserService(); } @Component public class UserService { }
Aop 实现
申明切面
@Aspect public class UserAspect { //匹配所有ServiceImpl包下面的所有类的所有方法 @Pointcut("execution(* com.ctc.ServiceImpl.*.*(..))") public void addLog(){} }
定义 Advice
Advice注解一共有五种,分别是:1.@Before前置通知前置通知在切入点运行前执行,不会影响切入点的逻辑2.@After后置通知后置通知在切入点正常运行结束后执行,如果切入点抛出异常,则在抛出异常前执行3.@AfterThrowing异常通知异常通知在切入点抛出异常前执行,如果切入点正常运行(未抛出异常),则不执行4.@AfterReturning返回通知返回通知在切入点正常运行结束后执行,如果切入点抛出异常,则不执行5.@Around环绕通知环绕通知是功能最强大的通知,可以在切入点执行前后自定义一些操作。环绕通知需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行 举个例子:
//使用 addLog 这个切入点进行增强 @Before("addLog()") public void before() { System.out.println("before 前置通知......"); }
使用代理对象
申明 UserService
@Component 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 @Import(UserAspect.class) @Configurable public class AppConfig { @Bean private UserService userService() { return new UserService(); } }