每日熱聞!狂神說 spring5

2022-12-15 18:14:59 來源:51CTO博客

Spring 5

1.1、 簡介

Spring: 春----->給軟件行業帶來了春天!2002, 首次推出了Spring框架的雛形: interface21框架!Spring框架即以interface21框架為基礎,經過重新設計 ,并不斷豐富其內涵,于2004年月24日發布了1.0正式版。Rod Johnson,, Spring Framework創始人, 著名作者。他是悉尼大學的博士,然而他的專業不是計算機,而是音樂學。SSH: Struct2 + Spring + Hibernate!SSM: SpringMvc + Spring + Mybatis!

官網


(資料圖片)

下載地址:??https://repo.spring.io/ui/native/release/org/springframework/spring??

GitHub:??https://github.com/spring-projects/spring-framework??

1.2、優點

Spring是一個開源的免費的框架(容器) !Spring是一個輕量級的、 非入侵式的框架!控制反轉(IOC) ,面向切面編程(AOP) !支持事務的處理,對框架整合的支持!

總結一-句話: Spring就是一 一個輕量級的控制反轉(IOC)和面向切面編程(AOP)的框架!

1.3、組成

1.4、拓展

●Spring Boot。一個快速開發的腳手架。。基于SpringBoot可以快速的開發單個微服務。。約定大于配置!●Spring Cloud。SpringCloud 是基于SpringBoot實現的。

因為現在大多數公司都在使用SpringBoot進行快速開發,學習SpringBoot的前提, 需要完全掌握Spring及SpringMVC!承上啟下的作用!|

弊端:發展了太久之后,違背了原來的理念!配置十分繁瑣,人稱:”配置地獄!

2、IOC理論推導

UserDao接口UserDaolmpl實現類UserService業務接口UserServicelmpl業務實現類

在我們之前的業務中,用戶的需求可能會影響我們原來的代碼,我們需要根據用戶的需求去修改原代碼!如果程序代碼量十分大,修改一-次的成本代價十分昂貴!

我們使用一個Set接口實現.已經發生了革命性的變化!

//set注入    public void setUserDao(UserDao userDao) {        this.userDao = userDao;    }

beans.xml

                                      

●之前,程序是主動創建對象!控制權在程序猿手.上!●使用了set注入后,程序不再具有主動性,而是變成了被動的接受對象!

這種思想,從本質上解決了問題,我們程序猿不用再去管理對象的創建了。系統的耦合性大大降低~,可以更加專注的在業務的實現上!這是IOC的原型!

IoC本質控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實現loC的一種方法,也有人認為DI只是IOC的另一種說法。 沒有IoC的程序中,我們使用面向對象編程, 對象的創建與對象間的依賴關系完全硬編碼在程序中,對象的創建由程序自己控制,控制反轉后將對象的創建轉移給第三方,個人認為所謂控制反轉就是:獲得依賴對象的方式反轉了。

采用XML方式配置Bean的時候,Bean的定義信息是和實現分離的,而采用注解的方式可以把兩者合為一-體,Bean的定義信息直接以注解的形式定義在實現類中,從而達到了零配置的目的。

控制反轉是一種通過描述(XML或注解)并通過第三方去生產或獲取特定對象的方式。在Spring中實現控制反轉的是IoC容器,其實現方法是依賴注入(Dependency Injection,DI)。

3、HelloSpring

4、IOC創建對象的方式

使用無參構造創建對象,默認!???https://docs.spring.io/spring-framework/docs/5.2.0.RELEASE/spring-framework-reference/core.html#beans-constructor-injection??假設我們要使用有參構造創建對象。下標賦值
            官網        
類型
        
第三種 直接通過參數名
                

總結:在配置文件加載的時候,容器中管理的對象就已經初始化了! 就是在一個容器里

5、spring配置

5.1、別名

5.2、Bean的配置

    

5.3、import

這個import, - 般用于團隊開發使用,他可以將多個配置文件,導入合并為一個

假設,現在項目中有多個人開發,這三個人復制不同的類開發,不同的類需要注冊在不同的bean中,我們以利用import將所有人的beans.xml合并為一個總的!

張三李四王五applicationContext.xml
        

6、DI 依賴注入

6.1、構造器駐入

6.2、Set注入【重點】

依賴注入:set注入依賴:bean對象的創建依賴于容器注入bean對象種的所有屬性,由容器來注入

【環境搭建】

復雜類型
public class Address {    private String address;    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }}
真是測試對象
public class Student {    private String name;    private Address address;    private String[] books;    private List hobby;    private Map card;    private Set dames;    private String wife;    private Properties info;
beans.xml
                
測試類
public class DiTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        Student student = (Student) context.getBean("student");        System.out.println(student.getName());    }}
完善注入信息
                                                                西游記                紅樓夢                水滸傳                三國演義                                                        吃飯                睡覺                打豆豆                                                                                                                                                                LOL                4399                7k7k                                                                                    20200225                mink                boy                        
public class DiTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        Student student = (Student) context.getBean("student");        System.out.println(student.getName());        System.out.println(student.toString());    }}//輸出//Student{name="mink", address=Address{address="null"}, books=[西游記, 紅樓夢, 水滸傳, 三國演義], hobby=[吃飯, 睡覺, 打豆豆], card={身份證=4105261111111, 銀行卡=888888888888888, =}, dames=[LOL, 4399, 7k7k], wife="null", info={學號=20200225, 性別=boy, 姓名=mink}}

