天天看點

Spring DI依賴注入setter,構造,注解,三種依賴方式的總結

2017年9月17日00:45,寫個筆記

setter,構造,注解,三種依賴方式的總結

setter依賴注入總結:

先寫個測試類

package Spring05;

import org.junit.Before;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Maintest {

UserServlet userServlet;

@Before

public void loadSpringContext(){

ApplicationContext applicationContext= new ClassPathXmlApplicationContext("Application-DI.xml");

System.out.println(applicationContext);

userServlet=(UserServlet) applicationContext.getBean("userServlet");

System.out.println(userServlet);

}

@Test

public void save(){

userServlet.save();

}

}

1,先寫一個接口類Dao.

package Spring05;

public interface  Dao  {

public void save();

public void delete();

}

2.再寫兩個實作類:UserDao;DepartDao;

UserDao:

package Spring05;

public class UserDao implements Dao {

public void save() {

System.out.println("儲存使用者......");

}

public void delete() {

System.out.println("删除使用者......");

}

}

DepartDao:

package Spring05;

public class DepartDao implements Dao {

public void save() {

System.out.println("儲存科室......");

}

public void delete() {

System.out.println("删除科室......");

}

}

3,再寫一個模拟servlet類;

package Spring05;

public class UserServlet {

private Dao dao;

public void setDao(Dao dao) {

this.dao = dao;

}

public void save(){

dao.save();

}

public void delete(){

dao.delete();

}

}

4,配置application-DI;

<bean name="UserServlet" class="Spring05.UserServlet">//這一步是把UserServlet交給servlet容器管理

<property name="dao" ref="DepartDao"></property>      //這一步等于是給servlet裡面的Dao dao建立一個對象,這個對象具體實作的是

ref="DepartDao",也就是實作的DepartDao裡面的方法,說白了,就跟Dao dao=new DepartDao();是一樣的ref="DepartDao"就是new DepartDao(),如果

ref="UserDao",也就是new UserDao()

</bean>

<bean name="UserDao" class="Spring05.UserDao"></bean>//這一步是把UserServlet交給servlet容器管理,也就是準備被上面的UserServlet引用;

<bean name="DepartDao" class="Spring05.DepartDao"></bean>

構造依賴注入總結:

構造基本跟setter是一樣的,就吧UserServlet裡面的set方法換成有參構造方法,然後application-DI裡面的

<property name="dao" ref="DepartDao"></property>  換成<constructor-arg index="0" ref="UserDao"></constructor-arg>即可 

注解依賴:

注解依賴不需要配置很複雜的把Bean交給Spring容器管理,隻需要在application.xml裡配置自動注解

<!-- 注解 -->

<!-- 自動掃描Spring05下面的包 ,被掃描的包裡面如果想讓哪個類裡被掃描到需要在類前面加上@commponent

<context:component-scan base-package="Spring05"/>

<!--  -->

<context:annotation-config/>

</beans>

然後在幾個需要實依賴關系的類裡面都加上@commponent注解這樣就是吧bean交給了Spring容器管理了,

然後在UserServlet裡的屬性前面加上@Resource//這個就跟set依賴注入裡application需要交個Spring容器的時候配置的屬性是一樣的,這個就是自動當做屬性配置進去了

然後問題就來了,那麼既然是自動注入依賴的,因為UserDao DepartDao都實作的Dao接口,在UserServlet自動依賴dao屬性的時候系統不知道依賴誰,會報找

到兩個實作類的錯誤,解決方案就是在這兩個的其中一個的注解後面加上("dao")他就是指定的實作類,@Component("dao")

自動注解中@commponent跟 手動配置的   <bean name="UserServlet" class="Spring05.UserServlet">

<bean name="UserDao" class="Spring05.UserDao"></bean>

<bean name="DepartDao" class="Spring05.DepartDao"></bean>是一樣的,作用是交給Spring容器管理

@Resource/@Autowired跟 手動配置的

<property name="dao" ref="DepartDao"></property>

<constructor-arg index="0" ref="UserDao"></constructor-arg>是一樣的,作用是依賴注入