> 文档中心 > SSM框架学习2-Spring配置文件学习

SSM框架学习2-Spring配置文件学习

本文用于学习Spring核心配置文件的一些基础知识,由上一期知道,我们创建了一个applicationContext.xml作为我们Spring的配置文件,下面我们来学习bean标签的一些属性和依赖注入。

目录

一、bean标签属性学习

1.Bean标签范围配置:scope属性

2.Bean生命周期配置:init_method、destory_method属性

二、依赖注入

1.什么是依赖注入

2.为什么要依赖注入

3.依赖注入方法

3.1依赖注入的两种方式

3.2依赖注入不同的数据类型


一、bean标签属性学习

bean的属性学习仅口述介绍,可以自己在编译器中设置测试代码。

1.Bean标签范围配置:scope属性

经过上一期的学习,我们知道bean在构造时有id属性,class属性,工厂方式构造还有factory-bean和factory-method属性可以自己去了解,接下来介绍bean的scope属性和init_method、destory_method属性

对于scope属性可以看看如下图,标红范围需要掌握,        两个属性值分别代表创建实例的个数,若为singleton,则当new出一个app时,读取了配置文件,这时这个实例就已经被创建,接下来app再getbean时始终get到的是创建好的那个实例对象,即便是给不同的变量都getbean时,这两个变量都会指向同一实例对象。

若为prototype,则在加载配置文件时,实例对象不会被创建,因为他是多例的,而在不同变量getbean时,get一个就创建一个,所以最后不同变量可以对应相同类的不同实例对象。

2.Bean生命周期配置:init_method、destory_method属性

分别表示类在初始化前调用的方法和销毁前调用的方法,这个方法在对应的实现类中编写,在bean的init_method、destory_method属性中给出,让bean知道在实例化对象时和销毁对象时要先做什么,这两个属性值对应的也就是我们在实现类中给出的初始化和销毁方法。

二、依赖注入

在学习依赖注入的方法前,我们要先知道什么是依赖注入,为什么要依赖注入:

1.什么是依赖注入

        某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

        举个例子,现在我有一个UserDaoImpl类,这个类是一个数据访问的类,我现在编写一个业务类为UserServiceImpl类,我需要在UserServiceImpl类中用到UserDaoImpl类的方法来访问数据,所以我必须要有一个实例的对象来调用dao层的方法,而这个实例化的对象在我们没学习spring之前,往往我们是自己在写到UserServiceImpl中需要调用dao层方法的地方创建一个对象,依赖注入就减少了这个我们自己创建的过程,他已经在UserServiceImpl中创造了实例化dao的对象,我们在编写方法时可以直接使用这个对象和他的方法。

可以在看完依赖注入的方法和演示后再来理解什么是依赖注入

2.为什么要依赖注入

1、 动态替换Bean依赖对象,程序更灵活:替换Bean依赖对象,无需修改源文件:应用依赖注入后,由于可以采用配置文件方式实现,从而能随时动态的替换Bean的依赖对象,无需修改java源文件;

2、 更好实践面向接口编程,代码更清晰:在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,通过容器注入依赖实现;

3、更好实践优先使用对象组合,而不是类继承:因为IoC容器采用注入依赖,也就是组合对象,从而更好的实践对象组合。

采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成,其Bean本身可能只提供少许功能或根本无任何功能,全部委托给依赖Bean,对象组合具有动态性,能更方便的替换掉依赖Bean,从而改变Bean功能;
而如果采用类继承,Bean没有依赖Bean,而是采用继承方式添加新功能,,而且功能是在编译时就确定了,不具有动态性,而且采用类继承导致Bean与子Bean之间高度耦合,难以复用。
     增加Bean可复用性:依赖于对象组合,Bean更可复用且复用更简单;

     降低Bean之间耦合:由于我们完全采用面向接口编程,在代码中没有直接引用Bean依赖实现,全部引用接口,而且不会出现显示的创建依赖对象代码,而且这些依赖是由容器来注入,很容易替换依赖实现类,从而降低Bean与依赖之间耦合;

     代码结构更清晰:要应用依赖注入,代码结构要按照规约方式进行书写,从而更好的应用一些最佳实践,因此代码结构更清晰。

参考博客:
https://blog.csdn.net/LPlanguage/article/details/71077988

3.依赖注入方法

3.1依赖注入的两种方式

setter注入:

需要被注入的类中加入如下变量和方法

private UserDao userdao;    //依赖注入方法一: 通过set方法  在这个类里创建一个对象变量,通知配置文件通过set方法来注入    public void setUserdao(UserDao userdao) { this.userdao = userdao;    }

在配置文件中又有两种方式来配置

1.property标签方式:

配置增加代码如下:

    

在被注入的这个实现类的bean标签里增加property的标签,设置name属性为注入的这个实例的对象名(也就是我们在这个实现类中所创建的那个对象变量),ref表示引用,当数据类型为一对象时都需要做引用,这里用ref引用到UserDao,而这里UserDao的含义是我们注入的这个实现类(以dao为例)的bean ID,也就是引用其他bean。

2.p命名空间方式:

首先在标签的属性xmlns中新建一个命名空间,这里叫做p建造方式如下:

这里后面的值模仿第一个属性值,将beans改为p即可,然后使用p就可以在bean中添加一个名为p的属性,后面内容同理,这样就完成了一个依赖注入。

    

构造方法注入:

此方法不常用,简要概述

被注入的实现类中添加

private UserDao userdao;    //依赖注入方法二: 构造注入      //有参构造    public Userserviceimpl(UserDao userdao) { this.userdao = userdao;    }

 在配置文件中:

    

和setter注入的方法类似,只是标签改为了。

3.2依赖注入不同的数据类型

3.1中是以注入一个实例对象为例,当然我们还可以注入其他的数据类型,比如String、Int、List、Map、Properties等等数据类型,注入方式大同小异,并且遵循同规律。

我们采用setter方法来注入,被注入的类添加代码如下:

 //集合数据类型    private List list;    private Map userMap;    private Properties properties;    public void setList(List list) { this.list = list;    }    public void setUserMap(Map userMap) { this.userMap = userMap;    }    public void setProperties(Properties properties) { this.properties = properties;    }    //普通数据类型    private String username;    private int age;    public void setUsername(String username) { this.username = username;    }    public void setAge(int age) { this.age = age;    }

可见我们测试了五个依赖注入,在配置文件中代码如下:
这里用到了User类的bean已经提前创建(代码最下方)

                     zhangsan    lisi        <!---->                                    zhangsan    lisi                  

分析代码可以得出,普通数据类型的依赖注入配置方式直接使用标签,name属性上面已介绍,value里就填这个数据类型的内容

依赖注入可以嵌套,我们可以看到id为user1的bean注入了这个两个参数值,则再将这个user1注入到

标签下,也就是map中,因为这里数据类型map的值可以是一个对象。

        这些集合数据类型注入配置中,在设置完标签和name属性后,增加对应的子标签,分别是

这些子标签是表示我们注入的数据类型的,而在这些子标签下面还有子子标签分别是 ,分别代表着

list中的元素值、map中的键和值、properties中的键和字符串,各自的格式就不赘述了,观察代码可掌握。

PS:

在测试中我们想打印出map的键和值,当值是一个对象时,打印出来的是他的实例地址,而我们在这个对象类里添加一个toString方法后,打印此对象就默认按照toString方法的字符串格式打印,#idea中toString方法可以直接右键添加,很快捷!

全民K歌