SpringBoot Bean花式注解方法示例上篇
1.XML方式聲明
這里我舉兩個(gè)例子,一個(gè)是自定義的bean,另一個(gè)是第三方bean,這樣會(huì)全面一些。
你還可以定義這個(gè)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
第一種方式配置起來(lái)太復(fù)雜了,而且也不夠靈活。
同樣我也會(huì)拿自定義bean和第三方bean來(lái)舉例子。
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容器中取對(duì)象
public class Dbconfig {
@Bean
public DruidDataSource source(){
DruidDataSource dataSource=new DruidDataSource();
return dataSource;
}
}對(duì)于第三方bean,我們沒(méi)有辦法直接給其加注解,就需要用配置類(lèi)來(lái)書(shū)寫(xiě),其中@Configuration和@Component幾乎一模一樣,不過(guò)其可以通過(guò)參數(shù)來(lái)指定是否生成新的bean對(duì)象還是直接從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í)候可以通過(guò)逗號(hào)來(lái)分割開(kāi)多個(gè)包。
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,沒(méi)有的話就是它的類(lèi)名或者方法名首字母小寫(xiě)。

中間那些我們暫時(shí)不做討論。
Tom就是自定義的bean,dbconfig就是配置類(lèi)的bean,source就是第三方bean。
3.完全注解式
第二種其實(shí)還沒(méi)有完全做到全注解,其在掃描的時(shí)候還是需要書(shū)寫(xiě)xml,還是不夠靈活。
我們需要在掃描的時(shí)候也由注解來(lái)安排。
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容器中取對(duì)象
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文件了耶。
不過(guò)還有個(gè)問(wèn)題,如果就是說(shuō)我們想把一個(gè)比較遠(yuǎn)古的項(xiàng)目以前是xml配置的,現(xiàn)在要改為注解式怎末辦呢?這里有一個(gè)注解。
可以建一個(gè)總的配置類(lèi)。
import org.springframework.context.annotation.ImportResource;
@ImportResource("spring-config.xml")
public class ZConfig {
}小插曲-工廠式定義
這種方式可以在bean被加載前對(duì)其進(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容器中取對(duì)象
public class Dbconfig {
@Bean
public DogFactory dog(){
DogFactory dogFactory = new DogFactory();
return dogFactory;
}
}這種算是比較像第三方bean的加載了,不過(guò)也不完全一樣,它的bean類(lèi)型不是方法的返回值類(lèi)型,而是實(shí)際工廠類(lèi)造出來(lái)的bean類(lèi)型。因?yàn)楣S類(lèi)不會(huì)自己造自己的。
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.簡(jiǎn)化注解@Import
這種方式也是在我們讀源代碼是最常見(jiàn)的一種bean定義方式。
自定義bean,這里無(wú)需使用@Component來(lái)聲明了。
import lombok.Data;
@Data
public class Dog {
}第三方定義的bean,我們也不需要使用@Configuration來(lái)聲明了。
import org.springframework.context.annotation.Import;
@Import({Dbconfig.class,Dog.class})
public class ZConfig {
}這里再導(dǎo)入字節(jié)碼文件時(shí)沒(méi)有路徑,注意導(dǎo)包不要導(dǎo)錯(cuò)。
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);
}
}
}
可以看到最后面的那兩個(gè)就是,前兩個(gè)是類(lèi)對(duì)象,他們也被定義為bean加載進(jìn)IOC容器了,不過(guò)一般不會(huì)使用。
到此這篇關(guān)于SpringBoot Bean花式注解方法示例上篇的文章就介紹到這了,更多相關(guān)SpringBoot Bean注解方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redisson特性及優(yōu)雅實(shí)現(xiàn)示例
這篇文章主要為大家介紹了redisson特性及優(yōu)雅實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
spring @Profiles和@PropertySource實(shí)現(xiàn)根據(jù)環(huán)境切換配置文件
這篇文章主要介紹了spring @Profiles和@PropertySource根據(jù)環(huán)境切換配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring Boot 3.x 集成 Eureka Server/Cl
隨著SpringBoot 3.x版本的開(kāi)發(fā)嘗試,本文記錄了在集成Eureka Server/Client時(shí)所遇到的問(wèn)題和解決方案,文中詳細(xì)介紹了搭建服務(wù)、配置文件和測(cè)試步驟,感興趣的朋友跟隨小編一起看看吧2024-09-09
查找native方法的本地實(shí)現(xiàn)函數(shù)native_function詳解
JDK開(kāi)放給用戶的源碼中隨處可見(jiàn)Native方法,被Native關(guān)鍵字聲明的方法說(shuō)明該方法不是以Java語(yǔ)言實(shí)現(xiàn)的,而是以本地語(yǔ)言實(shí)現(xiàn)的,Java可以直接拿來(lái)用。這里介紹下查找native方法的本地實(shí)現(xiàn)函數(shù)native_function,感興趣的朋友跟隨小編一起看看吧2021-12-12
解決Spring導(dǎo)出可以運(yùn)行的jar包問(wèn)題
最近需要解決Maven項(xiàng)目導(dǎo)入可執(zhí)行的jar包的問(wèn)題,如果項(xiàng)目不包含Spring,那么使用mvn assembly:assembly即可,這篇文章主要介紹了Spring導(dǎo)出可以運(yùn)行的jar包,需要的朋友可以參考下2023-03-03

