2 xml配置文件
Bean标签的配置
属性:
id:Bean在Spring容器中的唯一标识,在一个xml配置文件内部所有Bean标识的命名不可与之重复
class:Bean的全限名,指定这个id标识所对应的Bean类。Spring框架底层利用反射通过这个全限名对应Bean类的无参构造器创建对象。
scope:指的是对象创建的模式,有以下五中取值
singleton:是scope属性的默认值,相当于饿汉单例模式,也就是说Bean对象只在使用xml配置文件创建Spring客户端对象的时候创建一次,之后使用getBean方法获取Bean对象的时候返回的都是之前创建好的Bean对象。singleton一共就在Spring的核心文件被加载时创建一次一个Bean对象存储在容器里,当应用卸载销毁容器时对象随之销毁。
prototype:相当于多例设计模式,也就是说在每一次使用Spring客户端对象的getBean方法时都会创建一个新的Bean对象并返回。prototype是使用几次getBean方法就会创建几个Bean对象,当对象长时间不用的时候就会被java的垃圾回收机器回收对象也就销毁了。
request:web项目中,Spring创建一个Bean对象并将其存入到request域中
session:web项目中,Spring创建一个Bean对象并将其存入到session域中
global session:web项目中,应用于portlet环境中,如果没有portlet环境的话就相当于session
init-method:指定Bean类中的初始化方法
destory-method:指定Bean类中的销毁方法
import标签
import标签是用来将其他配置文件的配置内容加载到这个配置文件中
Bean实例化的三种方法:
无参构造方法实例化(重点):无参构造方法其实就是我们上面讲的那些知识点
工厂静态方法实例化:通过工厂中的静态方法进行实例化,只需创建一个工厂类,类里面创建一个静态方法,方法返回一个无参构造器创建的Bean对象,再设置xml文件即可
工厂实例方法实例化:通过工厂中的实例方法进行实例化,与工厂静态方法的区别就是,用于返回一个无参构造器创建的Bean对象的方法是实例方法,xml配置文件也不一样,要更加复杂些。
3 依赖、数据注入问题
引出问题
现在有这么一个情况,除了上面已经有的dao层之外,新建一个业务层service。service层的结构和dao层相似,也是一个接口和实现类。目录结构如下:
UserServiceImpl类和UserDaoImpl类也都通过xml配置文件的bean标签进行配置。
此时有一个需求,就是要在service层的UserServiceImpl类里的cast()方法中调用UserDaoImpl类的save()方法,实现思想就是在UserServiceImpl类里的cast()方法中使用之前UserDaoDemo的那一套进行调用UserDaoImpl类的save()方法
在新建的UserController类中使用那一套调用UserServiceImpl类里的cast()方法
这么一来,就可以在Spring容器外部将Dao组装到了Service 那么,有没有一种方式,可以在Spring容器内部就将Dao组装到了Service呢?有的,于是乎就出现了依赖注入。
依赖注入:
依赖注入(Dependency Injection)是Spring框架核心IOC(控制反转)的具体实现。在编程的时候通过控制反转就可以把对象的创建交给Spring 容器,IOC只是降低他们之间的依赖关系并不会消除依赖,service层仍会调用dao层的方法。那么,该如何将UserDao注入到UserService的内部呢?