1. 程式人生 > >SSM框架之Spring-IoC和DI的理解與三種常用注入方式

SSM框架之Spring-IoC和DI的理解與三種常用注入方式

SSM 框架學習 (Spring篇)

一、IoC和DI

IoC(Inversion of Control)控制反轉Spring兩大核心之一,是一種不同於傳統的設計思想。

那何來控制反轉一說呢?我們先看傳統的Java程式設計,當我們一個類內部需要一個物件資源時,通常是主動在內部new建立這個物件,是程式主動建立依賴物件的。

而IoC是有一個專門的容器來管理物件(資源)的建立的,當一個類需要其他物件時,是由IoC容器建立提供的,此時控制權實在IoC容器上的,所以控制反轉了。

就好比你需要絞盡腦汁的尋找自己心儀的物件,變成了物件是由國家分配的,不用你主動尋找,你只需擺好姿勢接收就行了。

那問題又來了!DI(Dependency Injection)依賴注入又是什麼?似乎跟IoC很容易弄混!(沒錯,我開始就很混亂!)

其實IoC和DI是同一設計思想的不同角度的解讀。這麼說吧,IoC是設計目的,DI則是實現的手段,所以DI是Spring中實現IoC的主要機制或者說方式。

二、注入方式

注入方式有很多種,下面我會把我所學過的注入方式一一列舉。

1.構造方式注入
這裡只有一個類Greeting.java,測試類略~

public class Greeting {

    private String name = "Nobody";

    private String words = "Nothing"
; public Greeting() {} // 建議新增無參構造 /** * 注入name和words * @param name * @param words */ public Greeting(String name, String words) { this.name=name; this.words=words; } public void sayGreeting() { System.out.println(name + "說:”" + words + "”"
); } }

主要配置

<!-- 注入當沒有index屬性時引數從上至下順序匹配,所以此處index可以省略,type也可省略,物件注入寫法相同。 -->
<bean id="mSay" class="com.lsl.ssm.service.Greeting">
    <constructor-arg index="0" type="String">
        <value>馬雲</value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>我根本沒有錢!</value>
    </constructor-arg>
</bean>
public class Dialogue {

    // 說話的人
    private String person = "Nobody";
    // 說話內容
    private String words = "Nothing";
    /**
     *  獲取說話的人
     * @return
     */
    public String getPerson() {
        return person;
    }
    /**
     * 設定說話的人
     * @param person
     */
    public void setPerson(String person) {
        this.person = person;
    }

    /**
     * 獲取說話內容
     * @return
     */
    public String getWords() {
        return words;
    }

    /**
     * 設定說話內容
     * @param words
     */
    public void setWords(String words) {
        this.words = words;
    }

    /**
     * 定義說話的方法
     */
    public void Say() {
        System.out.println(person + " 曰:\"" + words + "\"");
    }
}

主要配置

<!-- 此處name=“”要與類中的屬性名完全對應 -->
<bean id="laoZiSay" class="com.lsl.ssm.service.Dialogue">
    <property name="person">
        <value>老子</value>
    </property>
    <property name="words">
        <value>中午不睡,下午崩潰!</value>
    </property>
</bean>

<bean id="kongZiSay" class="com.lsl.ssm.service.Dialogue">
    <property name="person">
        <value>孔子</value>
    </property>
    <property name="words">
        <value>老子說的對!</value>
    </property>
</bean>

3.註解方式注入
四種主要註解

@Component:可以用於註冊所有bean
@Repository:主要用於註冊dao層的bean
@Controller:主要用於註冊控制層的bean
@Service:主要用於註冊服務層的bean

實體類User.java

public class User {

    private int id;
    private String username;
    private String password;
    private String email;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    ...
}

DAO層介面UserDao.java

public interface UserDao {

    public int save(User user);
}

UserDaoImp.java

@Repository("userDao") // 這個註解等同於在XML配置檔案中編寫<bean id="userDao" class="..UserDaoImp"/>
public class UserDaoImp implements UserDao {

    public int save(User user) {
        System.out.println("儲存新使用者資訊到資料庫!");
        return 1;
    }

}

服務層介面UserService.java

public interface UserService {

    public void addNewUser(User user);
}

UserServiceImp.java

@Service("userService")
public class UserServiceImp implements UserService {

    // 方式一:
    // 宣告介面型別的引用,和具體實現類解耦合
//  @Autowired //預設按型別匹配
//  @Qualifier("userDao") // 指定Bean名稱匹配
//  private UserDao dao;

    //方式二:
//  private UserDao dao;
//  public UserServiceImp() {}
//  @Autowired
//  public void setDao((@Qualifier("userDao") UserDao dao) { // 可以對入參進行標註
//      this.dao = dao;
//  }   

    //方式三:使用Java標準註解完成裝配
//  @Resource(name="userDao") //為dao屬性名注入名為userDao的bean
    @Resource //查詢名為dao的bean並注入給dao屬性
    private UserDao dao;


    public void addNewUser(User user) {
        if(dao.save(user)==1) System.out.println("儲存成功!");
    }

}

配置,使用註解,配置就很簡單了,只有一條配置就夠了

<!--  掃描包中註解標註的類  -->
<context:component-scan base-package="com.lsl.ssm.service,com.lsl.ssm.dao"/>

該有的解釋已經在註釋裡了

@Author 瞌睡蟲
@mybatis-3.2.2
@Database: mysql 5.7.15
@Tool: MyEclipse