Spring速查手冊——Bean裝配
阿新 • • 發佈:2022-05-03
Spring提供三種Bean的裝配方式,分別是: 1. 自動裝配Bean 2. 在Java中裝配Bean 3. 在XML中裝配Bean
1. 自動裝配Bean(註解)
Spring從兩個角度完成Bean的自動化裝配: - 元件掃描:掃描上下文中所有的Bean(由@Component、@Named註解完成) - 自動裝配:將指定的Bean注入到指定的Bean中(由@Autowired、@Injected註解完成)
1.1. 開啟元件掃描
- Java的配置方式
@Configuration // 把當前類作為配置類 @ComponentScan // 開啟元件掃描 public class XXXConfig(){}
- 預設情況下掃描與當前配置類共同包下的元件;
- 指定掃描的基礎包:
- @ComponentScan(“com.njupt.xxx”)
- @ComponentScan(basePackages=”com.njupt.xxx”)
- @ComponentScan(basePackages={“com.njupt.xxx”,”com.nju.xxx”})
- @ComponentScan(basePackageClasses={“XXXService.class”,”YYYService.class”})
- XML的配置方式
<context:component-scan base-package="xxx.xxx.xxx">
1.2. 標識元件
@Component
class xxx{}
- 預設的Bean ID為第一個字母小寫的類名。
- 指定Bean ID:@Component(“xxx”)
- 第二種標識方式:@Named,和@Component用法一樣,只不過它是Java Dependency Injection規範中提供的。
1.3. 自動裝配
- 自動注入構造器引數 @Autowired public XXX( Y y ){ this.y = y; }
- 自動注入setter方法引數 @Autowired public void setXXX( X x ){ this.x = x; }
PS:也可使用@Inject註解,和@Named一樣,都是Java依賴注入規範的註解,Spring實現了這些註解。
2. 在Java中裝配Bean
2.1. 宣告Bean
@Configuration
class XXXConfig{
// 建立一個Bean
@Bean
public A setA(){
return new A();
}
}
- 方法名:bean的名字 也可以通過@Bean(name=”xxx”)指定bean的名字。
- 函式體:通過new建立物件
- 返回值:為該建立的bean物件
2.2. 注入
@Configuration
class XXXConfig{
@Bean
public A setA(){
return new A();
}
// 注入方式一:執行setA函式(low比)
@Bean
public B setB(){
return new B( setA() );
}
// 注入方式二:Spring自動注入(優雅)
@Bean
public B setB( A a ){
return new B( a );
}
}
3. 在XML中裝配Bean
3.1. 宣告一個bean
<bean id="xxx" class="com.xxx.xxx" />
3.2. 構造器注入
- 使用constructor-arg
<!-- 注入引用 -->
<bean id="xxx" class="com.xxx.xxx">
<constructor-arg ref="yyy" />
</bean>
<!-- 注入字面值 -->
<bean id="xxx" class="com.xxx.xxx">
<constructor-arg value="我是字面值" />
</bean>
<!-- 注入集合 -->
<bean id="xxx" class="com.xxx.xxx">
<constructor-arg>
<list>
<value>啦啦啦1</value>
<value>啦啦啦2</value>
<value>啦啦啦3</value>
</list>
</constructor-arg>
</bean>
<bean id="xxx" class="com.xxx.xxx">
<constructor-arg>
<list>
<ref bean="xxx1" />
<ref bean="xxx2" />
<ref bean="xxx3" />
</list>
</constructor-arg>
</bean>
- 使用c-名稱空間 首先需要在beans標籤中加入xmlns:c名稱空間。
<!-- 注入引用(若建構函式有多個引數) -->
<bean id="xxx" class="com.xxx.xxx" c:引數名-ref="yyy"/>
<!-- 注入引用(指定注入到第幾個引數中) -->
<bean id="xxx" class="com.xxx.xxx" c:0-ref="yyy"/>
<!-- 注入引用(若建構函式只有一個引數) -->
<bean id="xxx" class="com.xxx.xxx" c:_-ref="yyy"/>
<!-- 注入字面值 -->
<bean id="xxx" class="com.xxx.xxx" c:_引數名="啦啦啦"/>
<bean id="xxx" class="com.xxx.xxx" c:_0="啦啦啦"/>
<!-- 注入字面值(若建構函式只有一個引數) -->
<bean id="xxx" class="com.xxx.xxx" c:_="啦啦啦"/>
PS:c名稱空間不支援集合裝配!
3.3. 屬性注入
- 使用property屬性
<bean id="xxx" class="com.xxx.xxx">
<property name="屬性名" ref="yyy" />
</bean>
- 使用P名稱空間 首先需要在beans標籤中引入p名稱空間。
<bean id="xxx" class="com.xxx.xxx" p:屬性名-ref="yyy" />
4. 混合使用JavaConfig中的bean和XML中的bean
4.1. 在JavaConfig中引用另一個javaConfig中的bean
@Configuration
@Import({XXXConfig.class,YYYConfig.class})
class XXXConfig{
@Bean
public A setA(){
return new A();
}
}
4.2. 在JavaConfig中引用XML中的bean
@Configuration
@ImportResource("classpath:xxx.xml")
class XXXConfig{
@Bean
public A setA(){
return new A();
}
}
4.3. 在XML中引入另一個XML
<beans>
<import resource="xxx.xml" />
<bean />
</beans>
4.4. 在XML中引入JavaConfig
直接宣告一個bean即可:
<bean class="com.xxx.XXXConfig" />