SSM框架之Spring-IoC和DI的理解與三種常用注入方式
阿新 • • 發佈:2019-01-26
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