Spring之ioc控制反转(依赖注入)

个人感觉依赖注入比控制反转更好理解,所以下面就只说依赖注入:

spring的整体结构示意图:

一、spring 中的概念beanFactory容器

1、容器是spring框架的核心,容器使用ioc依赖注入来管理所有组成应用系统的组件。

2、spring中的两种容器: beanFactory 这个容器提供了基础的依赖注入支持,而且是延迟加载的,而 applicationcontext是对beanFactory 这个容器的扩展,

4、beanFactory 接口的实现类有很多,我们这里就举一个常用的类: XMLBeanFactory,XMLBeanFactory构造方法的参数是一个inputStream对象,而传递进来的就是我们定义bean的xml文件

5、实例:BeanFactory beanfactory = new XMLBeanFactory(newFileInputStream(bean.xml)); 这样beanFactory就获取了配置文件中bean的信息,但是bean是延迟实例化的所以现在只是加载进来了,但还是没有创建实例,,只有在使用的时候尽心创建

6、 User user=(User)beanfactory.getBean("user");

当我们调用getBean()时工厂会实例化并且会依赖注入设置相关属性值。

ApplicationContext 容器

application contextapplication context

XmlWebApplicationContext()从网络获取上下文信息。

.getBean("User")ApplicationContext () 在上下文预加载的时候就创建了实例,在使用的时候不用等待创建而是直接使用。

Spring中bean的周期

1、容器寻找bean的定义信息,并且实例化bean

2、使用依赖注入,spring按照bean定义信息配置bean的所有属性

3、如果bean实现了BeanNameAware接口则工厂调用bean的setBeanName() 方法传递bean的Id

4、如果bean实现了beanFacgtoryAware 接口则工厂调用 setBeanFactory()方法传入工厂本身。

5、如果有BeanPostProcess和bean关联那么他们的PostProcessBeforeInitialzation()方法将被调用

6、如果bean指定了init-method 方法则将被调用

7、如果有BeanPostProcess和bean关联那么他们的PostProcessAfterInitialzation()方法将被调用

到这里bean就可以在系统中被使用了,并将一直保存在BeanFactory 中直到他不在使用。

8、删除: spring 中有两种方式:(1)、如果bean实现了Disposable接口则destory方法将会被调用(2)、自己定义定义了销毁方法则执行他 destroy-method

依赖注入

1、所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。

装配实例化

1、在使用spring容器进行bean类的管理的时候,我们获取bean类有两种类型,一种就是在spring中使用了单例模式,获取的都是第一次加载的时候创建的那个bean实例,第二种就是在spring中没有定义单例模式,每获取一次就会产生一个新的bean实例。

区别这两种的配置:

<beanid="user"class="com.inspur.User"singleton=off>

</bean>

// singleton(单一的 唯一的) 这里关闭了单例模式,所以每次获取的bean对象都是新的,而在spring中singleton默认是开着的,因为像数据库连接池,网络资源等创建新对象很浪费资源,所以还是使用单例模式比较好,如果没有特别需求还是使用单例模式比较好!

二、注入实例1、setter 注入一般属性注入

<beanid="user" class="com.inspur.User">

<propertyname="name">

<value>"Name"</value>

</property>

<propertyname="age">

<value>12</value>

</property>

</bean>

<beanid="user" class="com.inspur.User">

<property name="name" value="name"/>

<property name="age" value=12 />

</bean>

属性的值为其他的类

<beanid="user" class="com.inspur.User">

<propertyname="name">

<value>"Name"</value>

</property>

<propertyname="address">

<ref bean="otherBeanId"/> // 属性的值为某一实例,所以进行了引用

</property>

</bean>

如果某个属性的值为其他的类,则可以按如下操作完成

<beanid="user" class="com.inspur.User">

<propertyname="name" value="name">

<propertyname="address" ref="otherBeanId">// 属性的值为某一实例,所以进行了引用

</bean>

属性的类型为集合:list

<property name="list">

<list>

<value>1</value> // 这里的value可以是任何类型

<value>2</value>

</list>

</property>

属性的类型为集合:set伟人之所以伟大,是因为他与别人共处逆境时,

Spring之ioc控制反转(依赖注入)

相关文章:

你感兴趣的文章:

标签云: