轉自http://www.cnblogs.com/bossen/p/5824067.htmlhtml
註解分爲兩類:java
一、一類是使用Bean,便是把已經在xml文件中配置好的Bean拿來用,完成屬性、方法的組裝;好比@Autowired , @Resource,能夠經過byTYPE(@Autowired)、byNAME(@Resource)的方式獲取Bean;spring
二、一類是註冊Bean,@Component , @Repository , @ Controller , @Service , @Configration這些註解都是把你要實例化的對象轉化成一個Bean,放在IoC容器中,等你要用的時候,它會和上面的@Autowired , @Resource配合到一塊兒,把對象、屬性、方法完美組裝。app
3、@Bean是啥?測試
一、原理是什麼?先看下源碼中的部份內容:ui
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Indicates that a method produces a bean to be managed
by
the Spring container.
<h3>Overview</h3>
<p>The names and semantics of the attributes to
this
annotation are intentionally
similar to those of the {@code <bean/>} element
in
the Spring XML schema. For
example:
<pre
class
=
"code"
>
@Bean
public
MyBean myBean() {
// instantiate and configure MyBean obj
return
obj;
}</pre>
|
意思是@Bean明確地指示了一種方法,什麼方法呢——產生一個bean的方法,而且交給Spring容器管理;從這咱們就明白了爲啥@Bean是放在方法的註釋上了,由於它很明確地告訴被註釋的方法,你給我產生一個Bean,而後交給Spring容器,剩下的你就別管了this
二、記住,@Bean就放在方法上,就是產生一個Bean,那你是否是又糊塗了,由於已經在你定義的類上加了@Configration等註冊Bean的註解了,爲啥還要用@Bean呢?這個我也不知道,下面我給個例子,一塊兒探討一下吧:spa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package
com.edu.fruit;
//定義一個接口
public
interface
Fruit<T>{
//沒有方法
}
/*
*定義兩個子類
*/
package
com.edu.fruit;
@Configuration
public
class
Apple
implements
Fruit<Integer>{
//將Apple類約束爲Integer類型
}
package
com.edu.fruit;
@Configuration
public
class
GinSeng
implements
Fruit<String>{
//將GinSeng 類約束爲String類型
}
/*
*業務邏輯類
*/
package
com.edu.service;
@Configuration
public
class
FruitService {
@Autowired
private
Apple apple;
@Autowired
private
GinSeng ginseng;
//定義一個產生Bean的方法
@Bean
(name=
"getApple"
)
public
Fruit<?> getApple(){
System.out.println(apple.getClass().getName().hashCode);
System.out.println(ginseng.getClass().getName().hashCode);
return
new
Apple();
}
}
/*
*測試類
*/
@RunWith
(BlockJUnit4ClassRunner.
class
)
public
class
Config {
public
Config(){
super
(
"classpath:spring-fruit.xml"
);
}
@Test
public
void
test(){
super
.getBean(
"getApple"
);
//這個Bean從哪來,從上面的@Bean下面的方法中來,返回
的是一個Apple類實例對象
}
}
|
從上面的例子也印證了我上面的總結的內容:code
一、凡是子類及帶屬性、方法的類都註冊Bean到Spring中,交給它管理;xml
二、@Bean 用在方法上,告訴Spring容器,你能夠從下面這個方法中拿到一個Bean