(1),每一个bean属性,就是一个普通的java类。
类有属性,有方法,如何交给容器管理。(注解的方式,xml方式配置)
(2),通过Bean来实例化对象的方式
1.通过构造器(一般是无参的默认构造器)
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
2.使用静态工厂方法实例化
下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并 未指定返回对象的类型,仅指定该类包含的工厂方法。
在此例中, createInstance()必须是一个static方法。
<bean id="exampleBean"
class="examples.ExampleBean2"
factory-method="createInstance"/>
(3),使用实例工厂方法实例化
(4), 注入依赖
依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:
构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。
因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、
直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入
的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control, IoC) 名字的由来。
应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系
(甚至不知道依赖的定义指定地方和依赖的实际类)之后,实现更高层次的松耦合将易如反掌。
DI主要有两种注入方式,即Setter注入和构造器注入
(5),在采用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况。
比如说,一个类A,需要通过构造器注入类B,而类B又需要通过构造器注入类A。
如果为类A和B配置的bean被互相注入的话,那么Spring IoC容器将检测出循环引用,
并抛出 BeanCurrentlyInCreationException异常。
对于此问题,一个可能的解决方法就是修改源代码,将某些构造器注入改为setter注入。
(6),依赖配置详解
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="masterkaoli"/>
</bean>
(7),各类数据类型的依赖注入
<bean id="moreComplexObject" class="example.ComplexObject"> <!-- results in a setAdminEmails(java.util.Properties) call --> <property name="adminEmails"> <props> <prop key="administrator">[email protected]</prop> <prop key="support">[email protected]</prop> <prop key="development">[email protected]</prop> </props> </property> <!-- results in a setSomeList(java.util.List) call --> <property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource" /> </list> </property> <!-- results in a setSomeMap(java.util.Map) call --> <property name="someMap"> <map> <entry> <key> <value>an entry</value> </key> <value>just some string</value> </entry> <entry> <key> <value>a ref</value> </key> <ref bean="myDataSource" /> </entry> </map> </property> <!-- results in a setSomeSet(java.util.Set) call --> <property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource" /> </set> </property> </bean>