1.原始材料
对象的创建由原来的==使用new关键字在类中主动创建==变成了==从工厂中获取==,而对象的创建过程由工厂内部来实现,
而这个工厂==就是Spring的IOC容器==,也就是以后我们的对象不再自己创建, 而是直接向Spring要,这种思想就是==IOC==
IOC( 控制 反转 )是一种设计思想。它的目的是指导我们设计出更加松耦合的程序。(解耦 工厂解耦)
控制:指的是控制权,现在可以简单理解为对象的创建权限
反转:指的对象的控制权由程序员在类中主动控制(new)反转到由Spring容器来控制。
2.两个接口
BeanFactory
这是SpringIOC容器的顶级接口,它定义了SpringIOC的最基础的功能,但是其功能比较简单, 一般面向Spring自身使用
BeanFactroy在第一次使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化
这是在BeanFactory基础上衍生出的接口,它扩展了BeanFactory的功能,一般面向程序员使用
ApplicationContext是在容器启动时,一次性创建并加载了所有的Bean
==上面两种方式创建的对象都是单例,只是创建对象的时机不同==
3.三个实现类,一个方法
-
ClassPathXmlApplicationContext 读取类路径下的xml作为配置文件
-
FileSystemXmlApplicationContext 读取本地目录下的xml作为配置文件
- AnnotationConfigApplicationContext 读取一个Java类作为配置文件
getBean() 用于从Spring容器中获取Bean对象,参数可以使用三种情况:
-
getBean("id") 使用bean的id从容器中查找对象
-
getBean(Bean.class) 使用bean的class类型从容器中查找对象
-
getBean("id", Bean.class) 使用bean的id 和 class类型从容器中查找对象
4.bean的作用范围
在Spring中,对于bean支持五种作用范围:
-
singleton(默认) 单例模式,即对象只创建一次, 然后一直存在
-
prototype 多例模式,即每次获取bean的时候,IOC 都给我们创建一个新对象
-
request web项目中, Spring创建一个Bean的对象,将对象存入到request域中( 同一个request获取到 的是同一个对象)
-
session web 项目中,Spring创建一个Bean 的对象,将对象存入到session域中
-
globalSession 用于分布式web开发中,创建的实例绑定全局session对象
5.bean的生命周期
单例对象
什么时候创建对象呢?
IOC容器初始化完成后,创建对象
什么时候销毁对象呢?
什么时候创建对象呢?
IOC容器初始化完成后,调用getBean方法时创建对象
什么时候销毁对象呢?
销毁时机不受spring容器管理。由jvm的垃圾回收机制销毁。
6.依赖注入
依赖注入(Dependency Injection,DI) 其实就是给对象中的属性赋值的过程
依赖注入有两种方式,分别是使用构造函数和set方法。
7.使用到的注解
@Component
用于实例化对象,相当于配置文件中的< bean id="" class=""/>
它支持一个属性value,相当于xml中bean的id。如果不写,默认值为类名的首字母小写
@Controller @Service @Repository
这三个注解的功能跟@Component类似,他们分别标注在不同的层上。
@Controller 标注在表现层的类上
@Service 标注在业务层的类上
@Repository 标注在持久层的类上
推荐使用这三个,当一个类实在不好归属在这三个层上时,再使用@Component
8.使用注解时设置作用范围:
@Scope用于指定bean的作用范围(单例和多例),相当于配置文件中的< bean scope="">
1 @scope("singleton") 2 @Repository 3 public Class AccountDao{ 4 }
1 @scope("prototype") 2 @Service 3 pubic Class UserServiceImpl implements UserService{ 4 }
9.依赖注入
@autoWired
这个注解表示依赖注入,他可以标注在属性上,也可以标注在方法上,当@Autowired标注在属性上的时候,属性对应的set方法可以省略不写
Spring会在他的IOC容器中按照被标注属性的类型进行寻找
如果找不到,就会报错
如果找到了,而且正好找到了一个,那么就进行依赖注入
如果找到了,但是找到了多个,它会再按照属性名称进行匹配
如果匹配上了就注入
如果匹配不上就报错