SpringBoot對不同Bean註解的差別和使用場景是什麼
對不同Bean註解的差異和使用場景
什麼是Bean?
談Bean的潛台詞是在說Spring中的Bean,我們都知道Spring中的BeanFactory,而Bean這個概念也是由此而來。在Spring中,只要一個類別能被實例化,並被Spring容器管理,這個類別就稱為一個Bean,或者SpringBean.
除此之外,我們還聽到一些其他的詞:
JavaBean、POJO、VO、DTO
這些叫法又是什麼意思?使用的場景又是什麼?
JavaBean
一個JavaBean是遵循Sun公司JavaBean規格的類別。 JavaBean可以理解為java中可以重複使用的元件,它滿足下面條件:
有一個公共的缺省建構方法
- ##這個類別的屬性使用getter和setter來訪問,並且命名遵從標準的規範
- 這個類別可以序列化
POJO是歷史遺留名稱,為什麼這樣講?因為POJO是用來指明該物件不同於Entity Beans
EntityBeans是EJB中的概念,而EJB在Spring出現後,就漸漸淡出了歷史的舞台。所以,當POJO在Martin Fowler提出時,就是指那些沒有實作任何EJB介面的普通java類別。而延用至今,嚴格講,所有的java類,都是POJO,因為現在沒有人在使用ejb這些老古董了。但是有時我們為了區分Spring Bean,可以將沒有被Spring管理的類別稱為POJO。
VO (Value Object)VO指一個物件例如 java.lang.Integer 它持有一些數據,或資料物件。這個概念是 Martin Fowler企業應用架構中提出的概念。
DTO(Data Transfer Object)DTO也是EJB種提出的概念,目的就是在資料傳輸時,透過直接傳輸對象,在網路中傳輸數據。
小結:所以對我們而言,VO和DTO沒有區別(但是Martin Fowler可能用它們表示了不同的細分概念),而大多數時候,它們遵循JavaBean規範,所以它們也都是JavaBean。當然,它們都是POJO。
可以看出,它們本質上都是在指一個java對象,為了區分場景和功能,有了不同的叫法。開發中有時也會出現,Entity, Domain等。用來表示對實體的映射,或表的映射。一般可以這樣做來規範開發:
- 對於Spring管理的對象,稱為Bean
- 對應到資料表的物件實體類,稱為entity,放在entity目錄
- 對於介面用於封裝數據,例如接受一個json入參,為了方便,定義一個物件封裝參數,可以叫dto (或pojo)放在pojo包,以表示它不是某個表的映射類別。
- 註解@Bean @Component …等都有什麼差別?
用SpringBoot開發應用程式時,我們會用註解將物件交給Spring容器管理。這些註解包括:
@Component ,@Service, @Bean, @Controller ,@Repository
這些註解本質上,都是Spring標識,用來進行Bean的自動偵測。標註這些註解的類別會被Spring容器管理。
那為何要有這些分類,為何不使用一個註解就來搞定所有的工作?
首先這幾個註解根據語意,用在不同的層次
- @Componet
一般的元件
- @Service
是Service層元件
- #@Bean
這個要和@Configuration一塊使用,後邊再說
- #@Controller
是用在SpringMVC控制層
- #@Repository
是資料存取層
Spring這樣設計,是因為,這些註解不光是要做自動偵測。同時有不同的功能,例如@Repository註解,Spring會增加增強處理,進行相關的異常處理。
@Controller的bean會處理網路請求相關邏輯。所以你給所有的Bean都標註同一個註解,確實都會注入Spring容器,但是功能可能就會失效。
而且隨著Spring版本升級,可能會增加更多差異化處理。所以我們應該按照規範來註解。
再說到@Bean,我們知道Spring早期,還是透過xml配置Bean例如:
<?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"> <bean id="operations" class="com.howtodoinjava.spring.beans.Operations"></bean> <bean id="employee" class="com.howtodoinjava.spring.beans.Employee"></bean> </beans>
現在,你可以理解@Configuration註解的類別就是一個xml設定文件,中間@Bean註解是xml中的bean節點
@Configuration public class BeanConfiguration { @Bean public Operations operation(){ return new Operations(); } @Bean public Employee employee(){ return new Employee(); } }
這兩種方式都是將@Bean註解回傳值注入Spring容器。 SpringBoot在啟動時,會掃描@Configuration註解,進行注入。
SpringBoot注入物件衝突如何解決?
好了,現在我們終於把想要的元件交給Spring容器管理。我們該如何使用?
我們可以用Spring上下文,取得需要的物件
public static void main(String[] args) { ApplicationContext application = SpringApplication.run(ConsumerApplication.class, args); application.getBean(Employee.class); }
一般我們用@Autowire 註解,取得容器中的bean
@Autowire private Employee employee;
有時我們在容器中需要注入一個類別的多個實例,以滿足需求。
比如一个接口的实现类有两个,如果直接通过@Component注入容器,则会报错。
如何区分?
@Component("bean01") public class Bean01 implement AA{ } @Component("bean02") public class Bean02 implement AA{ }
没错,通过在注解中标识一个名称,来区分该对象的不同实例。
获取时:最终会初始化一个Bean01
@Autowire @Qualifier("bean01") private AA a;
这样有个问题,就是每次使用都需要显示声明@Qualifier来指定。有的场景下,我们可能想默认使用一个,其他情况再显式指定。这就涉及到@Primary
在注解时,标注了@Primary的Bean在没有指定的情况下,会默认加载。
比如:
@Component @Primary public class Bean01 implement AA{ } @Component("bean02") public class Bean02 implement AA{ }
使用时: 默认初始化的就是Bean01
@Autowire private AA a;
SpringBoot的各种注解
@Configuration
表示当前类可以用作配置文件使用
可以在这个类中使用@bean注解来创建对象(类似于单例模式的饿汉式)。
方法中需要有返回值+使用new这个关键字
spring会把这个返回值放入spring容器中;
在后面的方法中如果要调用这个方法(@bean中有个属性name,命名name的值,在后面的@resource中使用使用按照名称注入)没有使用name这个属性的话,默认情况下@bean方法的方法名;
@importResource
:用来导入xml文件,xml文件里面也是声明java对象,同样也是导入到spring容器中@propertySource
:用来导入property文件
可以和@value一起使用,@value来用读取property文件的内容;
@componentScan
:用来指定扫描注解的位置,扫描把扫描到的注解生成对象放入spring容器中,
属性:basePackage:指定扫描到包的位置
默认情况下是扫描当前包和子包的位置
@SpringBootApplication
由三个主要注解组合而成:@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan
@SpringBootCOnfiguration
:表示这个类可以作为配置类使用;@EnableAutoConfiguration
:启动自动注入,把java文件配置好,直接注入到Spring容器中;@ComponentScan
:表示文件下的注解,用来创建对象@ConfigurationProperties
:使用在java类上,表示使用K-V自动注入到对应的java属性上,
参数prefix:把properties文件中对应的前缀.后面的属性对应到properties文件的属性中(使用在类上,所以在属性上可以自动赋值)
和@value是两种用法
@controller、@service、@Repository、@component
这些注解使用在java类上,componentScan会扫描这些完成对象的创建
@controller
使用在控制层,完成接收请求参数,调用service层完成用户的请求,返回视图层给用户;@Service
:业务层的逻辑,调用dao层完成用户对数据库的操作,将处理结果返回给controller;@Repository
:使用对数据库进行持久化操作(保证用户的数据可以写入到数据库中),将处理结果返回给service层
##在SpringBoot中使用@mapper代替这个注解。用来告诉mybatis创建这个对象的动态代理对象
##@mapperScan(basePackage:指定的mapper文件的路径),使用在主启动类上,省的一个一个dao层都要使用到@mapper
@component
:用来创建对象,但是对象没有前面三个有特殊的功能@transaction
:表示开启事务(一般使用在service层)有五个参数
1、传播行为 2、隔离级别 3、超时行为 4、回滚规则 5、是否只读
@RestController = @responseBody+@controller
使用在类上:表示这个类是控制层,而且类中的所有方法加上@responseBody这个注解
以上是SpringBoot對不同Bean註解的差別和使用場景是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Jasypt介紹Jasypt是一個java庫,它允許開發員以最少的努力為他/她的專案添加基本的加密功能,並且不需要對加密工作原理有深入的了解用於單向和雙向加密的高安全性、基於標準的加密技術。加密密碼,文本,數字,二進位檔案...適合整合到基於Spring的應用程式中,開放API,用於任何JCE提供者...添加如下依賴:com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1Jasypt好處保護我們的系統安全,即使程式碼洩露,也可以保證資料來源的

