spring详解

spring:
DI:依赖注入
IOC反转控制


在依赖注入模式下,被调用者将不是由调用者创建(反转控制),创建被调用者的实例工作通常是由Spring容器来完成,然后注入调用者,所有称为依赖注入


静态工厂Bean:使用静态工厂返回Bean时其容器调用getBean返回的并不是工厂实例本身而是工厂生产的Bean实例,从配置上来看,需要在Bean标签中追加
一个factory-method来指定一个工厂中返回Bean的调用的静态方法,如果静态方法中有参数,通过constructor-arg为之传入
lazy-init指定是否延迟加载,及在调用时才实例


A、scope=prototype:
该值使容器总是延迟实例化该Bean对象,且在应用层调用getBean方法时将直接
调用底层工厂方法获取Bean对象并返回该Bean对象到调用层


B、scope= singleton:
该值使Spring容器首先检查lazy-init属性是否为false,如果为false则在
Spring容器启动时实例化Bean对象并以当前BID为键,Bean对象作为值推入
Spring容器中;如果为true则Spring容器将Bean的实例化过程延迟到应用层调用
getBean时发生
小结:
应用层调用getBean方法时首先检查将要获取的Bean是否为原型Bean,如果是原型
Bean则直接调用底层工厂创建一个新的Bean实例返回;如果获取的Bean不是原型
Bean则检查容器中是否存在该BID(Bean ID)对应的Bean对象,如果有则直接从容
器中返回,如果没有则调用底层工厂方法获取Bean对象同时以当前BID为键,Bean
对象作为值推入Spring容器中(便于下次getBean时直接从容器返回),最后返回这
个Bean对象到调用层


使用实例工厂返回Bean对象需要单独定义一个工厂的Bean实例,在另一个工厂配
置中使用factory-bean属性指向真实的工厂类实例,使用factory-method指向真
实工厂实例的实例工厂方法(类同于静态工厂,其访问权限不受限制)
public class StaticFactory {
    public IGroup getGroup(String groupType){ //改为实例方法
        if("group".equalsIgnoreCase(groupType)){
return new Group();
        }else{
return new CGlass();
        }
    }
}


注意:
创建实例工厂时,其工厂方法必须是实例方法,不能是静态方法


<!—配置工厂类Bean-->
<bean id=“factory" class="com.scxh.factory.StaticFactory"/>


<!—配置实例工厂-->
<bean id="group" factory-bean="factory" factory-method="getGroup">
     <constructor-arg value="group"/>
</bean>


注意:
1、这里没有指定lazy-init和scope两个属性,在没有指定这两个属性时,他们默认值分别是
      false和singleton


2、 constructor-arg用于为StaticFactory类中的实例方法getGroup注入参数,property
       标签则为返回的产品实例注入参数


3、实例工厂方法的访问权限不受限制(可以为private),Spring底层自动使用反射破解权限
      封装进行调用


注意:
子标签property不是为工厂类StaticFactory实例注入参数而是为getGroup方法返回的产品实例注入参数


Bean的生命周期:
原型bean不是由spring容器管理,它是由java虚拟机管理
单例bean是有spring容器管理,spring容器负责实例化并跟踪和管理Bean的行为和生命周期


在Bean的配置中有两个属性可以用于附加生命周期行为,他们是:
init-method:在Bean的所有属性注入完成之后调用该属性指向的Bean类中的方法
destory-method:在Bean对象被销毁之前调用该属性指向的Bean类中的方法


在使用destory-method属性时为确保Spring在销毁单例Bean之前不至于强行切断进程导致该属性指定的方法无从调用,我们可以为Spring上下文注册一个关闭事件,这时使用的Spring上下文类型是AbstractApplicationContext:
AbstractApplicationContext context=new ClassPathXmlApplicationContext("./beans.xml");
context. registerShutdownHook();
init-method和destory-method两个方法可以指向静态方法
注:
可以通过将Bean实现InitializingBean和DisposableBean接口来分别完成init-method和destory-method两个属性的行为,此时Bean类中就不再需要单独定义初始化和销毁的方法了,直接实现相应接口中的方法即可,Spring在Bean的初始化完成之后和Bean的销毁之前默认回调接口中被重写的方法, DisposableBean接口仍然需要注册上下文关闭事件
使用接口的方式并不被推荐,因为它是强侵入式的,不便于灵活配置,如果同时使用了实现接口和配置,则Spring优先调用接口中的方法再调用配置中指定的方法


工厂Bean:自定义的工厂Bean类必须实现FactoryBean接口
<bean id="factory" class="com.scxh.factory.PersonFactory">
         <property name="singleton" value="false"/>
         <property name="classType" value="com.scxh.bean.Group"/>
</bean>


注意:
1、此处的property子标签为工厂Bean实例注入依赖,而不是为生产的产品注入依赖,这与静
     态和实例工厂不相同


2、如果Bean类中有布尔逻辑类型则注入依赖时必须是true或false值,Spring采用如下方式
     完成字串类型到布尔类型的转换:
     Boolean.parseBoolean(s)


在Bean中获取BID:如果需要获取当前Bean的ID属性值可以使Bean类实现BeanNameAware接口
在Bean中获取Spring容器:如果需要获取当前Bean所在的Spring容器可以使Bean类实现ApplicationContextAware接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值