6.3、拓展方式注入

                

6.4、bean的作用域

單例模式(Spring默認機制)
從一個里面創建的
User user = context.getBean("user2", User.class);    User user2 = context.getBean("user2", User.class);    System.out.println(user==user2);//true
原型模式(每次從容器中get的時候就會產生一個 新對象)
User user = context.getBean("user2", User.class);User user2 = context.getBean("user2", User.class);System.out.println(user==user2);//false

3.其余的request、session、 application、 這些個只能在web開發中使用到!

7、bean的自動裝配

自動裝配是Spring滿足bean依賴一種方式!Spring會在上下文中自動尋找,并自動給bean裝配屬性!

在Spring中有三種裝配的方式1.在xml中顯示的配置2.在java中顯示配置3.隱式的自動裝配bean [ 重要]

7.1、測試

環境搭建 一個人由兩個寵物

7.2、ByName自動裝配

                

7.3、ByType自動裝配

    

\小結:●byname的時候,需要保證所有bean的id唯一 , 并且這個bean需 要和自動注入的屬性的set方法的值-致!●bytype的時候,需要保證所有bean的class唯一 , 并且這個bean需要和自動注入的屬性的類型一致!

7.4、使用注解自動裝配

jdk1 .5支持的注解,Spring2.5就支持注解了 !The introduction of annotation-based configuration raised the question of whether this approach is better"than XML.要使用注解須知:

導入約束 context約束配置注解的支持 注解的支持【重點】
        

@AutoWired直接在屬性上使用即可!也可以在set方式上使用!使用Autowired我們可以不用編寫Set方法了,前提是你這個自動裝配的屬性在I0C (Spring) 容器中存在,且符合名字byname!

科普

@Nullable 字段標記了這個注解  說明這個字段可以為null
public @interface Autowired {    boolean required() default true;}

測試

public class People {    //如果顯示定義了Autowi red的requi red屬性為false,說明這個對象可以為nu11,否則不允許為空    private String name;    @Autowired    private Dog dog;    @Autowired    private Cat cat;

如果@Autowired自動裝配的環境比較復雜,自動裝配無法通過一一個注解[ @Autowired ]完成的時候、我們可以使用@Qualifier(value="xxx")去配合@Autowired的使用,指定一個唯一 -的bean對象注入!

@Qualifier 注解

@Resource 注解

小結:@Resource和@ Autowired的區別:●都是用來自動裝配的,都可以放在屬性字段上●@ Autowired通過bytype的方式實現,而且必須要求這個對象存在! [常用]●@Resource默認通過byname的方式實現,如果找不到名字,則通過byType實現!如果兩個都找不到的情況下,就報錯! [常用]

8、使用注解開發

在Spring4之后,要使用注解開發,必須要保證aop的包導入了

使用注解需要導入context約束,增加注解的支持!

        
bean屬性如何注入
@Componentpublic class User {    //相當于    @Value("value 注入")    public String name="mink";
衍生的注解@Conponent有幾個衍生注解,在web開發中 會按照三層mvc架構分dao【@Repository】service【@service】controller【@controller】這四個注解功能都是一樣的,都代表被這個類裝配到spring中 裝配bean自動裝配置@Autowired :自動裝配通過類型。名字如果Autowi red不能唯一自 動裝配上屬性,則需要通過@Qualifier(value="xxx")@Nu11able字段標記了這個注解,說明這個字段可以為nu11;@Resource :自動裝配通過名字。類型。作用域@Scope小結xml與注解xml更加萬能,適用于任何場合 維護簡單方便注解 不是自己的類使用不了 維護相對復雜xml與注解最佳實踐:xml用來管理bean注解只負責完成屬性的注入我們在使用的過程中,只需要注意一個問題:必須要注解生效,開啟注解支持

9、使用Java的方式配置Spring

p15

10、代理模式

中介;

這就是SpringAop的底層【SpringAop 和 SPringMVC】

代理模式的分類:

靜態模式動態模式

10.1、靜態代理

角色分析:●抽象角色:一般會使用接口或者抽象類來解決●真實角色:被代理的角色●代理角色:代理真實角色,代理真實角色后,我們一般會做- -些附屬操作●客戶:訪問代理對象的人!

代碼步驟:1.接口2.真實角色3.代理角色4.客戶端訪問代理角色

代理模式的好處:●可以使真實角色的操作更加純粹!不用去關注一些公共的業務●公共也就就交給代理角色!實現了業務的分工! .●公共業務發生擴展的時候,方便集中管理!缺點:●一個真實角色就會產生一個代理角色;代碼量會翻倍開發效率會變低

10.2、 加深理解

10.3、動態代理

●動態代理和靜態代理角色- -樣●動態代理的代理類是動態生成的,不是我們直接寫好的!動態代理分為兩大類:基于接口的動態代理,基于類的動態代理。基于接口-- JDK動態代理[我們在這里使用]。基于類: cglib。java字節碼實現: javasist

需要了解兩個類: Proxy: 代理,InvocationHandler: 調用處理程序

標簽: 自動裝配 創建對象

上一篇:環球今日訊![ Linux ] 線程獨立棧,線程分離,Linux線程互斥
下一篇:Verilog 的連續賦值