使用場景1、下單成功,30分鐘未支付。支付超時,自動取消訂單2、訂單簽收,簽收後7天未進行評估。訂單超時未評價,系統預設好評3、下單成功,商家5分鐘未接單,訂單取消4、配送超時,推播簡訊提醒…對於延時比較長的場景、即時性不高的場景,我們可以採用任務調度的方式定時輪詢處理。如:xxl-job今天我們採

一、Redis實現分散式鎖原理為什麼需要分散式鎖在聊分散式鎖之前,有必要先解釋一下,為什麼需要分散式鎖。與分散式鎖相對就的是單機鎖,我們在寫多執行緒程式時,避免同時操作一個共享變數產生資料問題,通常會使用一把鎖來互斥以保證共享變數的正確性,其使用範圍是在同一個進程中。如果換做是多個進程,需要同時操作一個共享資源,如何互斥?現在的業務應用通常是微服務架構,這也意味著一個應用會部署多個進程,多個進程如果需要修改MySQL中的同一行記錄,為了避免操作亂序導致髒數據,此時就需要引入分佈式鎖了。想要實現分

springboot讀取文件,打成jar包後訪問不到最新開發出現一種情況,springboot打成jar包後讀取不到文件,原因是打包之後,文件的虛擬路徑是無效的,只能通過流去讀取。文件在resources下publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

