熟悉Spring框架?Spring容器使用流程,注解 你真的会吗?(让你一下通透~)
目录
前言
一、ApplicationContext 和 BeanFactory 的区别
二、主要工作流程
三、开发步骤
3.1、创建Maven项目
3.2、创建Spring的核心配置文件
3.3、Spring注解
3.3.1、类注解
3.3.2、五大类注解的关系
3.3.3、方法注解
3.3.4、属性注入
3.3.5、五大注解关系图(一看就懂)
3.4、创建程序入口类
3.5、跟Spring打声招呼吧~(使用Bean对象)
小结
前言
Spring提供了两大顶级接口可以获取Spring对象,他们分别是 ApplicationContext 和 BeanFactory,而我们日常开发主要使用的是 ApplicationContext,BeanFactory已经过时,因此本文主要围绕ApplicationContext来介绍~
一、ApplicationContext 和 BeanFactory 的区别
相同点:
1.都可以得到Spring对象(Spring上下文)。
2.都是来自Spring的顶级接口。
不同点:
1.继承关系:ApplicationContext 属于 BcanFactory 的子类。
2.功能:BcanFactory只有最基础访问Bean的能力,而ApplicationContext 除了拥有 BeanFactory功能之外,还包含了更多功能,如:国际化支持、资源访问、时间传播等。
3.性能:ApplicationContext 加载方式是将 Bean 对象一次性加载,所以在访问 Bean 对象时会很快(饿汉模式,但也不完全是,现在的高版本会根据你电脑的情况智能的去加载,如果刚开始加载时系统资源比较紧张,就会放到后面加载);BeanFactory 只有需要在需要某个 Bean 时,才会加载 Bean 对象, 所以它在执行 Bean 获取时,比较慢(懒汉模式)。
二、主要工作流程
三、开发步骤
3.1、创建Maven项目
首先需要在pom.xml配置文件中引入相关依赖,引入完后记得刷新Maven~
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring-demo2</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
</project>
3.2、创建Spring的核心配置文件
在src/main/resources下创建一个xml文件用来声明加载Bean对象;
base-package是用来扫描指定包下的Spring注解,找到对应的Bean对象,加载到Spring中;
<?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:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--base-package表示要扫描的路径-->
<content:component-scan base-package="com.demo.component"></content:component-scan>
</beans>
3.3、Spring注解
3.3.1、类注解
放在类上的,将对象存储到Spring中的五大注解,他们的功能相同,只是用来标识功能的(仅限Spring,在Spring Boot 和Spring MVC 中功能天差地别),方便程序员辨别;
@Controller(控制器):归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。(前端的请求合理性负责)
@Service(服务):归属于服务层,调用持久化类实现相应的功能,不直接和数据库交互,类似于控制中心。(对前端请求的功能负责)
@Repository(仓库):归属于持久层,是直接和数据库进行交互的,通常一个表都会对应一个@Repository。(对数据库负责)
@Component(组件):归属于公共工具类,提供某些公共方法。(工具类)
@Configuration(配置):归属于配置层,是用来配置当前项目的一些信息;(对项目的全局配置负责)
3.3.2、五大类注解的关系
@Component 是 @Controller、@Service、@Repository、@Configuration 的父类;
3.3.3、方法注解
注意:(一定需要配合5大注解一起使用,否则无效)
@Bean:放在方法上,将当前修饰方法的返回的对象存储到Spring中。(可以自定义一个或多个name属性,一旦设置了name属性,原方法名就不能获取对象了,只能使用设置的name获取)
3.3.4、属性注入
可以将其他类的Bean对象,注入到本类作为属性;
@Autowired :通常用来将 Service 类注⼊到 Controller 类中(可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊);
@Resource 只能⽤于 Setter 注⼊和属性注⼊;
@Autowired 和 @Resource 的区别:
出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。
注入范围不同:@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊;
3.3.5、五大注解关系图(一看就懂)
3.4、创建程序入口类
有了这个程序入口类,我们就可以获取Spring对象了,同时,获取Spring时需要给一个参数,这个参数就像是创建Spring容器的一个指导书(声明加载Bean对象的xml文件),这个 指导书就会告诉Spring需要将哪些Bean对象注入到容器(这里其实还有很多方式,但那些方式比较low,这里我们只需要掌握:扫描对应包下注解的方式);
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//获取Spring对象(Spring上下文)
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
}
}
3.5、跟Spring打声招呼吧~(使用Bean对象)
我们可以在扫描的包下创建一个Bean对象,通过上面步骤获取了Spring对象之后,就可以通过getBean方法获取Bean对象啦~
注意:getBean的参数有些讲究
1. 当类名首字母和第二个字母都是大写的时候,那么类名本身就是它的name属性;
2. 其他情况,均按照类名首字母小写的形式,填写name属性;
import com.demo.component.ArticleController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
//获取Spring对象(Spring上下文)
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
//获取Bean对象,这里第一个参数是Spring自己生成的身份标识,默认是类名(第一个首字母小写)
ArticleController articleController =
context.getBean("articleController", ArticleController.class);
//使用Bean对象
System.out.println(articleController.sayHello());
}
}
你好,Spring!
小结
你学费了吗?