IOC的学习(1)

1.IOC理论概要

java中,一个对象A怎么才能调用对象B?

ed693032f94a173df1efbdde749d9f3079c.jpg

当一个对象的构建,需要多个其他对象时,对象和对象有复杂的构建关系。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方法

064750baed1e3f5fbf8be2b1a0551d971d7.jpg

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>

该操作原理是基于动态代理技术,重新生成一个继承至目标类,重写抽象方法达到注入目的。

 

 

转载于:https://my.oschina.net/xiaoyoung/blog/2989086

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值