依赖自动装配
自动配置
前面花了大量的时间把Spring的注入去学习了下,总结起来就一个字麻烦。
问:麻烦在哪?
答:配置文件的编写配置上。
问:有更简单方式么?
答:有,自动配置
什么是自动配置以及如何实现自动配置,就是接下来要学习的内容:
什么是依赖自动装配?
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式有哪些?
准备下案例环境
创建一个Maven项目
pom.xml添加依赖
resources下添加spring的配置文件
这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:
(1)项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类
1 public interface BookDao {2 public void save();3 }4 5 public class BookDaoImpl implements BookDao {6 7 private String databaseName;8 private int connectionNum;9 10 public void save() {11 System.out.println("book dao save ...");12 }13 }14 public interface BookService {15 public void save();16 }17 18 public class BookServiceImpl implements BookService{19 private BookDao bookDao;20 21 public void setBookDao(BookDao bookDao) {22 this.bookDao = bookDao;23 }24 25 public void save() {26 System.out.println("book service save ...");27 bookDao.save();28 }29 }
(2)resources下提供spring的配置文件
1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="http://www.springframework.org/schema/beans"3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">5 6 <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>7 <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">8 <property name="bookDao" ref="bookDao"/>9 </bean>10 </beans>
(3)编写AppForAutoware运行类,加载Spring的IOC容器,并从中获取对应的bean对象
1 public class AppForAutoware {2 public static void main( String[] args ) {3 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");4 BookService bookService = (BookService) ctx.getBean("bookService");5 bookService.save();6 }7 }
完成自动装配的配置
接下来,在上面这个环境中来完成 自动装配 的学习:
自动装配只需要修改applicationContext.xml配置文件即可:
(1)将<property>标签删除
(2)在<bean>标签中添加autowire属性
首先来实现按照类型注入的配置
1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="http://www.springframework.org/schema/beans"3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">5 6 <bean class="com.itheima.dao.impl.BookDaoImpl"/>7 <!--autowire属性:开启自动装配,通常使用按类型装配-->8 <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>9 10 </beans>
注意事项:
- 需要注入属性的类中对应属性的setter方法不能省略
- 被注入的对象必须要被Spring的IOC容器管理
- 按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException
一个类型在IOC中有多个对象,还想要注入成功,这个时候就需要按照名称注入,配置方式为:
1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="http://www.springframework.org/schema/beans"3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">5 6 <bean class="com.itheima.dao.impl.BookDaoImpl"/>7 <!--autowire属性:开启自动装配,通常使用按类型装配-->8 <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>9 10 </beans>
注意事项:
按照名称注入中的名称指的是什么?
bookDao是private修饰的,外部类无法直接方法
外部类只能通过属性的set方法进行访问
对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名
- 为什么是去掉set首字母小写?
- 这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名
必须要有settle方法
所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对
应的名是一致的
如果按照名称去找对应的bean对象,找不到则注入Null
当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错
两种方式介绍完后,以后用的更多的是按照类型注入。
最后对于依赖注入,需要注意一些其他的配置特征:
1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推
荐使用
4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
类型匹配必须要唯一