IOC
怎么简便理解IOC
IOC(Inversion of Control):传统获取资源的方式是组件请求容器查找并批复获取容器的资源,这是很惯性的理解,而IOC则是反过来,是容器自己(这里是Spring)主动把资源给组件(比如一些使用setter方法注入值的文件),Spring就像谷歌浏览器的插件管理器,要什么服务我用一个bean(就像插件)注入就行。
BeanFactory和ApplicationContext:
- 本身区别:
BeanFactory是底层接口,ApplicationContext,应用上下文,继承BeanFactory接口,比BF具有更多功能
- 装载Bean区别:
BeanFactory只有在从容器中取bean的时候才会实例化一个bean,而ApplicationContext会在启动的时候就把所有的Bean全部实例化了,适合Web应用。
FactoryBean和BeanFactory:
Spring里面有两种Bean,普通的和工厂Bean(FactoryBean),
BeanFactory生产Bean,FactoryBean根据某个Bean的id获取某个Bean的对象(Bean对应的实体类对象)
自动装配
- autowireByName
比如有三个类,Address.java和Car.java和Person.java,Person类里面包含Address和Car两个类对象address、car;在Spring里面就可以这样配置bean,三个bean的id,address,car,person,主要是前面address,car不能用其他的,因为他们的id跟Person里的对象成员一样,会自动把address,car的内容自动装入person里面。 - autowireByType
还是上面三个bean,只要三个bean是唯一的,一个类对应的bean唯一,即便bean的id没有也没关系,只要声明bean是bytype就会根据类路径来装配
Bean作用域
- 单例Bean,默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内
都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用
域被称为 singleton, 它是所有 Bean 的默认作用域
比如,
Car car = (Car) ctx.getBean("car");
Car car2 = (Car) ctx.getBean("car");
System.out.println("car == car2--》" + (car == car2));
//输出true,getBean()返回的都是同一个对象
- 原型Bean,当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会
导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)
时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是
当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验
,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域
Car car = (Car) ctx.getBean("car2");
Car car2 = (Car) ctx.getBean("car2");
System.out.println("car == car2--》" + (car == car2));
//输出false