Bean在Spring和SpringMVC中無所不在缤削,將這個概念內(nèi)化很重要,下面分享一下我的想法:
一澄成、Bean是啥
1胧洒、Java面向?qū)ο螅瑢ο笥蟹椒ê蛯傩阅矗敲淳托枰獙ο髮嵗齺碚{(diào)用方法和屬性(即實例化)卫漫;
2、凡是有方法或?qū)傩缘念惗夹枰獙嵗錾埃@樣才能具象化去使用這些方法和屬性列赎;
3、規(guī)律:凡是子類及帶有方法或?qū)傩缘念惗家由献訠ean到Spring IoC的注解镐确;
4包吝、把Bean理解為類的代理或代言人(實際上確實是通過反射、代理來實現(xiàn)的)辫塌,這樣它就能代表類擁有該擁有的東西了
5漏策、我們都在微博上@過某某,對方會優(yōu)先看到這條信息臼氨,并給你反饋掺喻,那么在Spring中,你標(biāo)識一個@符號储矩,那么Spring就會來看看感耙,并且從這里拿到一個Bean或者給出一個Bean
二、注解分為兩類:
1持隧、一類是使用Bean即硼,即是把已經(jīng)在xml文件中配置好的Bean拿來用,完成屬性屡拨、方法的組裝只酥;比如@Autowired , @Resource,可以通過byTYPE(@Autowired)呀狼、byNAME(@Resource)的方式獲取Bean裂允;
2、一類是注冊Bean,@Component , @Repository , @ Controller , @Service , @Configration這些注解都是把你要實例化的對象轉(zhuǎn)化成一個Bean哥艇,放在IoC容器中绝编,等你要用的時候,它會和上面的@Autowired , @Resource配合到一起,把對象十饥、屬性窟勃、方法完美組裝。
三逗堵、@Bean是啥秉氧?
1、原理是什么砸捏?先看下源碼中的部分內(nèi)容:
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類型
}
/*
*業(yè)務(wù)邏輯類
*/
package com.edu.service;
@Configuration
public class FruitService {
@Autowired
private Apple apple;
@Autowired
private GinSeng ginseng;
//定義一個產(chǎn)生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類實例對象
}
}
從上面的例子也印證了我上面的總結(jié)的內(nèi)容:
1垦藏、凡是子類及帶屬性梆暖、方法的類都注冊Bean到Spring中,交給它管理掂骏;
2轰驳、@Bean 用在方法上,告訴Spring容器弟灼,你可以從下面這個方法中拿到一個Bean