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>是一樣的,作用是依賴注入