spring_ioc_bean
bean的实例化方式
1.构造器方式
Spring默认情况下是调用java类的构造器进行初始化,同时会调用bean的无参构造方法
public class Dog{ private String name;
private int age; ...
public Dog(String name,int age){
super();
this.name=name;
this.age=age;
} }
xml文件中
<bean id="dog" class="类路径">
<constructor-arg index="0" value="金毛"></...>
</bean>
index是构造方法的参数位置,从0开始
value是参数值
2.静态工厂方式 无需初始化工厂类对象就能获得Product类实例
public class Product{ public void desc(){ System.out.print("2112312413"); //工厂类生产的对象 } } public class StaticFactory{ public static Product getProduct(){ //静态工厂类 return new Product(); } } <bean id="product" class="静态工厂类路径" factory-method="getProduct"> </bean>
获取静态工厂创建的实例只需配置工厂类,及工厂类对应创建实例的方法,Spring会执行静态工厂类的静态方法创建对象,并返回引用
Product product = (Product) ac.getBean("product");
product.desc();
3.普通工厂方式
public class Product{ public void desc(){ System.out.println("asdafasdf"); } } public class CustomFactory{ public Product getProduct(){ return new Product(); } } <bean id="custonFactory" class=“工厂类路径”></bean> 定义工厂类 <bean id="product" factory-bean="cunstonFactory" factory-method="getProduct"></bean> 配置文件:当ac.getBean()获取product实例,spring会创建factory实例,并执行工厂方法,返回对象
4.定义多个配置文件
可以在一个配置文件中引入其他配置文件
在applicationContext.xml文件中 在beans标签下
<import resource ="需要引入的配置文件的相对路径" />
bean的管理
1.bean的作用域与初始化时间
<bean id="userDao" class="com. .... .UserDao" scope="singleton" lazy-init="true"></bean>
scope取值范围:1.singleton 单例 spring ioc中仅存在一个Bean实例,根据lazy-init选择创建时间,lazy-init默认false
2.prototype 元数据 getBean一次创建一个新的Bean实例,每次获取对象实例就创建一个新的对象实例
lazy-init:true 第一次获取对象实例时创建
false 容器加载时创建对象
2.bean的初始化和销毁方法
spring创建bean实例后调用bean的初始化方法,spring在容器关闭后,bean不被spring容器调用,进入可垃圾回收阶段,容器关闭前会调用bean的销毁方法,只有scope=singleton的bean才会执行销毁方法
<bean id="dog" class="类路径' scope="singLeton" lazy-init="true" init-method="init" destroy-method="destory"> <constructor-arg index="0" value="边牧"></.....> </bean>
Dog类中代码
public class Dog{ private ..... ... public void init(){ ....初始化对象后,执行初始化方法 } public void destory(){ ... 关闭容器时调用销毁方法 } }
bean属性设置
1.依赖注入
spring可以初始化对象还可以为成员变量赋值,不需要手动编码,依赖容器初始化对象,并赋值给bean全局变量的方式叫依赖注入
传统方式
Boy boy = new Boy(); Dog dog = new Dog(); boy.setDog(dog);
依赖注入:Spring容器初始化两个组件,依据配置的依赖关系,将Boy对象dog变量赋值
<bean id = "boy" class="Boy类路径"> <property name="dog" ref="dog"></...> ref依赖于下面的bean id=“dog” </bean> <bean id="dog" class="Dog类路径"></bean>
2.手动注入
1.setter方法注入:spring调用bean组件中属性对应的setter方法完成属性的注入(赋值)
1.基本类型注入:共有18中 8中基本类型和其封装类型 String和StringBuffer类型
<bean id="stetterBasic" class="类路径"> <property name="setterBasic中的属性 例 name" value="对应的值"></poperty> </bean>
2.spring组件类型注入:当前bean组件属性为spring容器的其他bean组件,容器可以读取配置文件对当前属性进行赋值
<bean id="dog" class="Dog类路径">
<proerty name="name" value="边牧"></property>
<property name="age" value="3“></property>
</bean> <bean id = "boy" class="Boy类路径">
<!--Boy类中有一个Dog类型的成员变量 为其赋值-->
<property name="dog" ref="dog"></property> </bean。
3.集合类型注入 :泛指bean组件的属性式List Set Map 数组 Properties等
List注入
<bean id="setterList" class="类路径"> <property name="list"> <list> <value type="java.lang.String">1</value> 基本类型 <ref bean="bean"/> 不常用 spring组件类型 <null></null> 不常用插入集合类型
</list> </property> </bean> <!-- list中对象的顺序按从上到下的赋值顺序,list当中的数据可以式基本类型,spring组件类型,集合类型等 -->
set与list用法一致
map方式注入
<property name="map"> <map> <entry key-ref="bean" value-ref=""></entry> 不常用 引用spring组件 <entry key="aa" value="bb"></entry> </map> </property>
2.构造器方式注入:spring在初始化bean组件时,调用含参数构造器对全部变量赋值,赋值方式与setter方法赋值方式一致
<bean id="boy" class="类路径'> <constructor-arg index="0" value="123">
</constructor-arg>
<constructor-arg index="1" ref="dog"></constructor-arg>
</bean>
3.自动注入