Spring Bean的定義及三種創(chuàng)建方式
定義
Spring bean 對(duì)象是構(gòu)成應(yīng)用程序的支柱,也是由 Spring IoC 容器管理的。bean 是一個(gè)被實(shí)例化,組裝,并通過(guò) Spring IoC 容器所管理的對(duì)象。這些 bean 是由用容器提供的配置元數(shù)據(jù)創(chuàng)建的。
創(chuàng)建Bean
基于XML配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ? ? ? ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ? ? ? ?xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd"> ? ? <bean id="beanDemoJay" class="demo.BeanDemoJay"/> </beans>
基于注解掃描的配置
從 Spring 2.5 開(kāi)始就可以使用注解來(lái)配置依賴注入,在可以使用基于注解的配置之前,我們將需要在我們的 Spring 配置文件中啟用它。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ? ? ? ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ? ? ? ?xmlns:context="http://www.springframework.org/schema/context" ? ? ? ?xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd ? ? ? ?http://www.springframework.org/schema/context ? ? ? ?http://www.springframework.org/schema/context/spring-context.xsd"> ? ? <!-- 開(kāi)啟基于注解的配置 --> ? ? <context:annotation-config/> ? ? <!-- bean definitions go here --> </beans>
當(dāng)開(kāi)啟后,將可以在代碼上使用注解,這表明 Spring 應(yīng)該自動(dòng)連接值到屬性,方法和構(gòu)造函數(shù)。如下是常用的注解:
| 序號(hào) | 說(shuō)明 |
|---|---|
| 1 | @Required 注解應(yīng)用于 bean 屬性的 setter 方法。 |
| 2 | @Autowired 注解可以應(yīng)用到 bean 屬性的 setter 方法,非 setter 方法,構(gòu)造函數(shù)和屬性。 |
| 3 | @Qualifier通過(guò)指定確切的將被連線的 bean,@Autowired 和 @Qualifier 注解可以用來(lái)刪除混亂。 |
| 4 | JSR-250 AnnotationsSpring 支持 JSR-250 的基礎(chǔ)的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。 |
基于Java的配置
基于 Java 的配置,可以使你在不用配置 XML 的情況下編寫(xiě)大多數(shù)的 Spring,主要通過(guò) @Configuration 和 @Bean 等注解。
| 注解 | 說(shuō)明 |
|---|---|
| @Component | 最普通的一個(gè)注解,一般用于把普通pojo實(shí)例化到spring容器中。@Controller 和 @Service 和@Repository 是它的特殊情況,只是作為一個(gè)普通的類,不需要特殊歸類時(shí),比較適合采用@Component注解。 |
| @Controller | 用于標(biāo)注控制層,表示向控制層注入服務(wù)層的數(shù)據(jù) |
| @Service | 用于標(biāo)注服務(wù)層,來(lái)進(jìn)行業(yè)務(wù)的邏輯處理,在服務(wù)層注入DAO層數(shù)據(jù) |
| @Repository | 用于標(biāo)注數(shù)據(jù)訪問(wèn)層,也可以說(shuō)用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件 |
| @Configuration | 用于定義配置類,可替換xml配置文件,也可以理解為Spring配置文件當(dāng)中的上下文。 |
依附于@Configuration的注解
@Bean 創(chuàng)建Deom
@Configuration
public class Demo {
@Bean
public Demo demo(){
return new Demo();
}
}@Import 創(chuàng)建Cofing
@Configuration
@Import(Config.class)
public class Demo {
}@Import.ImportSelector 選擇器,傳入@Import注解所在類Demo上所有的注解信息,返回要導(dǎo)入的類名
@Configuration
@Import(ImportSelector_.class)
public class Demo {
}
public class ImportSelector_ implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.spring.demo.beanlifecycle.Demo"};
}
}@Impport.ImportBeanDefinitionRegistrar Bean定義注冊(cè)器,傳入@Import注解所在類Demo上所有的注解信息:
Mybatis的Mapper接口就是用這種方式將Bean定義注冊(cè)到Spring上下文的
@Configuration
@Import(ImportBeanDefinitionRegistrar_.class)
public class Demo {
}
public class ImportBeanDefinitionRegistrar_ implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Bean.class).setInitMethodName("init").setDestroyMethodName("destroy").getBeanDefinition();
registry.registerBeanDefinition("bean", beanDefinition);
System.out.println("registerBeanDefinitions: " + beanDefinition);
}
}FactoryBean
當(dāng)通過(guò)“factoryBean”獲取實(shí)例時(shí),F(xiàn)actoryBean會(huì)調(diào)用getObject()方法;
當(dāng)通過(guò)“&factoryBean”獲取實(shí)例時(shí),返回FactoryBean的實(shí)例;
當(dāng)通過(guò)Demo.class來(lái)獲取bean實(shí)例時(shí),調(diào)用factoryBean的getObjectTyoe()來(lái)獲取類型。
@Configuration
public class Demo {
@Bean
public FactoryBean_ factoryBean(){
return new FactoryBean_();
}
}
public class FactoryBean_ implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Demo();
}
@Override
public Class<?> getObjectType() {
return Demo.class;
}
}到此這篇關(guān)于Spring Bean的定義及三種創(chuàng)建方式的文章就介紹到這了,更多相關(guān)Spring Bean定義及創(chuàng)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring Boot 使用Spring security 集成CAS
本篇文章主要介紹了詳解Spring Boot 使用Spring security 集成CAS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
SpringBoot注冊(cè)Servlet的三種方法詳解
這篇文章主要介紹了SpringBoot注冊(cè)Servlet的三種方法詳解,教你如何Spring Boot 注冊(cè) Servlet、Filter、Listener,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
解決java轉(zhuǎn)義json出現(xiàn)\u0000 等亂碼的問(wèn)題
這篇文章主要介紹了解決java轉(zhuǎn)義json出現(xiàn)\u0000 等亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法
這篇文章主要介紹了idea導(dǎo)入項(xiàng)目不顯示maven側(cè)邊欄的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
詳解Mybatis 傳遞參數(shù)類型為L(zhǎng)ist的取值問(wèn)題
這篇文章主要介紹了詳解Mybatis 傳遞參數(shù)類型為L(zhǎng)ist的取值問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java如何獲取@TableField,@TableName注解的值
這篇文章主要介紹了Java如何獲取@TableField,@TableName注解的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringBoot部署到外部Tomcat無(wú)法注冊(cè)到Nacos服務(wù)端的解決思路
這篇文章主要介紹了SpringBoot部署到外部Tomcat無(wú)法注冊(cè)到Nacos服務(wù)端,本文給大家分享完美解決思路,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-03-03
SpringBoot項(xiàng)目Web攔截器使用的多種方式
在Spring?Boot應(yīng)用中,Web攔截器(Interceptor)是一種用于在請(qǐng)求處理的不同階段執(zhí)行自定義邏輯的機(jī)制,下面給大家介紹SpringBoot項(xiàng)目Web攔截器使用的多種方式,感興趣的朋友一起看看吧2025-05-05

