引入
首先先明白,依赖注入描述的是在容器中建立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();