🛫更多ssm知识见SSM_面向CRUD编程专栏
🚕本博客总结自黑马程序员的ssm框架视频
🚒博主对于该知识尚在学习阶段
🚄如果发现存在问题请毫不吝啬的指出
🚀🚀扎哇太枣糕的博客主页🚀🚀
目录
1 Spring简介
2 xml配置文件
3 依赖、数据注入问题
1 Spring简介
Spring是分层的Java SE/EE阶段应用的full-stack轻量级开源框架,主要以两个部分IOC (Inverse Of Control 反转控制)和AOP (Aspect Oriented Programming 面向切面编程)为内核。所谓的full-stack就是说提供了web层的Spring MVC、DAO层的JDBC模板、业务层的事务管理等众多的企业级应用技术,除此之外还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE企业应用开源框架。
了解完Spring是什么,接下来学习一下Spring的发展历程,Spring框架的前身是IBM提出的EJB,2005年Spring之父罗德·约翰森(Rod Johnson)发表Expert One-on-One J2EE Development without EJB一书被认为是Spring框架的雏形,再后来经过几年的发展就有了我们现在学习的Spring框架。
从高斯林和约翰森两位大佬的发型就能看出来,学Java必定是前途无量。
Spring体系结构
我们对Spring的学习是按照它的体系结构从下往上开始学习的
Spring快速入门开发
学习Spring之前
在使用Spring之前想要在UserDaoDemo的main方法里调用UserDaoImple类中的save方法,就要先使用多态创建对象就是通过new创建,再使用创建出来的UserDao对象调用save方法。这样做不好的地方就是:将创建对象写死(固定)了,编码过度耦合,代码里面创建的是什么对象就只能用什么对象。
学习Spring之后
使用Spring就可以通过xml配置文件实现解耦合,通过xml配置文件的配置和getBean方法的配合就可以动态的修改创建对象,具体步骤如下:
目录结构:
第一步:通过maven导入spring-context对应的依赖坐标
第二步:编写UserDao对应的接口和实现类
第三步:创建applicationContext.xml配置文件并配置id标识标识 UserDaoImpl类
第四步:在UserDemo中通过Spring的API获得Bean并调用方法
控制端运行结果
红色的是打印的日志信息而非报错
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的内部呢?
依赖注入的两种方式:
set方法注入
就相当于将userDao对象通过setUserDao方法当做一个参数直接传给UserServiceImpl类中,当创建UserServiceImpl类的对象调用cast()方法时,cast()方法内部就会使用setUserDao方法传过来的userDao对象调用save()方法
具体setUserDao方法参数的userDao对象是如何创建的,这就要到xml配置文件中设置了
xml配置文件的另一种配置方式的写法,知道即可还是上面的<property>标签的可读性更加高
通过set方法注入的方式,就可以在Spring容器内部时就将Dao组装到了Service
set方法注入的关键就是,xml配置文件<property>标签将Dao组装到了Service,并在再service层的实现方法上用set方法接收dao层的对象,并使用对象对dao层进行操作。
构造方法注入
创建一个有参构造器用于接收UserDao对象
使用<constructor-arg>标签配置
⚠ set方法注入和构造器注入的方式其他都一样,就是接收UserDao的载体set注入是私有属性的setter方法、构造器注入是有参构造器,xml配置文件的标签set注入是<property>、构造器注入是<constructor-arg>
set方式注入其他类型数据
以上两种依赖注入的方式不只能用于注入对象,还可以用于注入普通数据类型、引用数据类型和集合数据类型,接下来就以set注入方式为例演示
普通数据类型
创建变量相应的setter方法
配置xml配置文件
spring客户端对象获取Bean对象,并调用save方法
数组、集合、propetries
propetries是Java的一个类以键值对的形式存储配置信息
setter方法
xml配置文件
spring客户端对象获取Bean对象,并调用save方法
总结(注入数据时配置文件的配置格式)
上图传作资源,如有用可自行下载:下载地址
下一篇:【SSM面向CRUD编程专栏 2】Spring相关API 数据源(连接池)的配置 注解开发 整合junit