当前位置: 首页 > article >正文

依赖自动装配

自动配置  

前面花了大量的时间把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注入与构造器注入,同时出现时自动装配配置失效

类型匹配必须要唯一 


http://www.kler.cn/a/14004.html

相关文章:

  • c++ 对类与对象的基础框架+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏
  • (原创)Flutter基础入门:手把手教你搭建Flutter混合项目:AAR方式集成
  • ShellExecuteEx使用方法与常用实例
  • 基于HFSS软件24GHz雷达天线设计
  • 蓝牙耳机哪个牌子的音质好一些?三百内音质最好的蓝牙耳机排行
  • TX-LCN:分布式事务框架
  • Python numpy.float32方法代码示例
  • 学系统集成项目管理工程师(中项)系列07_信息(文档)管理
  • ai文案生成器免费-ai文案改写软件免费
  • Spring框架及源码(二)---Spring IoC高级应用与源码剖析
  • SVN通过备份、过滤、再导入的方式彻底删除废弃目录
  • Elasticsearch:使用 Elastic APM 监控 Android 应用程序(二)
  • 【模板】Hexo Docker Nginx 个人博客服务器部署
  • HTTP1.1(十二)Cookie的格式与约束
  • 部署你的flask应用到docker
  • BufferedOutputStream,BufferedInputStream是字节流,对象处理流,序列化,输入输出流,转换流
  • Bito:一款 iead/webstorm 神级插件,由 ChatGPT 团队开发,堪称辅助神器
  • Linux目录
  • RHCE第六次作业
  • JavaSE学习进阶day06_02 Set集合和Set接口