文章目录
- 1. Spring 核心 API
- 2. 程序开发
- 3. 细节分析
- 3.1 名词解释
- 3.2 Spring⼯⼚的相关的⽅法
- 3.3 配置⽂件中需要注意的细节
- 4. Spring⼯⼚的底层实现原理(简易版)
- 5. 思考
1. Spring 核心 API
ApplicationContext
作⽤:Spring 提供的 ApplicationContext
这个⼯⼚,⽤于对象的创建
好处:解耦合
ApplicationContext 接⼝类型
接⼝:屏蔽实现的差异
⾮web环境 : ClassPathXmlApplicationContext
(main junit)
web环境 : XmlWebApplicationContext
ApplicationContext
是重量级资源。会占用大量内存。
So 不会频繁的创建对象 : ⼀个应⽤只会创建⼀个⼯⼚对象。
一定是线程安全的。
2. 程序开发
-
创建类型
-
配置⽂件的配置 applicationContext.xml
<bean id="person" class="com.snow.po.Person"/>
-
通过⼯⼚类,获得对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); Person person = (Person)ctx.getBean("person");
3. 细节分析
3.1 名词解释
Spring⼯⼚创建的对象,叫做 bean 或者组件(componet)
3.2 Spring⼯⼚的相关的⽅法
// 通过这种⽅式获得对象,就不需要强制类型转换
Person person = ctx.getBean("person", Person.class);
System.out.println("person = " + person);// 当前Spring的配置⽂件中 只能有⼀个<bean class是Person类型
Person person = ctx.getBean(Person.class);
System.out.println("person = " + person);// 获取的是 Spring⼯⼚配置⽂件中所有bean标签的id值 person person1
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName = " +beanDefinitionName);
}// 根据类型获得Spring配置⽂件中对应的id值集合
String[] beanNamesForType = ctx.getBeanNamesForType(Person.class);
for (String id : beanNamesForType) {System.out.println("id = " + id);
}// ⽤于判断是否存在指定id值的bean
// ⽤于判断是否存在指定id值得bean,不能判断name值
if (ctx.containsBeanDefinition("a")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}// ⽤于判断是否存在指定id值的bean
// ⽤于判断是否存在指定id值得bean,也可以判断name值
if (ctx.containsBean("person")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}
3.3 配置⽂件中需要注意的细节
1. 只配置class属性
<bean class="com.snow.po.Person"/>a) 上述这种配置 有没有id值 有 -> 默认:com.snow.po.Person#0b) 应⽤场景: 如果这个bean只需要使⽤⼀次,那么就可以省略id值如果这个bean会使⽤多次,或者被其他bean引⽤则需要设置id值2. name属性
作⽤:⽤于在Spring的配置⽂件中,为bean对象定义别名(⼩名)
相同:
1. ctx.getBean("id|name")-->object
2. <bean id="student" class=""等效<bean name="student,stu,xuesheng" class=""
区别:别名可以定义多个, 但是id属性只能有⼀个值
//⽤于判断是否存在指定id值得bean,不能判断name值
if (ctx.containsBeanDefinition("person")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}
//⽤于判断是否存在指定id值得bean,也可以判断name值
if (ctx.containsBean("p")) {System.out.println("true = " + true);
}else{System.out.println("false = " + false);
}
4. Spring⼯⼚的底层实现原理(简易版)
Spring⼯⼚是可以调⽤对象私有的构造⽅法创建对象(反射)
5. 思考
问题:在开发过程中,是不是所有的对象,都会交给 Spring ⼯⼚来创建呢?
回答:理论上 是的,但是有特例 :实体对象(entity)是不会交给 Spring 创建,它是由持久层框架进⾏创建。