2.1. IOC的简介(常见面试题)
IOC
含义:
*
全称:
Inverse Of Control:
控制反转,指的是将
bean
对象的创建、及对象关联关
系的维护由原来我们自己去创建、自己去维护对象之间的关联关系,反转给
spring
的容
器来创建对象,及维护对象之间的关联关系。
*IOC
作用
:
解决了上层建筑严重依赖下层建筑的问题,实现了上层建筑对下层建筑的控制。
*IOC
底层原理
:xml
解析
+
反射
+
容器
+
设计模式
2.2. 获取容器的三种方式
/************************************************************
获取容器的三种方式:
*第一种:ClassPathXmlApplicationContext:默认是去 src 目录下找配置文件
*第二种:FileSystemXmlApplicationContext:默认是去本地磁盘的具体位置去找对应的
配置文件
*第三种:XmlBeanFactory:已废弃
************************************************************/
![](https://i-blog.csdnimg.cn/blog_migrate/f3fde5945a82bd93037f214f1eecbb1b.png)
2.3. 从容器中获取bean对象的两种方式和区别
从容器中获取bean对象的两种方式:
第一种:通过字节码的方式
第二种:通过容器中bean对象的id值或者name值的方式
区别:3个
第一个:参数不同,一个是字符串类型,一个是字节码类型
第二个:返回值类型不同,一个是Object类型,一个自定义的类型
第三个:如果参数是字节码类型,要求容器中必须有该字节码类型的唯一bean对象
如果没有,报错:NoSuchBeanDefinitionException;
如果容器中有该类型的唯一bean对象,正常获取;
如果容器中有该类型的多个bean对象,报
NoUniqueBeanDefinitionException
public void test02(){
ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml");
//Actor actor = context.getBean(Actor.class)
;
Object actor = context.getBean("actor");
System.out.println(actor);
}
2.4. DI(依赖注入)
DI:
全称:
Dependency Injection:
依赖注入
,
说白了,就是给对象的属性赋值。
IOC
是一种控制反转的思想,具体实现就是
DI
。
UserServlet
类:
public class UserServlet {
private UserService userService;
public void success(){
userService.success();
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService
= userService;
}
}
UserService
类:
public class UserService
{
public void success(){
System.out.println("成功执行了.......");
}
}
applicationContext.xml
<bean
id="userService" class="com.atguigu.service.UserService"></bean>
<bean
class="com.atguigu.servlet.UserServlet">
<property name="userService" ref="userService"></property>
</bean>
测试代码:
public void test02(){
ApplicationContext
context =new ClassPathXmlApplicationContext("applicationContext.xml");
UserServlet bean =
context.getBean(UserServlet.class);
bean.success();
}
2.5. 分模块配置
实际开发中,一般
Spring
框架都会整合其它框架一起使用,比如:后边学
Redis
时候,
会用
Spring
框架整合
Redis
,再学习其它框架的时候,还会用
Spring
框架整合其它框
架,随着
spring
框架整合其它框架的增多,如果把所有的配置信息都放在
spring
的配
置文件中,势必会造成
Spring
的配置文件过于臃肿,所以我们一般会把
Spring
框架整
合其它框架的信息单独抽取到一个配置文件中,然后在
Spring
的配置文件中通过
<import resource=””>
引入其它配置文件即可。
<
import
resource
="applicationContext_redis.xml"
></
import
>
2.6. 内部bean和外部bean
![](https://i-blog.csdnimg.cn/blog_migrate/524461b3cb74b10add2f736d87b8ea39.png)
2.7. 容器中bean对象的创建时机、底层原理、是否单例
![](https://i-blog.csdnimg.cn/blog_migrate/aa130fb86bd4ee26edf31a5745bc868f.png)
2.8. 容器中创建对象的三种方式
![](https://i-blog.csdnimg.cn/blog_migrate/ed8f235fd3617a265d7422a0c318b9d6.png)
Actor
类:
//
提供属性的
getter
、
setter
、
toString
方法
![](https://i-blog.csdnimg.cn/blog_migrate/d373b7b96360202069c6d6174289753b.png)
静态工厂:
![](https://i-blog.csdnimg.cn/blog_migrate/93fd1fccfa6a410fa2517b15ad189264.png)
实例工厂:
![](https://i-blog.csdnimg.cn/blog_migrate/f718b0ef43a2b6baa04df72c13c4fb09.png)
2.9. 给对象的属性赋值的三种方式
![](https://i-blog.csdnimg.cn/blog_migrate/b8bd604314230a4ba46d7fede84048fd.png)
代码:
applicationContext.xml
文件
![](https://i-blog.csdnimg.cn/blog_migrate/f16ac696b76940001cc50014e373fdd0.png)