
官網
(資料圖片)
下載地址:??https://repo.spring.io/ui/native/release/org/springframework/spring??
GitHub:??https://github.com/spring-projects/spring-framework??
總結一-句話: Spring就是一 一個輕量級的控制反轉(IOC)和面向切面編程(AOP)的框架!
●Spring Boot。一個快速開發的腳手架。。基于SpringBoot可以快速的開發單個微服務。。約定大于配置!●Spring Cloud。SpringCloud 是基于SpringBoot實現的。
因為現在大多數公司都在使用SpringBoot進行快速開發,學習SpringBoot的前提, 需要完全掌握Spring及SpringMVC!承上啟下的作用!|
弊端:發展了太久之后,違背了原來的理念!配置十分繁瑣,人稱:”配置地獄!
在我們之前的業務中,用戶的需求可能會影響我們原來的代碼,我們需要根據用戶的需求去修改原代碼!如果程序代碼量十分大,修改一-次的成本代價十分昂貴!
我們使用一個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)。
類型官網
第三種 直接通過參數名
總結:在配置文件加載的時候,容器中管理的對象就已經初始化了! 就是在一個容器里
這個import, - 般用于團隊開發使用,他可以將多個配置文件,導入合并為一個
假設,現在項目中有多個人開發,這三個人復制不同的類開發,不同的類需要注冊在不同的bean中,我們以利用import將所有人的beans.xml合并為一個總的!
張三李四王五applicationContext.xml【環境搭建】
復雜類型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 Listbeans.xmlhobby; private Map card; private Set dames; private String wife; private Properties info;
測試類
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}}
從一個里面創建的
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開發中使用到!
在Spring中有三種裝配的方式1.在xml中顯示的配置2.在java中顯示配置3.隱式的自動裝配bean [ 重要]
環境搭建 一個人由兩個寵物
\小結:●byname的時候,需要保證所有bean的id唯一 , 并且這個bean需 要和自動注入的屬性的set方法的值-致!●bytype的時候,需要保證所有bean的class唯一 , 并且這個bean需要和自動注入的屬性的類型一致!
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實現!如果兩個都找不到的情況下,就報錯! [常用]
在Spring4之后,要使用注解開發,必須要保證aop的包導入了
使用注解需要導入context約束,增加注解的支持!
bean屬性如何注入
@Componentpublic class User { //相當于衍生的注解@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注解只負責完成屬性的注入我們在使用的過程中,只需要注意一個問題:必須要注解生效,開啟注解支持@Value("value 注入") public String name="mink";
p15
中介;
這就是SpringAop的底層【SpringAop 和 SPringMVC】
代理模式的分類:
靜態模式動態模式角色分析:●抽象角色:一般會使用接口或者抽象類來解決●真實角色:被代理的角色●代理角色:代理真實角色,代理真實角色后,我們一般會做- -些附屬操作●客戶:訪問代理對象的人!
代碼步驟:1.接口2.真實角色3.代理角色4.客戶端訪問代理角色
代理模式的好處:●可以使真實角色的操作更加純粹!不用去關注一些公共的業務●公共也就就交給代理角色!實現了業務的分工! .●公共業務發生擴展的時候,方便集中管理!缺點:●一個真實角色就會產生一個代理角色;代碼量會翻倍開發效率會變低
●動態代理和靜態代理角色- -樣●動態代理的代理類是動態生成的,不是我們直接寫好的!動態代理分為兩大類:基于接口的動態代理,基于類的動態代理。基于接口-- JDK動態代理[我們在這里使用]。基于類: cglib。java字節碼實現: javasist
需要了解兩個類: Proxy: 代理,InvocationHandler: 調用處理程序