----spring框架----
1.Spring框架作用
a,Spring Core(IOC功能)
b.Spring AOP
(管理组件对象,维护对象关系,目的组件耦合度)
c.Spring Web MVC功能
(MVC设计,目的:架构一个MVC结构的Web程序)
d.Spring整合其他技术,例如JDBC,MyBatis,Hibernate,Struts
Spring--->整合API---->调用原有技术API
在Spring中使用整合API编程
Spring--->JdbcTemplate---->Connection,Statement
JdbcTemplate.update(sql,params)
请求--->Servlet---->Service---->多个Dao
2,SpringIOC应用
(1),管理对象
a.创建,
<!-- 声明一个组件bean(加一个bean的定义)
此处等价于GregorianCalendar组件给spring框架组装上了,采用new GregorianCalendar()逻辑
以后我们只要根据配置文件,实例化Spring容器对象ApplicationContext,然后容器对象ApplicationContext创建我们声明过的bean定义,属性id的作用是将来在代码中获取bean对象时根据id来获取,id具有唯一性
-->
<bean id="c1" class="java.util.GregorianCalendar">
</bean>
.Spring创建Bean对象的控制
不同的创建方式,组件bean的写法也不同
控制对象创建的方式(使用方式)
在<bean>元素中使用scope属性控制
scope可以支持singleton或prototype
默认值是singleton
<bean scope="singleton">该组件在Spring容器里只有一个bean对象
<bean scope="prototype">该组件每次ac.getBean("id");都返回一个新的对象
默认情况下用单例,如果对象很少,用单例,可以节省资源
但是有属性定义的情况下,别用单例的
public class xxx{
private User user;
public void f1(){
对user操作
}
}
如果这中结构的组件是单例的,意味着它的属性也是单例的,只有一个对象了
,private User user也只有一个,如果两个人同时想去调用组件的方法,只有一个private
User user,就不知道存谁的数据,这就属于一种并发,在你处理更多的业务的时候,一个对象为两个人或更多的的人来服务,它这一个属性不知道该存谁的数据、
b.初始化,
指定对象初始化方法
对象在创建完以后,我们有时需要做初始化的一些操作怎么做呢
之前我们可以用构造器初始化,现在我们利用<bean>元素的init-method,当创建对象后自动执行
init-method方法,这两种方法有没有区别呢?
写在init-method里面的代码比写在构造器里面的代码要执行得晚一点。因为init-method是在对象创建完才执行的,
c.释放资源,销毁
指定对象销毁方法
一般我们需要做什么样的操作才能释放掉对象资源呢?
假如说我用了一个对象,这个对象我不用了,我想让他尽快的释放掉,调垃圾回收器对象,可以把对象设置为null,他就不指向内存中的任何对象了,垃圾回收器就可以。
利用<bean>元素的destroy-method指定
满足下面条件才有效
---组件对象为单例模式
---调用AbstractApplicationContext容器对象的close()方法
d.控制单例对象创建时机
在声明了一个bean组件之后,这bean里面的对象什么时候创建
在非单例的情况下,执行ac.getBean()的时候,bean里面的对象创建了,
在单例的情况下,bean里面的对象只会有一个,这个唯一的对象默认情况下会在创建容器的时候创建出来。
启用延迟实例化lazy-init="true"
在默认情况下,单例对象是Spring容器创建时实例化,;可以用<bean>元素的lazy-init=true属性
(2),维护对象关系
一个对象创建出来之后,如何把其他的信息往对象里面传进去,
我们可以用注入的方式在对象里去使用其他的信息
Dependency Injection 依赖注入
依赖注入:set 方法注入,构造器注入
c.搭建SpringIOC开发环境
---引入相关jar包
--在src添加applicationContext,
如果用spring ioc的话,它可以降低”字符串“对象和Computer对象之间的关联,它是如何降低关联呢?
首先我们把computer交给spring容器,再用set方式将字符串“对象注入Computer对象,这样的话更改字符串对象时候也不用对Computer对象的代码进行更改。
以低耦合的形式把数据传入,构造器注入,构造器走构造方法,带参数的构造方法
现在把phone组件写好了,为了接收两个值,我们写了个带两个参数的构造方法,通过这个构造器,这两个参数把两个值传进来
对象与对象之间
为了将Student对象和Computer和phone对象进行解耦,我们也用注入的形式
从这个组件上去看,这个student对象要是创建出来,默认初始化,这两个变量应该都是null,然后这里掉show方法就会空指针,如果说在我们spring容器当中,我们就可以用在Student里注入Computer对象,Phone对象
IOC概念
Inversion of Control 控制反转或反向控制
控制反转:改变了对象获取方式。之前编码方式采用new 构造器方式获取对象,ioc中采用由容器创建对象之后注入进来使用.只要修改配置文件就可以改变对象关系。