0
点赞
收藏
分享

微信扫一扫

springframework中关于bean的装配方式、初始化、实例化流程

● bean的配置方式? ○ xml文件配置 ○ bean的配置范围(scope范围) ○ bean的延迟加载(applicationContext是立即加载,如果需要延迟加载设置lazy-init为true,在getBean的时候才进行加载,加载实例化完了之后回存储到单例池中去,后续使用该bean直接从单例池中获取即可,本质上该bean还是单例的) ○ bean的初始化方法和销毁方法怎么指定?这里的destoryMethod的bean的销毁和容器的销毁并不是一回事,有时候对象不执行销毁方法可能是spring的容器先挂了,这时候来不及执行destory方法。 ● 关于对象创建完毕之后想要做一些初始化工作,可以有两个方法:一个是可以写个方法,在bean的配置时候指定该方法为initMethod是谁;第二个就是这个实例implements接口InitializingBean去复写里面的afterPropertiesSet�来进行初始化逻辑 ● bean的实例化是怎么做的?一种是通过构造方式(构造方法对bean实例化),一种是工厂方式(通过自定义的工厂对bean进行实例化) ○ 无参构造 ○ 有参构造 ○ 注意这里要是只有有参构造没有无参构造,会有问题解决的方法可以是在配置类里面加上constructor-arg�参数 ● 工厂方式实例化bean是怎么做的? ○ 静态工厂的静态方法的方式进行实例化bean ■ 配置内容如下:这里面的factory-method就相当于是指定“userDao”这个方法,把这个方法的返回值作为value对象,再以指定的beanId作为beanName作为对象key存储到map中 <bean id="userDao1" class="com.autonavi.xmap.springLearning.factory.MyBeanFactory1" factory-method="userDao"></bean> 伪代码

public class MyBeanFactory1 {
    public static UserDao userDao(){
        // bean创建之前可以进行一些其他业务逻辑操作
        return new UserDaoImpl();
    }
}

○ 实例工厂内部的方法是非静态的,用这个方法来实例化bean ■ 配置内容如下: <!--配置工厂对象-->

<bean id="myBeanFactory2" class="com.autonavi.xmap.springLearning.factory.MyBeanFactory2" ></bean>
 <bean id="userDao2" factory-bean="myBeanFactory2" factory-method="userDao"></bean>

○ 实现FactoryBean规范延迟实例化bean(它不是马上创建,在用的时候才创建)看下FactoryBean里面就能看到实际上工作的只有3个方法:getObject返回对象、getObjectType返回类型、isSingleton是否单例

● bean的注入方式 ○ 通过set方法进行注入 ■ 注入的是普通属性:用value就行(string、int) ■ 注入的是对象引用:通过ref进行注入(Reference) ○ 通过构造Bean的方法进行注入 ■ 普通属性 ■ 对象引用 ● bean依赖注入的数据类型 ○ 普通数据类型:string、int、boolean等,通过value属性指定 ○ 引用数据类型(容器中1个bean注入另外1个bean):UserDaoImpl、DataSource等,通过ref属性指定 ○ 集合数据类型:List、Map、Properties等 ○ 举一些例子

<bean id="userService" class="com.autonavi.xmap.springLearning.service.impl.UserServiceImpl">
        <property name="stringList">
           <list>
               <value>aaa</value>
               <value>bbb</value>
               <value>ccc</value>
           </list>
        </property>
        <property name="userDaoList">
            <list>
                <bean class="com.autonavi.xmap.springLearning.dao.UserDaoImpl"></bean>
                <bean class="com.autonavi.xmap.springLearning.dao.UserDaoImpl"></bean>
                <bean class="com.autonavi.xmap.springLearning.dao.UserDaoImpl"></bean>
            </list>
        </property>
        <property name="userDaoList">
            <list>
                <ref bean="userDao1"></ref>
                <ref bean="userDao2"></ref>
                <ref bean="userDao3"></ref>
            </list>
        </property>
        <property name="stringSet">
            <set>
                <value>xxx</value>
                <value>yyy</value>
                <value>zzz</value>
            </set>
        </property>
        <property name="userDaoSet">
            <set>
                <ref bean="userDao1"></ref>
                <ref bean="userDao2"></ref>
                <ref bean="userDao3"></ref>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="keyTest1" value-ref="userDao1">
                </entry>
                <entry key="keyTest2" value-ref="userDao2">
                </entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="p1"> ppp1 </prop>
                <prop key="p2"> ppp2 </prop>
            </props>
        </property>
    </bean>
    <bean id="userDao1" class="com.autonavi.xmap.springLearning.dao.UserDaoImpl"></bean>
    <bean id="userDao2" class="com.autonavi.xmap.springLearning.dao.UserDaoImpl"></bean>
    <bean id="userDao3" class="com.autonavi.xmap.springLearning.dao.UserDaoImpl"></bean>

● bean的自动装配 ○ byName(byname的注意点就是name要对上,并且name不要重复) ○ byType(byType的注意点就是根据type要只能找到一个,不能有多个(唯一匹配性问题),否则爆出有NoUniqueBeanDefinitionException异常,会提示expected single matching bean but found 2: userDao,userDao2 ● bean的其他配置标签 ○ spring的xml标签大体上分为两类,一种是默认标签,一种是自定义标签 ■ 默认标签:就是不用额外导入其他命名空间约束的标签,例如<bean>标签,总共4个默认标签; ● beans:profile进行属性区分 ■ 自定义标签:就是需要额外引入其他命名空间约束,并通过前缀引用的标签,例如 context:property-placeholder/ 这样的标签

举报

相关推荐

0 条评论