1.IOC理论概要
java中,一个对象A怎么才能调用对象B?
当一个对象的构建,需要多个其他对象时,对象和对象有复杂的构建关系。spring帮助我们维系对象的依赖关系,降低系统的实现成本,前提是需要在spring的配置文件中,以xml的形式进行声明。
2.实体bean的构建
a.基于class的构建
<bean class="xxx.xxxxx.xxxxx.UserClass" ></bean>
spring底层基于class属性,通过类的反射进行构建。需要类有无参构造方。
b.构造方法的构建
<bean class="xxx.xxxxx.xxxxx.UserClass" >
<constructor-arg name="name" type="java.util.String" value="小明"/>
<constructor-arg index="1" type="java.lang.Integer" value="1"/>
</bean>
基于类的有参构造方法,构建bean,constructor-arg意思是执行方法传入参数
c.静态工厂方法的构建
<bean class="xxx.xxxxx.xxxxx.UserClass" factory-method="staticFactory" >
<constructor-arg name="name" type="java.util.String" value="小明"/>
</bean>
基于类中的静态工厂方法,构建bean,constructor-arg意思是执行方法传入参数
d.factorybean的构建
创建一个javaFactoryBean类,要实现FactoryBean接口,会重写getObject,getObjectType,isSingleton三个方法。
在getObject()方法中,我们可以定义return的对象。
在getObjectType()方法中,我们定义return的对象类型。比如java.XXX.XXXX;
在isSingleton()方法中,return true/false,告知对象是否是单例模式。
<bean class="xxx.xxxxx.xxxxx.XXXFactoryBean" >
<property name="name" value="小明"></property >
</bean>
property属性指类的成员变量。name这个类的属性,需要设置get set方法
3.bean得基础特性
作用范围
scope配置,
scope="prototype"
scope="singleton"
<bean class="xxx.xxxxx.xxxxx.XXXFactoryBean" scope="singleton"></bean>
生命周期
通过init-method,destroy-method属性指定初始方法和销毁方法。
<bean class="xxx.xxxxx.xxxxx.XXXFactoryBean" init-method="init" destroy-method="destroy"></bean>
在applicationContext进行关闭的时候,销毁。
如果觉得配置起来麻烦,可以让bean去实现initilazingBean.afterPropertiesSet(),DisposabieBean.destroy()方法。
装载机制
指bean在何时加载,设置lazy-init即可:
true:懒加载,延迟加载。
false:非懒加载,容器启动即创建对象
default默认:采用default-lazy-init中指定的值,没指定,就是false。
在spring配置文件的文件头中,增加配置default-lazy-init="true/false"
什么时候采用懒加载?
采用懒加载,容器启动速度快一些。但是非懒加载,容器在启动过程中会帮助我们发现错误。我们一般选择后面,提早发现错误。
4.依赖注入
spring中IOC如何实现依赖注入:
1.set方法注入
<bean class="com.cn.AClass" >
<property name="b" ref="BClass"></property >
</bean>
property:成员变量
name:属性名
ref:另一个bean
2.构造方法注入
<bean class="com.cn.AClass" >
<constructor-arg name="b">
<bean class="BClass"></bean>
</constructor-arg>
</bean>
constructor-arg:构造方法参数
3.自动注入(byName, byType)
<bean id="A" class="com.cn.AClass" autowire="byName" ></bean>
当AClass的成员变量为bClass对象,使用autowire,会自动匹配其他bean。
byName:根据配置文件中,将name或者id匹配的其他bean传入进来。
byType:根据配置文件中,将class匹配的其他bean传入进来。
default:取决于文件头中的 default-autowrite="byName/byType",什么都不写就是byName
4.方法注入(lookup-method)
单例引用多例的模式才会使用
<bean class="com.xxx.xxx.AClass">
<lookup-method name="getB"></lookup-method>
</bean>
该操作原理是基于动态代理技术,重新生成一个继承至目标类,重写抽象方法达到注入目的。