一、spring之IOC
1、
IOC(控制反转:Inverse of Control ),又称作DI依赖注入,是一种重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的 Spring 框架的核心。
2、
依赖注入:是指 在运行期,由外部容器动态地将依赖对象注入到组件中。
依赖注入让Bean与Bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
二、依赖注入的方式
1、属性注入
<bean id="p1" class="com.mao.spring.model.People">
<property name="id" value="1001"/>
<property name="name" value="张嘉译"/>
<property name="age" value="30"/>
<property name="motto" value="我就是神"/>
</bean>
2、构造器类型注入,索引注入,类型和索引混用
<!-- 通过构造器注入一个bean:类型 -->
<bean id="p2" class="com.mao.spring.model.People">
<constructor-arg type="Integer" value="1223"/>
<constructor-arg type="String" value="张海阳"/>
<constructor-arg type="int" value="78"/>
<constructor-arg type="String" value="我爱睡觉"/>
</bean>
<!-- 通过构造器注入一个bean:索引 -->
<bean id="p3" class="com.mao.spring.model.People">
<constructor-arg index="0" value="1222"/>
<constructor-arg index="1" value="张大喵"/>
<constructor-arg index="2" value="老子要吃肉"/>
<constructor-arg index="3" value="30"/>
</bean>
<!-- 通过构造器注入一个bean:索引和类型混合使用,起始位置是 0 -->
<bean id="p4" class="com.mao.spring.model.People">
<constructor-arg index="0" type="int" value="1003" />
<constructor-arg index="2" type="Integer" value="25" />
<constructor-arg index="1" type="String" value="唐敏" />
</bean>
3、工厂注入,动态和静态工厂
<!-- 通过动态工厂注入一个bean,但是需要提前创建工厂类,而且要提供构建bean的方法 -->
<bean id="peopleFactory" class="com.mao.spring.util.PeopleFactory" />
<!-- 通过上述动态peopleFactory工厂,构建bean -->
<bean id="p5" factory-bean="peopleFactory" factory-method="createPeople" />
<!-- 通过静态的工厂注入 -->
<bean id="p6" class="com.mao.spring.util.PeopleFactory" factory-method="getPeople" />
三、注入参数
这是被注入的bean
<bean id="p7" class="com.mao.spring.model.People" >
<property name="id" value="15151" />
<property name="name" value="众人皆知" />
<property name="age" value="15" />
<property name="dog" ref="dog"/>
</bean>
1、ref参考方式注入
<bean id="dog" class="com.mao.spring.model.Dog">
<property name="name" value="哈士奇" />
</bean>
2、内部bean的注入
<bean id="p8" class="com.mao.spring.model.People">
<property name="id" value="1515" />
<property name="name" value="张玄凌" />
<property name="age" value="56" />
<property name="dog" >
<bean class="com.mao.spring.model.Dog">
<property name="name" value="阿拉斯加" />
</bean>
</property>
</bean>
3、内部bean的空值注入
<bean id="p9" class="com.mao.spring.model.People">
<property name="id" value="1564" />
<property name="name" value="张子凡" />
<property name="age" value="26" />
<property name="dog">
<null></null>
</property>
</bean>
4、级联属性:必须自己new一个dog对象
<bean id="p10" class="com.mao.spring.model.People">
<property name="id" value="15412" />
<property name="name" value="鹿林旋" />
<property name="age" value="45" />
<property name="dog.name" value="泰迪" />
<!-- 使用级联操作,必须手动实例化bean中得dog对象 -->
</bean>
5、集合属性类型
private List<String> hobbies=new ArrayList<String>();
private Set<String> loves=new HashSet<String>();
private Map<String,String> works=new HashMap<String,String>();
private Properties addresses=new Properties();
<bean id="people6" class="com.xdkj.entity.People">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="11"></property>
<property name="dog" ref="dog1"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
<property name="works">
<map>
<entry>
<key><value>上午</value></key>
<value>写代码</value>
</entry>
<entry>
<key><value>下午</value></key>
<value>测试代码</value>
</entry>
</map>
</property>
<property name="addresses">
<props>
<prop key="address1">aaaaa</prop>
<prop key="address2">bbbbb</prop>
</props>
</property>
</bean>
注:其中的id名的话可以根据自己的需要改动,我从之前写的demo拼接而来
三、自动装配
1、通过配置 default-autowire 属性,Spring IOC 容器可以自动为程序注入 bean;默认是 no,不启用自动装配;default-autowire 的类型有 byName,byType,constructor;
2、byName:通过名称进行自动匹配;
要求Dog对象的名字dog必须跟bean.xml中Dog的id相同。
3、byType:根据类型进行自动匹配;
在bean.xml中只要有一个Dog类型的对象存在就能够自动注入,但是只能有一个
4、constructor:和 byType 类似,只不过它是根据构造方法注入而言的,根据类型,自动注入;
跟byType类似,不需要处理bean的名字
5、建议:自动装配机制慎用,它屏蔽了装配细节,容易产生潜在的错误;