spring_day01
1.spring的概念
spring 是一个轻量级的一站式框架
百度百科:Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
2.spring的环境
依赖::maven中pom.xml中配置spring-context
配置文件:applicationContext.xml
基础配置:
<bean name = "此处bean的唯一标识" class = "此处编写实例化bean的全限定类名"></bean>
3.耦合与解耦
耦合:程序之间的依赖关系,开发的原则是:高内聚,低耦合
内聚:共性抽取,复用
我们在以往程序中,创建对象是都是用new的方式,这样类与类之间的耦合性很强。
举个例子 :
UserDao userDao = new UserDaoImpl();
在这行代码中 我们创建userDao对象 依赖于UserDaoImpl类,如果UserDaoImpl类不存在或者有什么错误,则这行代码 编译都尚不能通过。
再举个例子:
jdbc中注册驱动:DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 同样通过new的方式,驱动的注册依赖于com.mysql.jdbc.Driver类,好的,在编译期他们的依赖关系就很强,为了解决这个问题,我们使用了Class.forName(“com.mysql.jdbc.Driver”),采用反射的方式,降低他们的耦合。
ok,问题又来了,如果我们有一天要使用Orical或者DB2数据库,我们就需要修改源码,这样的维护成本是非常大的,怎么办呢
解决方案:解耦
解耦:降低程序之间的耦合性
作用:降低维护成本
针对上述的硬编码造成的代码不灵活,很僵硬的问题,我们使用 :配置文件+反射+工厂模式
(具体实现可以用properties读取xml配置文件,使用工厂模式创建单例对象(反射),重要的是思想)
4.IoC
a. Inversion of Controller 控制反转,spring的第一个核心
反转的是什么:资源(对象) 的控制权,将资源的控制权(初始化)从应用程序交给spring
思想:容器,我们日常使用的对象很少有需要操作成员变量的,所以大部分都是单例,如果每次获取都是new 重新创建的,那么很浪费资源,我们将这种对象放到一个容器中,给它一个唯一标识,每次调用,只需要根据唯一标识到容器里拿就可以了,这样做,高效,节能,解耦
b. 核心api:ApplicationContext
实现类:1.ClassPathXmlApplicationContext(常用):读取类路径中配置文件
2.FileSystemXmlApplicationContext(基本不用):读取磁盘中的配置文件信息,不适合各个系统,不能做到一次编译,到处运行
3.AnnotationConfigApplicationContext:注解方式
获取对象,getBean(“此处写唯一标识”),可以获取后强转,也可以直接转递一个类对象当参数
c. ApplicationContext与BeanFactory的爱恨纠缠
关系:ApplicationContext是BeanFactory 的子接口
区别:ApplicationContext,创建对象时会根据bean标签中scope属性,如果是单例对象(默认的,singleton这个单词是单身,你敢信),则使用立即加载,在读取xml后立即创建对象,如果是多例(prototype)则使用延迟加载,在对象被调用时才创建
BeanFactory,创建对象都是延迟加载,调用时创建
d. Bean对象的三种创建方式
1).使用空参构造方法创建:要求bean对象中必须有空参构造
<bean name = "id" class = ""></bean>
2).使用实例工厂:先创建工厂对象
<bean name = "工厂" class = "工厂类"></bean>
<bean name = "id" factory-bean= "工厂" factory-method="创建对象的方法"></bean>
3).使用静态工厂:不需要创建工厂对象
<bean name = "id" class="工厂类" factory-method="创建对象的静态方法"></bean>
e. bean对象作用范围
<bean> 标签中scope属性,值有五个
singleton:单例
prototype:多例
request:web应用中一次请求范围
session:web应用中一次会话范围
global-session:集群范围
f. bean对象的生命周期
单例:随着容器的创建而创建
读取xml配置文件:出生,会执行bean标签中init- method属性配置的方法
容器存在:活着
容器销毁:死亡,容器销毁要调用实现类的close()方法,会执行bean标签中配置的destroy-method属性配置方法
多例:对象被调用时创建,jvm垃圾回收机制回收对象时销毁
5.DI
Dependcy Injection注入依赖
概述:我们将资源的控制权交给了spring,则当我们要使用资源时,或者其他层要调用该层对象时,这些依赖关系需要spring去维护
所以spring应把程序所需的依赖给创建好,属性也给定义好
两种方式
构造器注入:
位置: <bean>下
属性:type/index/name 这三个是属性定位符
value/ref 属性值 ,value配置的是基本数据类型和String
ref配置的是spring中引用类型(bean)
setter注入:
位置: <bean>下
属性:type/index/name 这三个是属性定位符
value/ref 属性值 ,value配置的是基本数据类型和String
ref配置的是spring中引用类型(bean)
集合注入:
spring为我们提供了五种类型的标签
array/ list/ set 这三个同属一个系列,可以互换,但是不建议
map/props 同上可以互换,但是不建议
为什么可以互换?因为标签内只是提供数据,最终注入数据是要调用name中生命的属性的set方法,所以可以互换。
写个代码
<bean name="UserDaoImpl" class="cn.itcast.spring.dao.impl.UserDaoImpl">
<property name = "arrayStr" >
<array>
<value>aaa</value>
<value>bbb</value>
</array>
</property>
......list/set 写法相同
<property name="myMap">
<map>
<entry key="aaa" value="AAA"></entry>
<entry key="bbb" value="BBB"></entry>
</map>
</property>
<property name = "myProps">
<props>
<prop key="aaa">AAA</prop>
<prop key="bbb">BBB</prop>
</props>
</property>
</bean>
上一篇: 如何预防系统进程死锁具体该怎么操作
下一篇: 实现arduino和esp8266的连接
推荐阅读