Spring 之Bean的裝配
Spring Bean的裝配分為3中:
1、隱式發現和自動裝配
@Component:將一個Java類聲明為Bean(組件類),等待Spring掃描發現。
@ComponentScan:啟用組件掃描將帶有@Component的類實例化為Bean,一般用在配置類上,可指定掃描基礎包,默認與配置類相同的包。
@Configuration:聲明一個Java類是配置類,它與@Component作用相當,只是更為直觀,一般@Bean與其連用。
<context:component-scan base-package="...">:通過XML方式啟用組件掃描。
@Autowired:為bean中的屬性自動註入,前提是該類必須聲明為一個bean,如添加@Component
@Bean:將方法的返回對象作為bean,前提是該類必須是一個bean,如添加@Configuration
2、通過Java代碼裝配
該部分就是@Configuration和@Bean的運用,通過手動創建對象,然後在配置成Bean。
3、通過XML配置
xml配置規範:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
在<beans></beans>中聲明需要的bean,<bean id="xxx" class="全類名" &others.../>,或<bean ...>some configuration</bean>的形式。
借助構造器註入初始化bean:使用<constructor-arg> or c命名空間(需要引入c命名空間,如上述xml頭部的xmlns:c=...)。
使用<constructor-arg>:
<bean id="xxx" class="com.example.xxx"> <constructor-arg ref="bean-id"/> <constructor-arg value="value"/> <constructor-arg><null/></constructor-arg> </bean>
使用c命名空間:
<bean id="xxx" class="com.example.xxx" c:xxx-ref = "bean-id" c:_xxx = "constant value" /> <!-- 還可以根據參數順序命名--> <bean id="xxx" class="com.example.xxx" c:_0-ref = "bean-id" c:_1 = "constant value" /> <!-- 當只有一個參數時,直接用c:_-ref或c:_=即可-->
但c命名空間有限制,當構造參數傳入一個集合時,只能使用<constructor-arg>:
<bean id="xxx" class="com.example.xxx"> <constructor-arg ref="bean-id"/> <constructor-arg value="value"/> <constructor-arg><null/></constructor-arg> <constructor-arg> <list> <ref bean="b1"/> <ref bean="b2"/> <ref bean="b3"/> </list> </constructor-arg> <constructor-arg><!--set and constant--> <set> <value>one</value> <value>two</value> <value>three</value> </set> </constructor-arg> </bean>
設置屬性
<bean id="xxx" class="com.example.xxx"> <property name="property-name" ref="bean-id"/> <property name="property-name" value="constant-value"/> <property name="property-name"> <list> ... </list> </property> </bean>
或者用p命名空間(在xml頭部用xmlns:p引入)
<bean id="xxx" class="com.example.xxx" p:p1-ref = "bean-id" p:p2 = "constant-value" /> <!--p命名空間不可用順序來確定屬性,同樣無法處理集合類-->
Spring util命名空間簡化集合類:將集合變成一個bean
<!--使用util:list創建一個list的bean--> <util:list id = "bean-id"> <ref bean = "bean-id"/> <!-- or <value> tag --> </util:list>
4、導入和混合配置
JavaConfig引用xml配置:在配置類上使用@ImportResource註解導入xml,如@ImportResource("classpath:beans.xml")
JavaConfig互相引用:在配置類上使用@Import註解,如@Import(class-name.class)
XML引用XML:<import resource="beans.xml"/>
5、JUnit單元測試
maven引入JUnit和spring-test:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.0.4.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency>
編寫測試類:
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import soundsystem.CDPlayerConfig; import soundsystem.CompactDisc; import soundsystem.MediaPlayer; /** * Author: * Date:2018/3/14 15:21 * Email: * Comment: */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = CDPlayerConfig.class) public class CDPlayerTest { @Autowired private MediaPlayer player; @Autowired private CompactDisc cd; @Test public void cdShouldNotBeNull() { Assert.assertNotNull(cd); } @Test public void playTest() { player.play(); } }
持續更新...
Spring 之Bean的裝配