1.实体Bean的构建
a.基于Class构建
b.构造方法构建
c.静态工厂方法创建
d.FactoryBean创建
2.1.基于Class构建
<bean class="com.tuling.spring.HelloSpring"/>
这是最常见的方法,其原理是在spring底层会基于class属性通过反射进行构建
2.2.构造方法构建
<bean class="com.tuling.spring.HelloSpring">
<constructor-arg name="name" type="java.lang.String" value="tuling"/>
<constructor-arg index="1" type="java.lang.String" value="sex" />
</bean>
如果需要基于参数构建,就采用构造方法构建,其对应属性如下:
name:构造方法参数变量名称
type:参数类型
index:参数索引,从0开始
ref:引用容器的其它对象
2.3.静态工厂方法创建
<bean class="com.tuling.spring.HelloSpring" factory-method="build">
<constructor-arg name="type" type="java.lang.String" value="B"/>
</bean>
此方法就是在一个HelloSpring类里定义一个build静态方法,通过参数不同返回不 同对象。
如果你正在对一个对象进行A/B测试,就可以采用静态工厂方法的方式创建,基于策略创建不同的对象或填充不同的属性。
该模式下必须创建一个静态工厂方法,并且方法返回该实例,spring会调用该静态方法创建对象
2.4.FactoryBean创建
<bean id="driver" class="com.tuling.spring.DriverFactoryBean">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306"/>
</bean>
指定一个Bean工厂来创建对象,对象构建初始化完全交给该工厂来实现,配置Bean时指定该 工厂类的类名。
要定义一个实现了FactoryBean接口的对象,实现该接口的方法。
3.bean的基本特性
a.作用范围
b.生命周期
c.装载机制
3.1.作用范围
3.2.生命周期
3.3.加载机制
4.依赖注入
试想IOC中如果没有依赖注入,那这个框架就只能帮助我们构建一些简单的Bean,而 之前说的复杂Bean的构建问题将无法解决,Spring这个框架不可能 会像现在这样成功。spring中ioc如何依赖注入呢。有以下几种方式
a.set方法注入
b.构造方法注入
c.自动注入(byName,byType)
d.方法注入(looup-method)
4.1.set方法注入
<bean class="com.tuling.spring.HelloSpring">
<property name="find" ref="fineSpring"/>
</bean>
4.2.构造方法注入
<bean class="com.tuling.spring.HelloSpring">
<constructor-arg name="fine">
<bean class="com.tuling.spring.FineSpring"/>
</constructor-arg>
</bean>
4.3.自动注入(byName\byType\constructor)
<bean id="helloSpringAutowireConstructor" class="tuling.spring.HelloSpring" autowire="byName"/>
byName:基于变量名与bean名相同作为依据插入
byType:基于变量类别与bean名称作为依据插入
constructor:基于IOC中bean与构造方法进行匹配(语义模糊,不推荐)
4.4.依赖方法注入(lookup-method)
当一个单例的Bean,依赖于一个多例的Bean,用常规方法只会被注入一次,如果每次都想要获取一个全新实例就可以采用lookup-method方法来实现 。
该操作的原理是基于动态代理技术,重新生成一个继承至目标类,然后重写抽象方法达到注入目的。抽象方法FineSpring是由spring框架实现。
前面所说单例Bean依赖多例Bean这种情况也可以通过实现ApplicationContextAware、BeanFactoryAware接口来获取BeanFactory实例,从而可以直接调用getBean方法获取新实例,推荐使用该方法,相比lookup-mehtod语义逻辑更清楚一些。