- 使用屬性的setter方法注入 這是最常用的方式;
- 使用構造器注入;
- 使用Filed注入(用于注解方式).
Field注入是最常見的一種方式,可以采用 @Autowired 對Bean類的接口進行初始化,代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@ContextConfiguration ({ "/META-INF/spring/amazing-base.xml" }) @RunWith (SpringJUnit4ClassRunner. class ) public class SpringInjectionTest { @Autowired private Cust normalCust; @Test public void testFieldInjection() { System.out.println( "testFieldInjection begin" ); normalCust.recharge(); System.out.println( "testFieldInjection end" ); } } |
Cust為接口,NormalCust為其實現類,通過這種方式,可以通過Spring容器初始化NormalCust Bean,進而調用recharge()方法。
構造器注入主要用于某些類因為某種原因不能作為Bean,只是一個普通類??梢酝ㄟ^類的構造方法傳入需要調用的Bean接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@ContextConfiguration ({ "/META-INF/spring/amazing-base.xml" }) @RunWith (SpringJUnit4ClassRunner. class ) public class SpringInjectionTest { @Autowired private Cust normalCust; @Test public void testConstructorInjection() { System.out.println( "testConstructorInjection begin" ); ChargeThread thread = new ChargeThread(normalCust); thread.run(); System.out.println( "testConstructorInjection end" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class ChargeThread implements Runnable { private Cust cust; public ChargeThread(Cust cust) { this .cust = cust; } public void run() { cust.recharge(); } } |
上面的代碼通過初始化一個線程,在初始化的時候傳入Bean,在線程的類中調用Bean的充值方法。構造器注入特別適合多線程的編程,因為線程不能定義為Bean,否則不僅會因為它是一個單例,而且會被Spring容器管理。(當然你可以去定義Bean為原型Bean,能夠有多個副本,脫離Spring容器的管理),最重要的是我們要用線程池,由線程池來管理線程。
還有一種Setter方法注入,這種方式能用于final類的靜態方法,例如有一個充值的Util類,該類是final類,其方法是靜態方法。
1
2
3
4
5
6
7
8
9
|
public class SpringInjectionTest { @Test public void testSetterInjection() { System.out.println( "testSetterInjection begin" ); String result = RechargeUtil.InstantRecharge(); System.out.println( "testSetterInjection end, " + result); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Component public final class RechargeUtil { private RechargeUtil() { } private static Cust normalCust; @Autowired public void setNormalCust(Cust normalCust) { RechargeUtil.normalCust = normalCust; } public static String InstantRecharge() { normalCust.recharge(); return "InstantRecharge Success!" ; } } |
最后一種方式也成功了將normalCust注入到了RechargeUtil中。
以上三種注入方式,讀者可以根據實際應用場景靈活選擇。也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/dotnetstudio/article/details/50781022