1. 程式人生 > >Spring三大核心思想學習筆記

Spring三大核心思想學習筆記

一:控制反轉
**1.**Spring 三個核心思想是什麼:控制反轉,依賴注入和麵向切面程式設計。

**2.**Spring最核心,最基礎的概念是什麼?將spring類比java,java最核心,最基礎的概念就是object了。java中,所有的操作都是針對object的(基礎型別除外),java中,一切皆物件,一切都是object。類比下來,spring中最基礎的概念是bean。在spring中,所以的類都可以認為是一個bean。(個人認為)在spring中的所有檔案,都可以認為是註冊了的bean和未註冊的bean。 spring中所有操作都是針對bean的操作。自然,spring的三大核心思想中操作的物件,也是bean.

3.程式碼講解IOC控制反轉
(1)定義一個介面


public interface IPrint {  
    /**   
    * onLine:  物件需要實現這個方法來實現列印物件的功能 
    * void  返回型別    
    */  
    String printObject();  
}  

(2)實現介面

public class UserBean implements IPrint{  
    @Override  
    public String printObject() {  
        // TODO Auto-generated method stub  
System.out.println("列印物件UserBean:"); return "abc"; } } public class MyBean implements IPrint{ @Override public String printObject() { // TODO Auto-generated method stub System.out.println("列印物件MyBean:"); return null; } }

(3)測試

IPrint print = new UserBean();  
print.printObject(); 

很正常的執行結果(“列印物件UserBean:”)。但是這時候我想修改一下,列印第二個實現類,這時候就需要修改程式碼了,修改程式碼畢竟是不符合開閉原則,又比較麻煩的事,這時候就需要用到spring的控制反轉:對繼承了介面IPrint的具體實現類的具體物件的建立,不依賴於呼叫他的客戶端程式碼,而將控制權交給spring(其實就是xml檔案),這就是控制反轉。

4.控制反轉實現

<?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:tx="http://www.springframework.org/schema/tx"  
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
    http://www.springframework.org/schema/tx  
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
    http://www.springframework.org/schema/aop    
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd   
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
    <!-- 註冊bean --!>  
    <bean id="userBean" class="testSpring.business.bean.UserBean" />  
</beans>  


測試類:

/讀取配置檔案(將配置檔案中的bean載入進記憶體)  
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/testSpring/resources/applicationContext.xml");  
        //獲取的例項    
        IPrint bean=(IPrint)ctx.getBean("userBean");    
        //呼叫方法    
        bean.printObject(); 

如果想要列印另一個實現類,只要修改配置檔案:

<bean id="userBean" class="testSpring.business.bean.MyBean" />  

總結:從spring的控制反轉實現可以看出,客戶端的實現不必去修改程式碼,從而達到了鬆耦合的目的。控制反轉最後就是將主動權交給介面。

二:依賴注入
常用的注入方式有四種:
1. 屬性注入
2. 構造方法注入
3. 工廠方法注入
4. 註解注入

(1)屬性注入

package test;

public class User {
    private String name;
    private String gender;
    public String getName() {
        return name;
    }
    public User(String name, Integer age) {
    this.name = name;
    this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", gender=" + gender + "]";
    }
}

spring.xml檔案配置:

    <bean id="user" class="test.User">
        <property name="name" value="cup"></property>
        <property name="gender" value="man"></property>
    </bean>

測試函式:


public static void main(String args[]){
    ApplicationContext atc = new ClassPathXmlApplicationContext("spring.xml");
    User user = (User) atc.getBean("user");
    System.out.println(user);//print User [name=cup, gender=man]
}

而如果我們把POJO中的getName方法去掉,結果不變,但setName方法刪掉,我們再執行程式,會看到

(2)建構函式注入:
在xml檔案定義Bean:

呼叫測試函式:

public static void main(String args[]){
    ApplicationContext atc = new ClassPathXmlApplicationContext("spring.xml");
    User user = (User) atc.getBean("user1");
    System.out.println(user.getName() + "——" + user.getAge());
    //print cup——25
}

(3)工廠方法注入
i.非靜態工廠方法

先定義工廠類:

    package test;

    public class UserFactory {
        public User createUser(){
           User user = new User("cup",25);
           return user;
        }
    }

進行Bean配置:

<bean id="userFactory" class="test.UserFactory" />
<bean id="user3" factory-bean="userFactory" factory-method="createUser"></bean>

呼叫測試函式:

 public static void main(String args[]){
        ApplicationContext atc = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User) atc.getBean("user3");
        System.out.println(user.getName() +" ——"+ user.getAge() );
        //print cup——25
    }

(4)註解注入

i. 對類成員變數註解

使用@Autowire實現自動注入,格式如:

@Component
public class IdCard{
    .....
}
public class User{
    //Autowired預設按型別注入,@required 表明如果找不到對應的bean則為null,但如果設定為true(也是預設值),則要求一定要找到匹配的bean,否則會丟擲異常。
    //Qualifier常用於容器有一個以上相同型別的Bean,通過指定名字來指定唯一的Bean
    @Autowired(required = false )
    @Qualifier("idCard")
    private IdCard idCard;//也可以將IdCard配置在xml檔案中注入
    .....
}

ii. 對類成員方法進行註解

@Autowired
public void init(@Qualifier(“usar1")User user1,@Qualifier("user2")User user2){
    this.user1 = user1;
    this.user2 = user2;
}