spring详解(四)

容器中的工厂Bean

此处的工厂Bean与前面介绍的实例工厂方法创建Bean、静态工厂创建Bean有所区别:

前面的那些工厂是标准的工厂模式,Spring只是负责调用工厂方法来创建Bean实例;

此处工厂Bean是Spring的一种特殊Bean,这种工厂Bean必须实现FactoryBean接口。

FactoryBean接口是工厂Bean标准的工厂Bean的接口,实现该接口的Bean只能当工厂Bean使用,当我们将工厂Bean部署在容器中,并通过getBean()方法来获取工厂Bean,容器不会返回FactoryBean实例而是FactoryBean的产品。

FactoryBean提供了三个方法:
<li>Object getObject();
<li>Class getObjectType();
<li>boolean isSingleton();

例如:

public class PersonFactory implements FactoryBean{
    Person p = null;
    public Object getObject() throws Exception{
        if(p==null){
            p  = new Chinense();
            return p;
        }
    }
    public Class getObjectType(){
        return Chinese.class;
     }
    public boolean isSingleton(){
        return true;
    }
}
<!--配置一个FactoryBean,和普通的Bean一样-->
<bean id="chinese" class=""/>
        public static void main(String args[]){\
                //以classpth下的bean.xml创建Reource对象
                ClassPathResource re = new ClasspathResource("bean.xml");
                //创建BeanFactory
                XmlBeanFactory factory = new XmlBeanFactory(re);
                Person p = (Person)factory.getBean("chinese");
                //如需要获取FactoryBean本身则应该在bean id前加&
                Person p = (Person)factory.getBean("&chinese");
        }

对于初学者可能无法体会到工厂bean的作用,实际上,FactoryBean是Spring中非常有用的接口。例如:TransationProxyFactroyBean,这个工厂转为目标Bean创建事务代理.


6.深入理解依赖关系配置

<li>组件与组件之间的耦合,采用依赖注入管理,但是普通的javabean属性值,应直接在代码里设置。

<li>对于singleton作用域的bean,如果没有强制取消其预初始化行为,系统会在创建Spring容器时预初始化所有的singleton作用域的bean,与此同时,该bean依赖的bean也一起被实例化。

<li>BeanFactory与ApplicationContext实例化容器中的bean的时机不同,前者等到程序需要Bean实例才创建Bean,后者会预初始化容器中的所有Bean。

因为采用ApplicationContext作为Spring的容器,创建容器时,会创建容器中所有singleton作用域的所有bean,因此可能需要更多的系统资源,但是一旦创建成功。应用后面的 响应速度会很快,因此,对于普通的javaEE而言 ,建议使用ApplicationContext作为Spring的容器


Bean实例4种属性值的设置
①设置普通属性值value

②配置合作者Bean ref

可以为ref元素指定两个属性:bena、Local
bean:引用在不同一份XML配置文件中的其他Bean实例的ID属性值;
Local:引用同一份XML配置文件的其他Beanid属性值。
也可以不配置以上两个属性

③组合属性名称:

public class A{
private Person p = new Person();
set/get....
}

`Spring配置文件`

<bean id="a" class="A">
<property name="p.name" value="aaa"/>
</bean>


④注入嵌套Bean:

>```
<bean id="" class="">
       < property name="">
                //属性为嵌套Bean 不能由Spring容器直接访问,因此没有id属性
                <bean class="..."/>
        </property>
</bean>

⑤注入集合值:

<list>
<value></value>
<value></value>
</list>

<map>
//每一个entry配置一个key-value对
<entry>
<key>
<value>.</value>
</key>
<value></value>
</entry>
</map>

<set>
<value></value>
<bean></bean>
<ref local=""/>
</set>

<props>
<prop key="">.....</prop>
<prop key="">.....</prop>
</props>


⑥注入方法返回值:

public class ValueGenrator{
public int getValue(){
return 6;
}
public static int getStaticValue(){
return 9;
}
}

<bean id="valueGenrator" class="lee.ValueGenrator"/>
<bean id="son1" class="Son">
<property name="age">
<bean class="org.springframework.bean.factory.congfig.MethodInvokignFactoryBean">
//配置非静态方法
<property name="targetObject" ref="valueGenrator"/>
//配置静态方法

        <property name="targetMehtod" value="getStaticValue/>

</property>
</bean>


---

**强制初始化Bean**
>Spring有一个默认的规则,总是先初始化主调Bean,然后在初始化依赖Bean。
为了指定Bean在目标Bean之前初始化,可以使用**depends-on**属性.

>`大多数情况下`,Bean之间的依赖关系非常直接,Spring容器在返回Bean实例之前,完成Bean依赖关系的注入。假如Bean A依赖于Bean B,程序请求Bean A时,Spring容器会自动先初始化Bean B,再将Bean B注入Bean A,最后将具备完整依赖的Bean A返回给程序。
`在极端的情况下`,Bean之间的依赖不够直接。比如某个类的初始化块中使用其他Bean,Spring总是先初始化主调Bean,执行初始化块时还没有实例化主调Bean,被依赖的Bean还没实例化,此时将引发异常。

>为了让指定Bean在目标Bean之前初始化,可以使用 depends-on 属性,该属性可以在初始化主调Bean之前,强制初始化一个或多个Bean。

<bean id="beanOne" class="ExampleBean" depends-on="manager">
<property name="manager" ref="manager"/>
</bean>
<bean id="manager" class="ManagerBean"/>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容