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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值