依赖注入有几种方式?
1.1 依赖注入的两种方式
-
setter注入简单类型==引用类型(很常用)==
-
构造器注入简单类型引用类型
1.2 setter方式注入
setter方式注入使用什么子标签?
引用类型
简单类型
1.3 构造方式注入
构造方式注入使用什么子标签?
引用类型
在bean中定义引用类型属性并提供可访问的构造方法
public class OrderServiceImpl implements OrderService {//引入dao对象private OrderDao orderDao ;public OrderServiceImpl(OrderDao orderDao) {this.orderDao = orderDao;}
配置中使用constructor-arg标签 ref属性注入引用类型对象
<bean id="orderDao" class="com.by.dao.impl.OrderDaoImpl"></bean><bean id="orderService" class="com.by.service.impl.OrderServiceImpl"><constructor-arg name="orderDao" ref="orderDao"/>
</bean>
1.4 依赖注入方式选择
强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
可选依赖使用setter注入进行,灵活性强
Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
==自己开发的模块推荐使用setter注入==
2. 依赖自动装配【理解】
如何配置按照类型自动装配?
2.1 自动装配概念
-
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
-
自动装配方式==按类型(常用)==按名称按构造方法不启用自动装配
2.2 自动装配类型
依赖自动装配
配置中使用bean标签autowire属性设置自动装配的类型---按类型
<bean id="bookDao" class="com.by.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.by.service.impl.BookServiceImpl" autowire="byType"/>
代码演示:
public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save ...");}
serviceImpl:
public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao = bookDao;}@Overridepublic void save() {bookDao.save();System.out.println("book dao running.....");}
测试:
ApplicationContext ac=new ClassPathXmlApplicationContext("application.xml");
BookService bookService= (BookService) ac.getBean("bookService");bookService.save();
如果出现两个id怎么办?比如
<bean id="bookDao" class="com.by.dao.impl.BookDaoImpl"/>
<bean id="bookDao2" class="com.by.dao.impl.BookDaoImpl"/><bean id="bookService" class="com.by.service.impl.BookServiceImpl" autowire="byName" />
依赖自动装配特征
自动装配用于引用类型依赖注入,不能对简单类型进行操作
使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
3 集合注入
public class OrderDaoImpl implements OrderDao {public int[] array;public List<String> list;public Set<String> set;public Map<String,String> map;public Properties properties;//生成Setter方法
3.1 注入数组类型数据
<bean id="orderDao" class="com.by.dao.impl.OrderDaoImpl">
<property name="array"><array><value>100</value><value>200</value><value>300</value></array>
</property>
</bean>
3.2 注入List类型数据
<property name="list"><list><value>北京</value><value>河南</value><value>郑州</value><value>高新区</value></list>
</property>
3.3 注入Set类型数据
<property name="set"><set><value>北京</value><value>河南</value><value>郑州</value><value>高新区</value></set>
</property>
3.4 注入Map类型数据
<property name="map"><map><entry key="country" value="china"/><entry key="province" value="henan"/><entry key="city" value="kaifeng"/></map>
</property>
3.5 注入Properties类型数据
<property name="properties"><props><prop key="country">china</prop><prop key="province">henan</prop><prop key="city">kaifeng</prop></props>
</property>
说明:property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签