<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
談Bean的潛臺詞是在說Spring中的Bean,我們都知道Spring中的BeanFactory,而Bean這個概念也是由此而來。在Spring中,只要一個類能被範例化,並被Spring容器管理,這個類就稱為一個Bean,或者SpringBean.
除此之外,我們還聽到一些其他的詞:
JavaBean、POJO、VO、DTO
這些叫法又是什麼意思?使用的場景又是什麼?
JavaBean
一個JavaBean是一個遵循Sun公司JavaBean規範的類。JavaBean可以理解為java中可以複用的元件,它滿足下面條件:
POJO(Plain Ordinary Object )
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等。用來表示對實體的對映,或表的對映。一般可以這樣做來規範開發:
用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註解,進行注入。
好了,現在我們終於把想要的元件交給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;
表示當前類可以用作組態檔使用
可以在這個類中使用@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這個註解
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45