Spring是一個包含眾多工具等Ioc容器
對象這個詞在Spring范圍內(nèi),稱為bean
Spring兩大核心思想
1.IOC ? ? (IOC是控制反轉(zhuǎn),意思是控制權(quán)反轉(zhuǎn)-控制權(quán)(正常是誰用這個對象,誰去創(chuàng)建,)-控制對象的控制權(quán),反轉(zhuǎn)的意思是創(chuàng)建對象的控制權(quán),交給了Spring)
優(yōu)點:解耦合
高內(nèi)聚:一個模塊內(nèi)部的關(guān)系
低耦合:各個模塊之間前的關(guān)系
2.AOP
list/map裝數(shù)據(jù)的容器
tomcat裝的是web的容器
Spring容器,裝的是對象
引入案列(為什么推薦用Spring)
上面代碼的改動成本太大,耦合性太高
如果改成代碼這種,傳遞的是對象,就直接給對象
不采用生成對象,而是你給我什么我就用什么這種,也就是你需要往里面(就像是下面這個圖,在main中傳遞對象。)
IOC幫助我們做這個工作。
Spring可以幫助我們創(chuàng)建對象,可以往里面存,也可以從這個里面取,
我們要做的也就是1.告訴Spring,幫我們創(chuàng)建對象,2.知道如何取出來這些對象
DI是一種實現(xiàn)方式(依賴注入)
@Autowired private BookService bookService;
假如說加上,上面的Autowired就相當(dāng)于下面的這個意思
Autowired:告訴Spring,從容器中取出這個對象,賦值給當(dāng)前對象的屬性
private BookService bookService; public BookController(){ bookService=new BookService(); }
@Component:告訴Spring,幫助我們存儲對象。
@Component public class BookService { @Autowired private BookDao bookDao; // private BookService bookService; // // public BookController(){ // bookService=new BookService(); // } public List<BookInfo> getBookList() { List<BookInfo> bookInfos = bookDao.mockData(); for (BookInfo bookInfo : bookInfos) { if (bookInfo.getStatus() == 1) { bookInfo.setStatusCN("可借閱"); } else { bookInfo.setStatusCN("不可借閱"); } } return bookInfos; } }
MVC提供了注解,前面的RequestMapping。
IOC(依賴對象的創(chuàng)建的控制權(quán),存)一種思想,DI(依賴注入)是一種實現(xiàn)方式
DI是把依賴對象取出來,并且賦給該對象屬性(?。?/p>
DI主要通過兩類注解類型可以實現(xiàn)
IOC提供兩類注解
1.類注解:@Controller,@Service,@Respository,@Component,@Configuration
2.方法注解:@Bean
package com.example.IOCtry; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; //加上Controller才會不報錯,假如不加上Controller就會報錯 //@Controller public class UserController { public void prin(){ System.out.println("春節(jié)快樂"); } }
package com.example.IOCtry; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; @SpringBootApplication public class IoCtryApplication { public static void main(String[] args) { //啟動類是幫助我們啟動spring,這個命令可以返回一個spring //context上下文,就是spring一個運(yùn)行環(huán)境 ApplicationContext context=SpringApplication.run(IoCtryApplication.class, args); //從容器中拿對象 UserController bean=context.getBean(UserController.class); //如果去掉Control注解,就會報錯 bean.prin(); } }
會報這個錯誤,意思是說沒喲拿到bean這個對象
下面這個是getBean的根據(jù)名稱拿一個類(注意:這個的獲取規(guī)范是小駝峰),注意這個返回的是一個Object,所以我們需要對他進(jìn)行類型轉(zhuǎn)換
第三種:根據(jù)名稱和類名拿
public static void main(String[] args) { //啟動類是幫助我們啟動spring,這個命令可以返回一個spring //context上下文,就是spring一個運(yùn)行環(huán)境 ApplicationContext context=SpringApplication.run(IoCtryApplication.class, args); //從容器中拿對象 UserController bean=context.getBean(UserController.class); //如果去掉Control注解,就會報錯 bean.prin(); UserService bean2=context.getBean(UserService.class); bean2.doService(); UserService bean3=(UserService) context.getBean("userService"); bean3.doService(); //根據(jù)名稱和類型獲取bean UserService userService=context.getBean("userService",UserService.class); userService.doService(); } }
??特殊情況:假如類名前兩位(第一位,第二位字母)都是大寫的情況,bean的名稱是類名
常見面試題ApplicationContext ? vs ? ? ?BeanFactory
獲取bean對象,是父類BeanFactory提供的功能
繼承關(guān)系和功能方面來說:Spring容器有兩個頂級的接口:BeanFactory和ApplicationContext.其中BeanFactory提供基礎(chǔ)的訪問容器能力,而ApplicationContext屬于是BeanFactory的子類,他除了繼承了BeanFactory的所有功能之外,他還擁有獨特的特性,國際化支持(中日韓等語言)資源訪問支持,以及事件傳播等方面的支持
從性能方面來說:ApplicationContext是一次性加載并初始化所有的Bean對象,而BeanFactory是需要哪個就去加載哪個,因此會更加清量(空間與時間)
@Service(服務(wù)存儲)和下面使用方法一致
@Repository(倉庫存儲)和control使用方法一致
@Repository public class UserRepository { public void doRepository() { //代碼格式化快捷鍵,crtl+alt+l System.out.println("aini"); } }
UserRepository userRepository=context.getBean(UserRepository.class); userRepository.doRepository();
@Component(組件存儲)和下面用法一致
@Configuration(配置存儲)
// UserRepository userRepository=context.getBean(UserRepository.class); // userRepository.doRepository(); // UserComponent userComponent=context.getBean(UserComponent.class); // userComponent.doComponent(); UserConfig userConfig=context.getBean(UserConfig.class); userConfig.doConfig(); }
package com.example.IOCtry.config; import org.springframework.context.annotation.Configuration; @Configuration public class UserConfig { public void doConfig(){ System.out.println("我也是條狗"); } }
為什么要去分層,假如說都用一個注解不行嗎?-這就跟車牌號一樣,方便管理,也節(jié)約號碼
常見面試題二
常用的注解有哪些?分別是什么作用
web url映射:@RequestMapping
參數(shù)接口和接口響應(yīng):@RequestParam,@RequestBody,@ResponseBody
Bean的存儲:@Controller,@Service,@Repository,@Component,@Configuration,@Bean文章來源:http://www.zghlxwxcb.cn/news/detail-767293.html
Bean的獲取:@Autowired,@Qualifier,@Resource文章來源地址http://www.zghlxwxcb.cn/news/detail-767293.html
到了這里,關(guān)于理解SpringIOC和DI第一課(Spring的特點),IOC對應(yīng)五大注解,ApplicationContext vs BeanFactory的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!