Spring中的IoC
Spring中的IoC:1)概念:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。2)目的:为了解决多个对象之间的依赖关系。3)原理:1)通过配置文件(或注解)的方式来描述bean与bean之间的依赖关系。2)通过动态代理和java的反射机制来实例化bean,同时建立bean之间的依赖关系。4)spring容器创建...
·
Spring中的IoC:
1)概念:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
2)目的:为了解决多个对象之间的依赖关系。
3)原理:
1)通过配置文件(或注解)的方式来描述bean与bean之间的依赖关系。
2)通过动态代理和java的反射机制来实例化bean,同时建立bean之间的依赖关系。
4)spring容器创建对象的3种方式(bean的实例化):
1)使用Spring的IoC创建对象:调用默认的构造函数(默认)
1>指定bean的class属性
2>class需要一个默认的空构造器
<bean id="helloWorld" class="com.jxn.HelloWorld" />
得到实例对象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
2)在Spring中使用工厂模式创建对象:
使用静态工厂方法
1>指定class属性外
2>通过factory-method属性来指定创建bean实例的静态工厂方法
<bean id="helloWorld" class="com.jxn.HelloWorldFactory" factory-method="createInstance"></bean>
注:相当于调用了 HelloWorldFactory.createInstance();
public class HelloWorldFactory {
public static HelloWorld createInstance(){
return new HelloWorld();
}
}
得到实例对象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
使用实例工厂方法
1>定义一个工厂类
2>通过factory-bean属性指定工厂类,通过factory-method属性指定该工厂类的非静态工厂方法
<bean id="helloWorldFactory" class="com.jxn.HelloWorldFactory" />
<bean id="HelloWorld" factory-bean="helloWorldFactory" factory-method="createInstance" />
注:相当于调用了 new HelloWorldFactory.createInstance();
public class HelloWorldFactory {
public HelloWorld createInstance(){
return new HelloWorld();
}
}
得到实例对象:HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
3)使用Spring的IoC创建对象 VS 使用工厂模式创建对象
当创建的对象需要修改(eg:新增属性)时:
Spring的IoC只需要修改对象对应的类即可。
工厂模式需要修改或添加工厂方法。
5)DI(依赖注入):给对象的属性赋值
1)使用属性的setter方法进行注入:
说明:通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的依赖注入。
举例:
<!-- property是用来描述一个类的属性:直接变量(基本类型、String类型等)用value赋值,引用类型用ref赋值 -->
<bean id="student" class="com.jxn.domain.Student" />
<bean id="person" class="com.jxn.domain.Person">
<!-- 直接变量 -->
<property name="name" value="aaa" />
<!-- 引用类型 -->
<property name="student" ref="student">
<!-- List -->
<property name="lists">
<list>
<value>list1</value>
<ref bean="student"/>
<value>list3</value>
</list>
</property>
<!-- Map -->
<property name="map">
<map>
<entry key="m1">
<value>map1</value>
</entry>
<entry key="m2">
<ref bean="student"/>
</entry>
</map>
</property>
<!-- Properties -->
<property name="properties">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
</property>
</bean>
2)使用构造器注入:通过调用带参数的构造器来实现:
说明:
1>如果spring的配置文件的bean中没有<constructor-arg>标签,则调用默认的构造方法
2>如果spring的配置文件的bean中有<constructor-arg>标签,则该元素确定唯一的构造方法,该标签的属性
index 指参数的位置,从0开始
type 指参数的类型,如果不写仍可确定唯一的构造方法,则可以省略type属性
value 给基本类型赋值
ref 给引用类型赋值
举例:
<bean id="person" class="com.jxn.domain.Person">
<constructor-arg index="0" type="java.lang.Long" value="1"></constructor-arg>
<constructor-arg index="1" value="zhangsan"></constructor-arg>
<constructor-arg index="2" ref="student"></constructor-arg>
</bean>
<bean id="student" class="com.jxn.domain.Student" />
更多推荐
已为社区贡献2条内容
所有评论(0)