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-11
spring @Profiles和@PropertySource實(shí)現(xiàn)根據(jù)環(huán)境切換配置文件
這篇文章主要介紹了spring @Profiles和@PropertySource根據(jù)環(huán)境切換配置文件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring 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

