[Spring Framework]DI依赖注入②(自动装配、集合注入)

网友投稿 600 2022-08-31

[Spring Framework]DI依赖注入②(自动装配、集合注入)

[Spring Framework]DI依赖注入②(自动装配、集合注入)

文章目录

​​依赖自动装配​​​​集合注入​​

​​注入数组类型数据​​​​注入List类型数据​​​​注入Set类型数据​​​​注入Map类型数据​​​​注入Properties类型数据​​

依赖自动装配

在前文我们所提到的setter注入、构造器注入都需要配置,在我看来是有点麻烦的,为了简化我们的代码、提高我们的效率,我们可以使用依赖自动装配,那么什么是依赖自动装配呢?

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

自动装配存在以下几种方式:

按类型(常用)按名称按构造方法(很少用我们不去了解)不启用自动装配

接下来我们还是借用前文的工程结构来做两个实验:

在前文中:

我们的Spring配置文件:

BookServiceImpl类:

public class BookServiceImpl implements BookService { private BookDao bookDao; public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void save() { System.out.println("book service save ..."); bookDao.save(); }}

App:

public class App2 { public static void main(String[] args) { //获取容器 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); BookService bookService = (BookService) ctx.getBean("bookService"); bookService.save(); }}

接下来我们使用自动装配:

首先我们将​​​​​标签删除,然后在​​​​标签中添加autowire属性:

接下来我们在运行App2,结果正常:

注意: ①需要注入属性的类中对应属性的setter方法不能省略 ②被注入的对象必须要被Spring的IOC容器管理 ③按照类型在Spring的IOC容器中如果找到多个对象,会报​​​NoUniqueBeanDefinitionException​​

也就是说如果使用byType,那么容器中有且仅有一个bean的类型与之对应,否则就会报错!

那么假如真有两个bean的类型都满足怎么办呢?(当然这种情况很少发生,byType可以放心使用)

我们可以使用:byName

注意事项:

bookDao是private修饰的,外部类无法直接方法外部类只能通过属性的set方法进行访问对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名

为什么是去掉set首字母小写?这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名

所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的

如果按照名称去找对应的bean对象,找不到则注入Null当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

最后对于依赖注入,需要注意一些其他的配置特征:

自动装配用于引用类型依赖注入,不能对简单类型进行操作使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入

前面我们已经能完成引入数据类型和简单数据类型的注入,但是还有一种数据类型集合,集合中既可以装简单数据类型也可以装引用数据类型,对于集合,在Spring中该如何注入呢?

我们从以下几个方面入手:

数组ListSetMapProperties

项目准备:

实现了BookDao接口的BookDaoImpl:

public class BookDaoImpl implements BookDao { private int[] array; private List list; private Set set; private Map map; private Properties properties; public void save() { System.out.println("book dao save ..."); System.out.println("遍历数组:" + Arrays.toString(array)); System.out.println("遍历List" + list); System.out.println("遍历Set" + set); System.out.println("遍历Map" + map); System.out.println("遍历Properties" + properties); } public void setArray(int[] array) { this.array = array; } public void setList(List list) { this.list = list; } public void setSet(Set set) { this.set = set; } public void setMap(Map map) { this.map = map; } public void setProperties(Properties properties) { this.properties = properties; }}

App3:

public class AppForDICollection { public static void main( String[] args ) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); BookDao bookDao = (BookDao) ctx.getBean("bookDao"); bookDao.save(); }}

注入数组类型数据

100 200 300

注入List类型数据

book apple fenda banana

注入Set类型数据

cat car cupple cola

注入Map类型数据

注入Properties类型数据

china henan kaifeng

然后我们运行App3:

注意: ①property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写​​​​​​、​​​​​、​​​​​、​​​​​、​​​​​标签 List的底层也是通过数组实现的,所以​​​​​​和​​​​​标签是可以混用 集合中要添加引用类型,只需要把​​​​​​标签改成​​​​标签,这种方式用的比较少

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:逻辑思维Go语言微服务改造实践
下一篇:Linux 下压缩与解压.zip和.rar
相关文章

 发表评论

暂时没有评论,来抢沙发吧~