文章目录
- 环境要求
- 构建模块
- 引入依赖
- 初试Bean
- 创建测试类测试
- 对象实现的原理
环境要求
-
JDK:Java17+(Spring6要求JDK最低版本是Java17)
-
Maven:3.6+
-
Spring:6.0.2
构建模块
首先建立的spring的项目(project),项目下面有一些子模块(module)
(1)在idea中,依次单击 File -> New -> Project -> New Project
删除src目录
(2)构建子模块pro1
点击 Create 完成
引入依赖
这个依赖加到父工程的spring6下面的pom.xml
,然后后面的子工程就可以不在导入这个包了
<dependencies><!--spring context依赖--><!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.2</version></dependency><!--junit5测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version></dependency>
</dependencies>
初试Bean
1.创建java类HelloWorld
package com.test;/*** ClassName: HelloWorld* Package: com.test* Description:** @Author Thmiao* @Create 2023/10/11 19:33* @Version 1.0*/
public class HelloWorld {public HelloWorld() {System.out.println("这个是一个无参的构造方法!!");}public void sayHello(){System.out.println("helloworld");}
}
2.创建配置文件
依赖导入了之后,写配置文件
<?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"><!--配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理通过bean标签配置IOC容器所管理的bean属性:id:设置bean的唯一标识class:设置bean所对应类型的全类名--><bean id="helloWorld" class="com.test.HelloWorld"></bean>
</beans>
创建测试类测试
在test 下面建立测试类
import com.test.HelloWorld;import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class HelloTest {@Testvoid test(){ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");HelloWorld HI = (HelloWorld) ac.getBean("helloWorld");HI.sayHello();}@Testvoid testRefection() throws Exception {Class clazz = Class.forName("com.test.HelloWorld");// 这个也可以获取到helloWord的类对象,只是这个方法过时了
// HelloWorld o = (HelloWorld)clazz.newInstance();
// o.sayHello();HelloWorld hello = (HelloWorld) clazz.getDeclaredConstructor().newInstance();hello.sayHello();}private Logger logger = LoggerFactory.getLogger(HelloTest.class);
这里写了两个测试方法,第一个test 方法是试的spring下得ioc
第二个testRefection 是为了自己写反射来实现获取bean (实例对象)对象
运行结果:(第一个方法的)
注意:创建对象时确实调用了无参数构造方法。
对象实现的原理
ean对象最终存储在spring容器中,在spring源码底层就是一个map集合,存储bean的map在DefaultListableBeanFactory类中:
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
Spring容器加载到Bean类时 , 会把这个类的描述信息, 以包名加类名的方式存到beanDefinitionMap 中,
Map<String,BeanDefinition> , 其中 String是Key , 默认是类名首字母小写 , BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象。