分類:JavaWeb框架開發(fā)技術(shù)理解
作者:Stephen
Spring容器
功能:創(chuàng)建并用來(lái)管理Bean對(duì)象的容器
創(chuàng)建:使用了反射機(jī)制尔破,創(chuàng)建Bean的實(shí)例(通過(guò)Class.forName("").newInstance())
容器的設(shè)計(jì):使用了工廠模式(BeanFactory)
管理和實(shí)現(xiàn)模式:容器中的每一個(gè)Bean對(duì)象铭乾,Spring容器默認(rèn)按照單例方式進(jìn)行管理谤绳,可以通過(guò)設(shè)置
<bean scope="prototype"/>
屬性進(jìn)行設(shè)置為每一次都是不同對(duì)象的實(shí)例
ApplicationContext(容器的高級(jí)接口)
第一個(gè)實(shí)現(xiàn)類:ClassPathXmlApplicationContext-->在classpath路徑下加載xml配置文件,完成Spring容器的加載堰塌;或使用注解,就需要在xml配置文件中使用<context : conmponent-scan/>完成類的掃描。
示例代碼:
//創(chuàng)建Spring容器
ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext("spring-config.xml");
//通過(guò)容器的getBean方法獲取相應(yīng)名稱的bean對(duì)象
MessageControllermessageController=(MessageController)context.getBean("messageControllerBean");
//直接調(diào)用其方法
messageController.executeSendMessage();
AnnotationConfigApplicationContext :基于全部使用注解的方式來(lái)加載配置spring的容器
示例代碼:
//基于注解形式的applicationcontext對(duì)象創(chuàng)建spring容器的方法
//直接進(jìn)行包的掃描和配置院喜,無(wú)需寫xml配置文件
ApplicationContextcontext=newAnnotationConfigApplicationContext("com.apesource");
//沒設(shè)置名字的時(shí)候要使用默認(rèn)的類名首字母小寫作為創(chuàng)建的對(duì)象名
UserControlleruserController=(UserController)context.getBean("userController");
userController.userDosth();
細(xì)節(jié):
容器中如果沒有這個(gè)對(duì)象獲取組件的話報(bào)異常NoSuchBeanDefinitionException? 組件未定義異常?
property賦值調(diào)用setter方法進(jìn)行賦值?
javaBean的屬性名由什么決定的?getter/setter方法的set/get后面的名字? getter/setter全部自動(dòng)生成的? ?
如果ioc容器中這個(gè)類型的bean有多個(gè)用類型找就會(huì)報(bào)NoUniqueBeanDefinitionException異常 ;這個(gè)時(shí)候就只能通過(guò)bean的id來(lái)找,但是可以用ioc.getBean(id,class)方法就可以找到 .
對(duì)于IoC或者DI的理解
IoC:Inverse of Control(控制反轉(zhuǎn))
DI:Dependency Injection(依賴注入)
兩者本質(zhì)相同晕翠,表達(dá)的思想理念都是:對(duì)于開發(fā)過(guò)程中喷舀,將所有的類(組件)的創(chuàng)建和配置全部交給Spring容器來(lái)進(jìn)行管理,按照類彼此之間的依賴關(guān)系(A調(diào)用B則:A依賴B)采用xml配置文件的方式或者注解的方式淋肾,完成組件之間的配置與注入硫麻,主要是為了解決類與類之間的耦合關(guān)系。
共有三種注入方式:
1.屬性注入(調(diào)用setter方法樊卓,用到了反射)
2.構(gòu)造注入(使用有參構(gòu)造方法進(jìn)行注入)
3.接口注入(不常用)
示例代碼:
<!--配置當(dāng)前控制器bean-->
<!--相當(dāng)于:MessageController messageController = new MessageController();-->
<!--運(yùn)用了反射機(jī)制:MessageController messageController = Class.forName("com.apesource.web.MessageController").newInstance();-->
<beanid="messageControllerBean"class="com.apesource.web.MessageController">
<!--? 1.屬性注入(setter注入)? -->
? ? <propertyname="iMessageService"ref="messageServiceBean"/>
<!--? 2.構(gòu)造注入(構(gòu)造方法注入)? -->
<constructor-argname="iMessageService"ref="messageServiceBean"/>
<constructor-argname="defaultMsg"value="構(gòu)造方法注入創(chuàng)建bean"/>
</bean>
注解的使用
進(jìn)行Bean組件聲明的注解
@Component:組件(使用范圍較大不夠準(zhǔn)確)
@Controller:控制器組件(控制器專用)
@Service:業(yè)務(wù)層組件(業(yè)務(wù)層專用)
@Repository:數(shù)據(jù)訪問(wèn)層組件
進(jìn)行注入裝配時(shí)的聲明注解
Spring自帶的注解
@Autowired:自動(dòng)裝配(默認(rèn)的裝配方式是按照類型)拿愧,按照當(dāng)前聲明的接口類型 ,在容器中查找該接口的實(shí)現(xiàn)類對(duì)象Bean碌尔,來(lái)進(jìn)行自動(dòng)裝配(注入)浇辜。
@Qualifier:按照Bean名稱自動(dòng)裝配券敌,需要和@Autowired注解配合使用。
Java標(biāo)準(zhǔn)注解
@Resource:javax擴(kuò)展包下的注解柳洋,完成自動(dòng)注入待诅,默認(rèn)按照類型自動(dòng)注入,也可以使用name屬性進(jìn)行按名稱自動(dòng)注入熊镣。
示例代碼:
@Controller
publicclassUserController{
@Autowired
@Qualifier("vipUserServiceBean")
@Resource(name="vipUserServiceBean")
privateIUserServiceiUserService;
?
publicvoiduserDosth(){
System.out.println("【web層】使用注解進(jìn)行對(duì)bean的配置");
iUserService.register();
iUserService.login();
iUserService.logout();
?? }
}
兩者比較:@Autowired:最強(qiáng)大卑雁,Spring自己的注解
? @Resource:擴(kuò)展性更強(qiáng),如果切換成另外一個(gè)容器框架轧钓,同樣可以使用序厉,但是@Autowired就不可以