0%

spring | ApplicationContext 功能详解

这是对 spring | ApplicationContext 功能介绍 补充说明。

前置条件

  • spring5 项目
  • java 1.8
1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.4.RELEASE</version>
</dependency>

ApplicationContext

一个应用只会创建一个工厂对象,并且 ApplicationContext 工厂是线程安全的。

ClassPathXmlApplicationContext

图中是 ApplicationContext 接口的实现。

创建一个 bean 并且获取。

创建一个 Person 类和 User 类。

resources 创建一个 applicationContext.xml,并且注入 personUser 类。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.redisc.Person"/>
<bean id="user" class="com.redisc.User"/>
</beans>

ps: 如果不写 id 值,那么,默认会根据算法自动生成。还有 name 属性,定义的是别名。

然后在 main 函数下使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.redisc;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

@Slf4j(topic = "c.Test")
public class Run {

public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
// 获取 Spring 工厂
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
// 通过工厂类获得对象
Person person = (Person) ctx.getBean("person");
System.out.println(person);
}
}

这部分的原理和

类似。

其他相关方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 @Test
public void test4() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");

Person person = ctx.getBean("person", Person.class); // 不需要强制类型转换
System.out.println(person); // com.redisc.Person@768b970c

// 当前 Spring 的配置文件中,只能有一个 <bean class 是 Person 类型 // 不需要强制类型转换
System.out.println(ctx.getBean(Person.class)); // com.redisc.Person@768b970c

// 获取的是 Spring 工厂配置标签所有的 bean 标签的 id 值
String[] beans = ctx.getBeanDefinitionNames();
for (String bean : beans) {
System.out.println(bean); // person user
}

//只获取固定 type 的 bean id
String[] beanNameForType = ctx.getBeanNamesForType(Person.class);
for (String bean : beanNameForType) {
System.out.println(bean); // person
}
// 用于判断是否存在指定 id 值的 bean
if (ctx.containsBean("person")) {
System.out.println("123");
}

}
请我喝杯咖啡吧~