引入
首先先明白,依賴注入描述的是在容器中建立bean與bean之間的依賴關系,本質就是將一個類中和別的類解耦的方式,就是把別的類,寫在成員變量位置,再對外提供可以給成員變量賦值的方法,外界就直接調用來給對應別的類賦值
所以對應的,依賴注入的方式對應set和構造器分別有四種方式
一、setter注入
首先先創建好一個BookService接口,再創建一個實現類,實現類中重寫了 add方法,以及簡單類型和引用類型的setter方法。注意:沒有對外界提供賦值方法的話無法注入)
public class BookServiceImpl implements BookService {BookDao bookDao;Integer num;@Overridepublic void add() {bookDao.add();System.out.println("this number = "+num);System.out.println("BookService add");}public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}public void setNum(Integer num) {this.num = num;}
}
此時的xml配置就是,先單獨配置 bookDao,然后再配置 bookService,因為里面有兩個屬性值需要注入,所以里面還需要配置分別的兩個標簽,一個是引用類型的(使用ref指定),一個是簡單類型的(使用value賦值)
<bean id="bookDao" class="com.dongmianmao.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.dongmianmao.service.impl.BookServiceImpl"><property name="bookDao" ref="bookDao"/><property name="num" value="123"/>
</bean>
測試類
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
BookService bookDao = (BookService)applicationContext.getBean("bookService");
bookDao.add();
二、構造器注入
首先先創建好一個BookService接口,再創建一個實現類,實現類中重寫了 add方法,以及包含了簡單類型和引用類型的構造方法。注意:沒有對外界提供賦值方法的話無法注入)
public class BookServiceImpl implements BookService {BookDao bookDao;Integer num;public BookServiceImpl(BookDao bookDao, Integer num) {this.bookDao = bookDao;this.num = num;}@Overridepublic void add() {bookDao.add();System.out.println("this number = "+num);System.out.println("BookService add");}}
此時的xml配置就是,先單獨配置 bookDao,然后再配置 bookService,因為里面有兩個屬性值需要注入,所以里面還需要配置分別的兩個標簽,一個是引用類型的(使用ref指定),一個是簡單類型的(使用value賦值),和使用set構造不同的是,賦值的標簽不同,這里使用的是constructor-arg,畢竟用的是構造器賦值嘛,所以標簽命名也和構造器有關
<bean id="bookDao" class="com.dongmianmao.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.dongmianmao.service.impl.BookServiceImpl"><constructor-arg name="bookDao" ref="bookDao"/><constructor-arg name="num" value="123"/>
</bean><!--或者這樣-->
<bean id="bookDao" class="com.dongmianmao.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.dongmianmao.service.impl.BookServiceImpl"><constructor-arg type="com.dongmianmao.dao.BookDao" name="bookDao" ref="bookDao"/><constructor-arg index="1" name="num" value="123"/>
</bean>
<!--指定他們的 入參類型type,以及下標索引index,不過寫不寫值都一樣
-->
測試類
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
BookService bookDao = (BookService)applicationContext.getBean("bookService");
bookDao.add();