SpringBoot Bean花式注解方法示例上篇
1.XML方式聲明
這里我舉兩個例子,一個是自定義的bean,另一個是第三方bean,這樣會全面一些。
你還可以定義這個bean的模式,有單例模式和多例模式,prototype代表多例,singleton代表單例。
<?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 https://www.springframework.org/schema/context/spring-context.xsd"> <bean class="yi.beans.Cat" id="cat" scope="prototype"/> <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource" scope="singleton"/> </beans>
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); String[] names = context.getBeanDefinitionNames(); //獲取所有的beam名字 for (String name : names) { System.out.println(name); } } }
2.注解法@Component
第一種方式配置起來太復(fù)雜了,而且也不夠靈活。
同樣我也會拿自定義bean和第三方bean來舉例子。
import lombok.Data; import org.springframework.stereotype.Component; @Component("Tom") @Data public class Cat { }
注解法也是可以指定id的。
import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = true) //默認(rèn)為true,代表從IOC容器中取對象 public class Dbconfig { @Bean public DruidDataSource source(){ DruidDataSource dataSource=new DruidDataSource(); return dataSource; } }
對于第三方bean,我們沒有辦法直接給其加注解,就需要用配置類來書寫,其中@Configuration和@Component幾乎一模一樣,不過其可以通過參數(shù)來指定是否生成新的bean對象還是直接從IOC容器里面拿原先的。
<?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 https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="yi.beans,yi.config"/> </beans>
掃描的時(shí)候可以通過逗號來分割開多個包。
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); String[] names = context.getBeanDefinitionNames(); //獲取所有的beam名字 for (String name : names) { System.out.println(name); } } }
其中bean的name就是其id,沒有的話就是它的類名或者方法名首字母小寫。
中間那些我們暫時(shí)不做討論。
Tom就是自定義的bean,dbconfig就是配置類的bean,source就是第三方bean。
3.完全注解式
第二種其實(shí)還沒有完全做到全注解,其在掃描的時(shí)候還是需要書寫xml,還是不夠靈活。
我們需要在掃描的時(shí)候也由注解來安排。
import lombok.Data; import org.springframework.stereotype.Component; @Component("miao") @Data public class Cat { }
import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = true) //默認(rèn)為true,代表從IOC容器中取對象 public class Dbconfig { @Bean public DruidDataSource source(){ DruidDataSource dataSource=new DruidDataSource(); return dataSource; } }
import org.springframework.context.annotation.ComponentScan; @ComponentScan({"yi.config","yi.beans"}) public class ZConfig { }
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
可以看到我們現(xiàn)在已經(jīng)完全不需要xml文件了耶。
不過還有個問題,如果就是說我們想把一個比較遠(yuǎn)古的項(xiàng)目以前是xml配置的,現(xiàn)在要改為注解式怎末辦呢?這里有一個注解。
可以建一個總的配置類。
import org.springframework.context.annotation.ImportResource; @ImportResource("spring-config.xml") public class ZConfig { }
小插曲-工廠式定義
這種方式可以在bean被加載前對其進(jìn)行一些操作。
import lombok.Data; @Data public class Dog { }
import org.springframework.beans.factory.FactoryBean; import yi.beans.Dog; public class DogFactory implements FactoryBean<Dog> { @Override public Dog getObject() throws Exception { Dog dog=new Dog(); //可以進(jìn)行一些setter操作 return dog; } @Override public Class<?> getObjectType() { return Dog.class; } @Override public boolean isSingleton() { //是否為單例模式 return true; } }
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import yi.beans.factory.DogFactory; @Configuration(proxyBeanMethods = true) //默認(rèn)為true,代表從IOC容器中取對象 public class Dbconfig { @Bean public DogFactory dog(){ DogFactory dogFactory = new DogFactory(); return dogFactory; } }
這種算是比較像第三方bean的加載了,不過也不完全一樣,它的bean類型不是方法的返回值類型,而是實(shí)際工廠類造出來的bean類型。因?yàn)楣S類不會自己造自己的。
import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import yi.beans.Dog; import yi.config.Dbconfig; public class App1 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(Dbconfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } Dog dog = context.getBean("dog", Dog.class); System.out.println(dog.getClass()); } }
4.簡化注解@Import
這種方式也是在我們讀源代碼是最常見的一種bean定義方式。
自定義bean,這里無需使用@Component來聲明了。
import lombok.Data; @Data public class Dog { }
第三方定義的bean,我們也不需要使用@Configuration來聲明了。
import org.springframework.context.annotation.Import; @Import({Dbconfig.class,Dog.class}) public class ZConfig { }
這里再導(dǎo)入字節(jié)碼文件時(shí)沒有路徑,注意導(dǎo)包不要導(dǎo)錯。
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App1 { public static void main(String[] args) { ApplicationContext context=new AnnotationConfigApplicationContext(ZConfig.class); String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
可以看到最后面的那兩個就是,前兩個是類對象,他們也被定義為bean加載進(jìn)IOC容器了,不過一般不會使用。
到此這篇關(guān)于SpringBoot Bean花式注解方法示例上篇的文章就介紹到這了,更多相關(guān)SpringBoot Bean注解方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redisson特性及優(yōu)雅實(shí)現(xiàn)示例
這篇文章主要為大家介紹了redisson特性及優(yōu)雅實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11spring @Profiles和@PropertySource實(shí)現(xiàn)根據(jù)環(huán)境切換配置文件
這篇文章主要介紹了spring @Profiles和@PropertySource根據(jù)環(huán)境切換配置文件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Spring Boot 3.x 集成 Eureka Server/Cl
隨著SpringBoot 3.x版本的開發(fā)嘗試,本文記錄了在集成Eureka Server/Client時(shí)所遇到的問題和解決方案,文中詳細(xì)介紹了搭建服務(wù)、配置文件和測試步驟,感興趣的朋友跟隨小編一起看看吧2024-09-09查找native方法的本地實(shí)現(xiàn)函數(shù)native_function詳解
JDK開放給用戶的源碼中隨處可見Native方法,被Native關(guān)鍵字聲明的方法說明該方法不是以Java語言實(shí)現(xiàn)的,而是以本地語言實(shí)現(xiàn)的,Java可以直接拿來用。這里介紹下查找native方法的本地實(shí)現(xiàn)函數(shù)native_function,感興趣的朋友跟隨小編一起看看吧2021-12-12解決Spring導(dǎo)出可以運(yùn)行的jar包問題
最近需要解決Maven項(xiàng)目導(dǎo)入可執(zhí)行的jar包的問題,如果項(xiàng)目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下2023-03-03