- 屬性聲明
<bean id="student" class="com.atguigu.spring.bean.Student">
<property name="id" value="1"/>
<property name="name" value="zhangsan"/>
<property name="age" value="22"/>
</bean>
- 構造器聲明
<!-- index爲參數的順序 -->
<bean id="book3" class="com.atguigu.spring.bean.Book">
<constructor-arg value="2" type="java.lang.Integer" index="0"/>
<constructor-arg value="紅樓夢" index="1"/>
<constructor-arg value="100.8" type="double" index="2"/>
</bean>
- P名稱空間
<bean id="book4" class="com.atguigu.spring.bean.Book" p:bookid="1" p:bookName="xxx" p:price="22.2"/>
- Bean之間的依賴引用
<bean id="userService" class="com.atguigu.spring.component.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.atguigu.spring.component.UserDao"></bean>
- 內部bean
<bean id="userService2" class="com.atguigu.spring.component.UserService">
<property name="userDao">
<!-- 內部bean對象,主要就是給當前屬性賦值;其他bean無法使用,所以也就不需要定義id -->
<bean class="com.atguigu.spring.component.UserDao"></bean>
</property>
</bean>
- 集合屬性注入
<bean id="bookShop" class="com.atguigu.spring.bean.BookShop">
<!-- 使用List類型的集合屬性 -->
<property name="bookList">
<list>
<ref bean="book"/>
<ref bean="book2"/>
<ref bean="book3"/>
</list>
</property>
<!-- 使用Map類型的集合屬性 -->
<property name="bookMap">
<map>
<entry key="101" value-ref="book"/>
<entry key="102" value-ref="book2"/>
<entry key="103" value-ref="book3"/>
</map>
</property>
<!-- 使用prop子元素爲Properties類型的屬性賦值 -->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
- util名稱空間
<!-- 通過util名稱空間創建集合類型的bean -->
<util:list id="bookList">
<ref bean="book"/>
<ref bean="book2"/>
<ref bean="book3"/>
</util:list>
- 級聯屬性賦值
<bean id="bookShop3" class="com.atguigu.spring.bean.BookShop">
<property name="book" ref="book"/>
<property name="book.bookName" value="三國演義後傳"/>
</bean>
- factoryBean工廠
//框架提供了FactoryBean接口,支持項目功能擴展.
//框架利用FactoryBean接口的實現類,來集成第三方框架.
public class MyBookFactoryBean implements FactoryBean<Book> {
@Override
public Book getObject() throws Exception {
return new Book(111,"XXX",33.3);
}
@Override
public Class<?> getObjectType() {
return Book.class;
}
@Override
public boolean isSingleton() {
return true; //true表示單例,false表示多例
}
}
<bean id="book8" class="com.atguigu.spring.factory.MyBookFactoryBean"></bean>
- 模板Bean聲明
<!--通過繼承實現bean配置信息的重用 -->
<bean id="bookTemplate" class="com.atguigu.spring.bean.Book">
<property name="price" value="22.9"/>
</bean>
<bean id="book9" parent="bookTemplate">
<property name="bookid" value="222"/>
<property name="bookName" value="三國演義[2]"/>
</bean>
- Bean的依賴
<!-- bean的創建爲根據配置順序從上到下進行,但是被依賴的優先創建,比如man -->
<bean id="woman" class="com.atguigu.spring.bean.Woman" depends-on="man"></bean>
<bean id="book13" class="com.atguigu.spring.bean.Book"></bean>
<bean id="man" class="com.atguigu.spring.bean.Man"></bean>
- Bean的作用域
<!-- 如果希望延遲創建對象,可以設置lazy-init="true";
但是如果設置了scope="prototype",以及相當於延遲創建對象了,這是再設置lazy-init就不起作用了.-->
<bean id="student" class="com.atguigu.spring.bean.Student" lazy-init="false" scope="prototype"></bean>
-
Bean對象的初始化和銷燬方法
<!-- 初始化,銷燬方法必須是無參的-->
<!-- 銷燬方法,在單例情況下,而且是在關閉IOC容器時纔會執行 -->
<bean id="student2" class="com.atguigu.spring.bean.Student" init-method="init" destroy-method="destory" ></bean>
- properties文件
<!-- 加載外部屬性資源文件,加載Spring的運行環境中 -->
<context:property-placeholder location="classpath:/jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.userName}"/>
<property name="password" value="${jdbc.password}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="initialPoolSize" value="2"/>
<property name="minPoolSize" value="5"/>
<property name="maxPoolSize" value="105"/>
</bean>
- 基於註解的聲明
<!-- 掃描當前包以及所有子包 -->
<context:component-scan base-package="com.atguigu.component"/>
<!-- 包含過濾 -->
<context:component-scan base-package="com.atguigu.component" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="assignable" expression="com.atguigu.component.service.UserService"/>
</context:component-scan>
<!-- 排除過濾-->
<context:component-scan base-package="com.atguigu.component">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="assignable" expression="com.atguigu.component.service.UserService"/>
</context:component-scan>
- Autowired註解特別說明
/*
首先根據byType進行裝配:
如果只查找到一個,就直接裝配;
如果查找到多個,報錯:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [com.atguigu.component.service.UserService] is defined:
expected single matching bean but found 2: userServiceImpl,userServiceImpl2
如果多個都希望被註解:
可以採用數組或集合(泛型)進行裝配.
根據byType無法確定某一個Bean進行裝配時,再根據byName進行裝配.
如果根據byType查找到的多個Bean對象的id名稱與當前對象的屬性名稱:
一致,則裝配這個一致名稱的Bean對象;
不一致,可以藉助於@Qualifier來指定其中的某個Bean進行裝配.
如果指定的名稱在,則裝配;
如果指定的名稱不在,報錯;
如果根據byName也無法裝配,採用required=false放棄裝配.
*/
@Autowired(required=false)
@Qualifier(value="userServiceImpl3")
另外如果一個接口有多個實現類時,在使用autowired注入時,可以通過泛型的方式去制定需要注入的具體實現類