自动装配
自动装配的意思是我们无需指定由哪一个bean来装配,spring会按照我们指定的规则去寻找相应的bean,自动装配有4种类型:
byName:如果某个bean的ID与property的名字一样,则这个bean就会自动装配;
byType:如果某个bean的类型与property的类型一致,则这个bean会被自动装配;
constructor:假设通过构造器注入来装配bean,我们让spring在应用上下文中自动选择与入参类型相同的Bean注入到构造器参数中
autodetect:Spring首先尝试constructor自动装配,如果没有发现与构造器相匹配的Bean,Spring会尝试使用byType自动装配。
注意,前两者是针对要装配的bean的所有property而言的,当然我们也可以为某个property提供独特的装配方案,而constructor则不行,我们不能为某个构造器入参提供独特的装配方案,假设我们有一个类Teacher引用了Student类:
2、懒加载
延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。
配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。
Spring容器会在创建容器时提前初始化“singleton”作用域的Bean,“singleton”就是单例的意思即整个容器每个Bean只有一个实例,后边会详细介绍。Spring容器预先初始化Bean通常能帮助我们提前发现配置错误,所以如果没有什么情况建议开启,除非有某个Bean可能需要加载很大资源,而且很可能在整个应用程序生命周期中很可能使用不到,可以设置为延迟初始化。
3、依赖注入
在此配置中,resourceBean初始化在dependentBean之前被初始化,resourceBean销毁会在dependentBean销毁之后执行。
销毁之前 关闭钩子
但,如果你正在一个非web应用的环境下使用Spring的IoC容器,如dubbo服务,你想让容器优雅的关闭,并调用singleton的bean相应destory回调方法,你需要在JVM里注册一个“关闭钩子”(shutdown hook)。这一点非常容易做到,并且将会确保你的Spring IoC容器被恰当关闭,以及所有由单例持有的资源都会被释放。
4、
<!-- 通过构造器参数索引方式依赖注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
@java.beans.ConstructorProperties({"message", "index1"})
public HelloImpl3(String message, int index1) {
this.message = message;
this.index1 = index1;
}
@Override
public void sayHello() {
System.out.println(index1 + ":" + message);
}
静态工厂类
<!-- 通过静态工厂参数索引方式依赖注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.DependencyInjectByStaticFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
实例工厂类
<bean id="instanceFactory" class="cn.javass.spring.chapter3.DependencyInjectByInstanceFactory"/>
<!-- 通过实例工厂参数索引方式依赖注入 -->
<bean id="byIndex" factory-bean="instanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>