知识体系:
一: Spring框架的简介
1.什么是Spring?
2.Spring 的主要功能有哪些?
二: 容器和Bean管理
1.Spring容器的简介
2.Spring 容器的实例化
3.Spring容器的使用
4.Bean的实例化
5.Bean的命名
6.Bean的作用域
7.Bean的生命周期
8.Bean延迟实例化
9.制定Bean依赖关
三:容器的IOC应用
1.ICO概念
2.Setter注入
3.构造器装配
4.自动装配
一:Spring框架的简介
1.什么是Spring?
- Spring的核心是一个轻量级(Lightweight)的容器(Container)。
- Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。
- Spring提供AOP(Aspect-oriented programming)概念的实现方式。
- Spring提供对持久层(Persistence)、事物(Transcation)的支持。
- Spring供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。
- Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。
2.Spring 的主要功能有哪些?
二: 容器和Bean管理
1.Spring容器的简介
- 在Spring中,任何的Java类和JavaBean都被当作Bean处理,这些Bean通过容器管理和应用
- Spring容器实现了IOC和AOP机制,这些机制可以简化Bean对象创建和Bean对象之间的解耦
- Spring容器有BeanFactory和ApplicationContext两种类型
小知识点(JavaBean是一种简单规范的Java对象)
温馨提示:何时使用Spring? 当需要管理JavaBean对象的时候就可以使用Spring,Spring是最简洁的对象管理方案之一
2.Spring 容器的实例化
ApplicationContext继承自BeanFactory接口,拥有更多的企业级的方法,推荐使用它来实例化,方法如下:
//加载文件系统的配置文件实例化
String config="applicationContext.xml所在的路径";
ApplicationContext ac=newFileSystemXmlApplicationContext(config);
//加载工程classpath下的配置文件实例化
String config="applicationContext.xml";
ApplicationContext ctx =
new ClassPathXmlApplicationContext(config);
温馨提示:如何使用Spring? 遵守Spring定义的规则,基于配置和默认规则,减少代码的书写。
3.Spring 容器的使用
从本质上讲,BeanFactory和ApplicationContext仅仅只是一个维护Bean定义以及相互依赖关系的高级工厂接口而已,通过BeanFactory和
ApplicationContext我们可以访问bean定义。
首先在容器配置文件applicationcontext.xml中添加Bean定义
<bean id="唯一的标识符" class="类所在路径"/>
然后在创建BeanFactory和ApplicationContext容器对象后,调用getBean()方法获取Bean的实例即可
方法使用示例:getBean("唯一的标识符")
4.Bean实例化
Spring容器创建Bean对象的方法有以下3种
-用构造器来实例化
-使用静态工厂方法实例化
-使用实例工厂方法实例化
温馨提示:将对象创建规则告诉Spring,Spring会帮你去创建对象:基于配置和默认规则,减少代码的书写!
下面将分别介绍三种Bean的实例化实例:
用构造器来实例化
<bean id="demo1" class="bean类型" />
<bean name="demo2" class="bean类型" />
id或者name属性指定Bean名称,用于从Spring中查找这个Bean对象,class用于指定Bean类型,会自动调用无参构造器创建对象。
使用静态工厂方法实例化
<bean id="demo3" class="bean类型" factoy-method="Static方法" />
id属性用于指定Bean名称
class属性用于指定工厂类型
factory-method属性用于指定工厂中创建Bean对象的方法,必须用Static修饰的方法
使用实例工厂方法实例化
<bean id="demo4" class="bean类型" />
<bean id="demo5" factory-bean="demo4" factory-method="getTime" />
下面的factory-method和上面的id对应
id用于指定Bean名称
factory-bean属性用于指定工厂Bean对象
factory-method属性用于指定工厂中创建Bean对象的方法
5.Bean的命名
1.Bean的名称
-在Spring容器中,每个Bean都需要有名字(即标识符),该名字可以用<bean>元素的id和name属性指定
-id属性比name严格,要求具有唯一性,不允许用"/"等特殊字符
2.Bean的别名
为已定义好的Bean,再增加另外一个名字引用,可以使用<alias>指定
<alias name="demo6" alias="demo7" />
这两个名字都可以用
6.Bean的生命周期
1.指定初始化回调方法
<bean id="demo8" class="bean类型" init-method="init">
</bean>
2.指定销毁回调方法,仅使用与singleton模式的bean
<bean id="demo9" class="bean类型" destroy-method="销毁方法名">
</bean>
提示:指定销毁回调方法,仅使用于singleton模式的Bean
并且Spring会管理对象的创建过程
3.在顶级的<beans/>元素中的default-init-method属性,可以为容器所有<bean>指定初始化回调方法
<beans default-init-method="init">
<bean id="demo" class="bean类型"/>
</beans>
4.在顶级的<beans/>元素中的default-destory-method属性,可以为容器所有的<bean>指定销毁回调方法
<beans default-destory-method="destory">
<bean id="demo" class="bean类型">
</beans>
7.Bean延迟实例化
1.在ApplicationContext实现的默认行为就是在启动时将所有singleton bean 提前实例化
2.如果不想让一个singleton bean在ApplicationContext 初始化时被提前实例化,可以使用<bean> 元素的
lazy-init="true"属性改变
3.一个延迟初始化bean将在第一次被用到时实例化
<bean id="demo10" lazy-init="true" class="bean类型"/>
4.在顶级的<beans/>元素中的default-lazy-init属性,可以为容器所有<bean>指定延迟实例化特性
8.指定bean依赖关系
1.当一个bean对另一个bean存在依赖关系时,可以利用<bean>元素的depends-on属性指定
<bean id="demo11" class="bean类型" depends-on="manager" />
<bean id="manager" class="ManagerBean">
2.当一个bean对多个bean存在依赖关系时,depends-on属性可以指定多个bean名,用逗号隔开
<bean id="demo12" class="bean类型" depends-on="manager1,manager2,manager3">
三:容器的IOC应用
1.IOC概念
1.IOC全称是Inversion of Control,被翻译为控制反转;
2.IOC是指程序中对象的获取方式发生反转,由最初的new方式创建,转变为由第三方框架创建和注入,
第三方框架一般是通过配置方式指定注入哪一个具体实现,从而降低了对象之间的耦合度
3.IOC按实现方法不同,可以分为依赖注入DI和依赖查找两种
4.Spring容器是采用DI方式实现了IOC控制,IOC是Spring框架的基础和核心。
5.DI全称是Dependency Injection,被翻译为依赖注入;
6.DI的基本原理就是将一起工作具有关系的对象,通过构造方法参数或方法参数传入建立关联,
因此容器的工作就是创建bean时注入那些依赖关系
7.IOC是一种思想,而DI是实现IOC的主要技术和途径
8.DI主要有两种注入方式,即 Setter注入和构造器注入
Setter注入
通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,
即可实现setter方式的注入
public class JDBCDataSource{
private String driver;
public void setDriver(String driver){
try{//注册数据库驱动
Class.forName(driver);
this.driver=driver;
}catch(Exception e){
throw new RuntimeException(e);
}
}
//其他代码。。。。。
}
在容器xml配置中,配置注入参数。
<bean id="dataSource" class="org.tarena.dao.JDBCDataSource">
<property name="driver" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="user" value="openlab" />
<property name="pwd" value="open123" />
</bean>
构造器注入
基于构造器的注入是通过调用带参数的构造器来实现的,容器在bean被实例化的时候,根据参数类型执行相应的构造器。
public class OracleUserDAO implements UserDAO{
private JDBCDataSource dataSource;
publicOracleUserDAO(JDBCDataSource dataSource){
this.dataSource=dataSource;
}
//其他代码。。。
}
按构造参数索引指定注入
<bean id="dataSource" class="org.tarena.dao.JDBCDataSource">
<property name="driver" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="user" value="openlab"/>
<property name="pwd" value="open123"/>
</bean>
<bean id="userDAO" class="org.tarena.dao.OracleUserDAO">
<constructor-argindex="0" ref="dataSource" />
</bean>
2.自动装配
1.Spring IOC容器可以自动装配(autowire) 相互协作bean之间的关联关系,autowire可以针对单个bean进行设置,autowire的方便之处在于减少xml的注入配置
2.在xml配置文件中,可以在<bean/>元素中使用autowire属性指定自动装配规则,一共有五种类型值
1. no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。
2. byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
3. byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
4. constructor:造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
5. autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。
配置示例:
<bean id="userDAO" class="org.tarena.dao.OracleUserDAO">
<constructor-argindex="0" ref="dataSource" />
</bean>
<bean id="userService" class="org.tarena.service.UserService" autowire="byType" />
上述配置,在UserService中如果存在接收UserDao类型的方法Setter方法,Spring就可以自动将userDAO对象注入方法