Spring中的ioc

来源:互联网 发布:照片批量修改大小软件 编辑:程序博客网 时间:2024/06/06 01:33
IOC:Inversion of Control 控制反转 
Spring的核心容器也可以成为ioc容器,它主要负责各个对象的创建,初始化,销毁等(即对象的生命周期)
目的:削减程序的耦合性
分类:分为依赖注入(DI)和依赖查找(DL),其中依赖注入应用比较广泛
DI:表示让调用类对某一接口实现类的依赖关系由容器注入,以消除调用类对某一接口实现的依赖关系。
DL:容器创建对象并提供 回调接口和 上下文环境,需要时通过接口从容器中查找其他对象。
一、Spring ioc 的API
1.BeanFactory接口:
主要用来处理Bean类的初始化和重置,建立对象之间的依赖关系。

接口中的方法:
//根据指定名称返回一个Bean实例
Object getBean(String name);   
//判断名称为name的Bean是否是原型,即是否总是返回一个新实例
boolean isPrototype(String name);  
//判断名称为name的Bean是否是单例
boolean isSingleton(String name);
//判断容器中是否包含给定名称的Bean实例
boolean containsBean(String name);
//如果名称为name的Bean有别名则返回所有别名
    String[] getAliases(String name);

2.ApplicationContext接口:
该接口继承于BeanFactory,增强了BeanFactory,增加了事务处理AOP,国际化,事件传递等功能

所以在代码中我们一般会使用ApplicationContext接口,以及这个接口相应的实现类来创建spring的容器对象
例如:
String path = "com/briup/ioc/set/set.xml";
ApplicationContext container = new ClassPathXmlApplicationContext(path);

二、配置文件:
Spring通过读取配置文件中的数据来对应用中各个对象进行实例化

格式:xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.2.xsd">
   
   
</beans>

注意事项:
1.这个文件的头部声明可以在下载的spring文档中的示例找到
2.这里面用到了俩个schema文件(.xsd文件),分别是spring-beans-3.2.xsd和spring-context-3.2.xsd,它们也可以在下载的spring文档中找到
3.在Eclipse中把xml文件和schema文件关联后,xml中就可以有标签代码的提示了(注意关联时别配置错了)
4.spring框架是模块化的,之后使用其他模块的时候,还可以在该xml的根元素中继续引用其他模块中相应的schema文件,然后就可以使用引入新模块中的标签代码了

三、ioc的相关功能:
以下数据的注入都需要通过xml文件来配置,但是通过ApplicationContext的对象的getBean("id|name")方法就可以得到注入好数据的具体对象
1.set注入(必须依靠set方法,即bean类中必须有setXxx()方法才可以使用)
可以注入的内容:
1).基本数据类型
2).引用数据类型
3).集合

a)基本数据类型的xml注入:set.xml
<bean id="helloBean" class="ioc.HelloBean">
<property name="name">
<value>tom</value>
</property>
<property name="age" value="20">
</property>
</bean>

b)引用数据类型的注入:
对象类型的装配:
1.<ref local=" "/> 用于涉及的对象的id在本配置文件中
2.<ref bean=" "/>  用于涉及的对象的id不在本配置文件中
3.使用property的ref属性引用
例如:
配置applicationContext.xml
<bean id="someBean" class="ioc.SomeBean">
<property name="ob">
<ref bean="otherBean" />
</property>
</bean>


配置other.xml文件
<bean id="otherBean" class="ioc.OtherBean">
<property name="str1">
<value>hello</value>
</property>
</bean>

c)集合类型的注入:
集合的装配
方式:配置元素<list> <set> <map> <props>

<bean id="someBean" class="ioc.SomeBean">
<property name="listProperty">
<list>
<value>list1</value>
<value>list1</value>
<value>list3</value>
</list>
</property>
<property name="setProperty">
<set>
<value>set1</value>
<value>set1</value>
<value>set3</value>
</set>
</property>
<property name="mapProperty">
<map>
<entry key="key1">
  <value>value1</value>
</entry>
<entry key="key2">
  <value>value2</value>
</entry>
</map>
</property>
<property name="property">
<props>
  <prop key="key1">prop1</prop>
  <prop key="key2">prop2</prop>
  <prop key="key3">prop3</prop>
</props>
</property>
</bean>

2.基于构造器注入:
构造器注入有俩种形式 一个是根据参数类型 一个是根据参数位置的下标
<constructor-arg type="int" value="">
<constructor-arg  index="0" value="">

例如:
<bean name="student" class="com.briup.bean.Student">
<constructor-arg type="int" value="25">
</constructor-arg>

<constructor-arg type="java.lang.String">
<value>tom</value>
</constructor-arg>

<constructor-arg type="long" value="100">
</constructor-arg>
 
</bean>

3.自动注入:
容器按照一定的规则去自动装配bean中的属性
注:自动注入只对引用类型数据起作用,对基本数据类型不起作用
a)byName方式

例如:


b)byType方式

例如


c)beans标签里通过default-autowire设置所有bean
例如:

4.继承:
xml文件中,一个bean的配置可以继承另一个bean的配置
bean标签中的俩个属性:
abstract属性
<bean name=".." class=".." abstract="true">
注:bean中一旦定义为了abstract="true",则说明该bean是用来被继承的,不能通过该bean获得对象了


parent属性,指定继承哪个bean的配置
<bean name=".." parent="另一个bean的名字">

例如:

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 心脏支架又堵了怎么办 车辆验车过期了怎么办 车辆年审过期2天怎么办 违停单子丢了怎么办 沙发弹簧包坏了怎么办 bt种子被和谐了怎么办 苹果手机id密码忘了怎么办 墙漆颜色太深了怎么办 油漆颜色太深了怎么办 墙面漆颜色太深怎么办 古代打仗牙掉了怎么办 乐视电视没声音怎么办 老公疑心病很重怎么办啊 被安装了尿道锁怎么办 狼青小狗腿罗圈怎么办 备孕期间有霉菌怎么办 虫子进皮肤里了怎么办 生完孩子肚子越来越大怎么办 怀孕8个月肚子小怎么办 孕晚期胎儿不长怎么办 肚子上肉特别多怎么办 奶堵了有硬块怎么办 便秘5天肚子胀怎么办 上火大便拉不出来怎么办 大便拉不出来肚子痛怎么办 戒奶奶涨有硬块怎么办 忌奶的时候涨奶怎么办 娃儿隔奶,,奶涨怎么办 狗肚子很大很鼓怎么办 注册不了的二建怎么办 专升本没考过怎么办 警察乱拘留人该怎么办 玩英雄联盟太卡怎么办 一方离婚证丢了怎么办 遭遇呼死你软件怎么办 开车遇见碰瓷的怎么办 遇到碰瓷老人的怎么办 睿强遥控锁坏了怎么办 地暖分水器坏了怎么办 京东赠品无货怎么办 图书馆的书丢了怎么办