我本人接触后台开发也有一段时间了,现在计划写一系列关于Spring全家桶的文章,从Spring Framework开始,到Spring Boot和Spring Cloud,一方面做一些知识输出,一方面用于记录学习情况,也方便平时速查。当然后续还有更多其他关于后台技术的使用的文章,这个要看我的个人时间安排。
我不想介绍太多关于底层实现的东西,那些东西可以从网上一些带人看源码的文章和视频找到,或者一些教人面试的八股文也有,我只介绍框架的最基本,最实用的使用方法,而且一些冷门的,过时的部分我也不介绍了,可能大家会觉得我的文章比较浅,而我旨在写一些Quick Start型的文章,让大家可以快速入门。
好的,让我们开始吧!
根据官方文档,如果我们要使用Spring,只需要搭建一个Spring Boot项目就行了,这是官方推荐的使用方式,因此在这我不再挨个导入Spring的每个jar包,而是直接创建一个Spring Boot项目
这是一个基于Spring的脚手架,可以帮助我们快速搭建Spring项目
我们借助idea的创建界面来快速创建一个Spring项目
这是一个Maven项目,从pom.xml可以看到我的Spring Boot版本是2.3.7,打开可以看到Spring的版本是5.2.12
这样我们的Spring项目就搭建好了,关于Spring Boot,后续的系列文章会介绍,我们现在只使用Spring的相关特性
关于Spring开发有两种驱动方式,一种是基于Xml文件配置,一种是基于注解,我只介绍后者,毕竟注解开发现在才是主流
在Spring中,容器中的每一个组件称为Bean,有两种方式可以向IOC容器添加Bean
首先我们定义一个实体类,然后我们将这个类的对象加入IOC容器
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private int age;
private String name;
}
@Configuration
public class MyConfiguration {
@Bean
public Person person(){
return new Person(18,"wang");
}
}
创建一个自定义配置类,将@Configuration
添加到自定义配置类上,创建一个方法,将@Bean
添加到方法上,该方法返回一个对象,也就是Bean,这就完成了组件的添加
注意这里的方法名即为默认的Bean的名字
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class Person {
private int age = 18;
private String name = "wang";
}
将@Component
添加在组件的类上,即可完成组件的添加,Bean的名字为类名(首字母小写)
其实打开@Configuration
的底层,会发现@Configuration
其实也是@Component
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(
annotation = Component.class
)
String value() default "";
boolean proxyBeanMethods() default true;
}
@Component
还有三个衍生注解@Controller
@Service
@Repository
,他们的作用相同,只是在项目中为了区分三层关系,并且也方便使用Spring的组件过滤进行过滤
那我们什么时候使用第一种方式,什么时候使用第二种方式呢?一般来说,我们自己定义的组件,使用@Component
来添加Bean,如果需要添加第三方导入的组件,在导入jar包后使用@Configuration
+@Bean
来添加Bean
默认情况下,Bean在IOC容器下是单例的,我们可以使用@Autowired
来获取Bean,@Autowired
会根据类型在IOC容器中获取这个单例的Bean
@SpringBootTest
class DemoApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
在Spring Boot提供的测试框架中,测试获取IOC容器中的Bean,将@Autowired
添加在成员变量上,完成注入,该成员变量的变量名为Bean的名字
在单例模式下,由于@Autowired
会根据类去寻找Bean,则此时变量名无关,但是在使用别的方式比如使用Bean的名字获取Bean时,变量名需要和Bean的名字匹配
至此基于Spring框架注解实现IOC特性的简单演示完成,项目中的组件,一次添加到IOC容器中,在项目的其他位置可以随意地取出,使得项目的组件依赖关系解耦,也方便扩展
@Autowired
注解中有一个required属性,默认为true,表示IOC容器中必须有该类型的Bean,否则报错,如果自动注入的成员变量允许为null,可以将required设置为false,此时如果IOC容器中找不到匹配的Bean,则将值设置为null而不报错
@SpringBootTest
class DemoApplicationTests {
@Autowired(required = false)
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
最后再介绍一下,Spring的IOC容器具体是什么呢?其实官方文档一开头就给出了解释
是BeanFactory
这个接口,更具体地,是ApplicationContext
这个子接口