依赖注入的方式:
这里有几个问题:
1.向一个类中传递参数有几种方式?
普通方法,构造方法
2.依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或者字符串呢?
引用类型,简单类型(基本数据类型与string)
3.依赖注入方式
setter注入:
简单类型,引用类型
构造器注入
简单类型,引用类型。
setter注入前面的例子比如在Impl中
//set注入
rivate BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
再在配置文件中写好相应的bean 和ref。
注入简单的数据类型:
在类中先注入,private int connecetnumber;
public void setConnecetnumber(int connecetnumber) {
this.connecetnumber = connecetnumber;
}
package Dao;
public class BookDaoImpl implements BookDao{
private int connecetnumber;
public void setConnecetnumber(int connecetnumber) {
this.connecetnumber = connecetnumber;
}
public void save() {
System.out.println("BookDaoImpl is running");
}
public void init(){
System.out.println("init is runing");
}
public void destory(){
System.out.println("destory is runing");
}
}
然后在配置文件中配置好:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!--1.导入spring的坐标spring-context,对应版本是5.2.10.RELEASE-->
<!--2.配置bean-->
<!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型-->
<bean id="bookDao" name= "bookDao1" class="Dao.BookDaoImpl" init-method="init" destroy-method="destory" />
<property name ="connecetnumber" value="10"/>
</bean>
<bean id="bookService" name="bookDaoService" class="Service.BookDaoServiceImpl">
<!--7.配置server与dao的关系-->
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref属性表示参照哪一个bean-->
<!-- name后面的bookDao指的是BookDaoServiceImol里面的bookDao ref后面的bookDao是一个bean注入到另外一个bean里面 -->
<property name="bookDao" ref="bookDao1"/>
</bean>
</beans>
构造器注入:
其实与setter注入很像
package Service;
import Dao.BookDao;
import Dao.BookDaoImpl;
public class BookDaoServiceImpl implements BookDaoService {
//删除使用new的方式
private BookDao bookDao;
public void save() {
bookDao.save();
System.out.println("service is running ");
}
//构造方法
public BookDaoServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<bean id="bookDao" class="Dao.BookDaoImpl" />
<bean id="bookService" class="Service.BookDaoServiceImpl">
<constructor-arg name="bookDao " ref="bookDao"/>
</bean>
</beans>
依赖注入的选择方式:
1.强制依赖使用构造器注入,使用setter注入有概率不进行注入导致null对象出现
2.可依赖选择使用setter注入进行,灵活性强
3.spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨。
4.如果有必要可以两者可以同时使用,使用构造器注入完成强制依赖的注入,使用setter注入可完成可选依赖的注入。
5.实际开发过程中还根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入。
6.自己开发的模块推荐使用setter注入。
自动装配:
在配置文件中,bean标签中写入autowire 即可。就不用手动了。分为根据类型装配,根据名字装配。按照名字装配BookDaoServiceImpl中,setter注入不能少且bean的id必须与setter方法的名字 去掉set将首字母大写变成小写一样。
ackage Service;
import Dao.BookDao;
import Dao.BookDaoImpl;
public class BookDaoServiceImpl implements BookDaoService {
//删除使用new的方式
private BookDao bookDao;
public void save() {
bookDao.save();
System.out.println("service is running ");
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<bean id="bookDao" class="Dao.BookDaoImpl" />
<bean id="bookService" class="Service.BookDaoServiceImpl" autowire="byName">
<!--还可以使用byType-->
</bean>
</beans>
注意事项:
1.自动装配用于引用类型依赖注入,不能对简单类型进行操作。
2.使用类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
3.使用按名装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用。
4.自动装配优先级低于setter注入与构造器注入,同时出现,自动装配配置失效。