在Springboot+Mybatis-plus不使用SQL語句進行多表添加操作我所遇到的問題準備工作在測試環境下模擬思維分解一下:創建出一個帶有參數的BrandDTO對像模擬對後台傳遞參數我所遇到的問題我們都知道,在我們使用Mybatis-plus中進行多表操作是極其困難的,如果你不使用Mybatis-plus-join這一類的工具,你只能去配置對應的Mapper.xml文件,配置又臭又長的ResultMap,然後再寫對應的sql語句,這種方法雖然看上去很麻煩,但具有很高的靈活性,可以讓我們

SpringBoot和SpringMVC都是Java開發中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個框架的特點和用途,並對它們的差異進行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團隊開發的,它旨在簡化基於Spring框架的應用程式的建立和部署。它提供了一種快速、輕量級的方式來建立獨立的、可執行

1.自訂RedisTemplate1.1、RedisAPI預設序列化機制基於API的Redis快取實作是使用RedisTemplate範本進行資料快取操作的,這裡開啟RedisTemplate類,查看該類別的源碼資訊publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations,BeanClassLoaderAware{//聲明了value的各種序列化方式,初始值為空@NullableprivateRedisSe

在專案中,很多時候需要用到一些配置信息,這些信息在測試環境和生產環境下可能會有不同的配置,後面根據實際業務情況有可能還需要再做修改。我們不能將這些設定在程式碼中寫死,最好是寫到設定檔中,例如可以把這些資訊寫到application.yml檔案中。那麼,怎麼在程式碼裡取得或使用這個位址呢?有2個方法。方法一:我們可以透過@Value註解的${key}即可取得設定檔(application.yml)中和key對應的value值,這個方法適用於微服務比較少的情形方法二:在實際專案中,遇到業務繁瑣,邏
