1.spring框架简介
什么是spring?
spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入
spring提供的ioc和aop应用,可以将组件的耦合度降至最低,即解耦,便于系统日后的维护和升级
spring为系统提供了一个整体的解决方案,开发者可以利用它本身提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择采用哪种技术进行开发
2.容器和bean管理
spring容器简介
在spring中,任何java类和javabean都被当成bean处理,这些bean通过容器管理和应用
spring容器实现了ioc和aop机制,这些机制可以简化bean对象创建和bean对象之间的解耦
spring容器有beanfactory和applicationcontext两种类型
(什么是javabean:一种简单规范的java对象;何时使用spring:当需要管理javabean对象时候就可以使用,spring是最简洁的对象管理方案之一)
spring容器的实例化
applicationcontext继承自beanfactory接口,拥有更多的企业级方法,推荐使用该类型,实例化方法如下:
//加载文件系统中的配置文件实例化
string conf = “c:\applicationcontext.xml”;
applicationcontext ac = new filesystemxmlapplicationcontext(conf);
//加载工程classpath下的配置文件实例化
string conf = “applicationcontext.xml”;
applicationcontext ac = new classpathxmlapplicationcontext(conf);
spring容器的使用
从本质上讲,beanfactory和applicationcontext仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。通过beanfactory和applicationcontext我们可以访问bean定义
首先在容器配置文件applicationcontext.xml中添加bean定义
<bean id = "标识符" class = "bean类型"/>
然后在创建beanfactory和applicationcontext容器对象后,调用getbean()方法获取bean的实例即可[getbean(标识符)]
bean的实例化
spring容器创建bean对象的方法有以下三种:
-用构造器来实例化
<bean id = "calendarobj1" class = "java.util.gregoriancalendar"/>
<bean id = "calendarobj2" class = "java.util.gregoriancalendar"/>
(id或name属性用于指定bean名称,用于从spring中查找这个bean对象;class用于指定bean类型,会自动调用无参数构造器创建对象)
-使用静态工厂方法实例化
<bean id = "calendarobj2" class = "java.util.calendar" factory-method = "getinstance"/>
(id属性用于指定bean名称,class属性用于指定工厂类型,factory-method属性用于指定工厂中创建bean对象的方法,必须用static修饰的方法)
-使用实例工厂方法实例化
<bean id = "calendarobj3" class = "java.util.gregoriancalendar"/>
<bean id = "dateobj" factory-bean = "calendarobj3" factory-method = "gettime"/>
(id用于指定bean名称,factory-bean属性用于指定工厂bean对象,factory-method属性用于指定工厂中创建bean对象的方法)
(将对象创建规则告诉spring,spring会帮你去创建对象;基于配置和默认规则,减少了代码的书写)
bean的命名
bean的名称:
在spring容器中,每个bean都需要有名字(即标识符),该名字可以用<bean>元素的id或name属性指定;id属性比name严格,要求具有唯一性,不允许用/等特殊字符
bean的别名:
为已定义好的bean,再增加另外一个名字引用,可以使用<alias>指定
<alias name = "fromname" alias = "toname"/>
bean的作用域:
spring容器在实例化bean时,可以创建以下作用域的bean对象
1、singleton作用域
在每个spring ioc容器中一个bean定义对应一个对象实例,默认项
配置实例:
<bean id="role" class="spring.chapter2.marygame.role" scope="singleton"/>
或者
<bean id="role" class="spring.chapter2.marygame.role" singleton="true"/>
2、prototype
一个bean定义对应多个对象实例
配置实例:
<bean id="role" class="spring.chapter2.marygame.role" scope="prototype"/>
或者
<beanid="role" class="spring.chapter2.marygame.role" singleton="false"/>
3、request
request表示该针对每一次http请求都会产生一个新的bean,同时该bean仅在当前http request内有效
request、session、global session使用的时候,首先要在初始化web的web.xml中做如下配置:
如果你使用的是servlet 2.4及以上的web容器,那么你仅需要在web应用的xml声明文件web.xml中增加下述contextlistener即可:
<web-app>...<listener><listener-class>org.springframework.web.context.request.requestcontextlistener</listener-class></listener>...</web-app>
如果是servlet2.4以前的web容器,那么你要使用一个javax.servlet.filter的实现:
<web-app>..<filter> <filter-name>requestcontextfilter</filter-name> <filter-class>org.springframework.web.filter.requestcontextfilter</filter-class></filter> <filter-mapping> <filter-name>requestcontextfilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>...</web-app>
接着既可以配置bean的作用域了:
<bean id="role" class="spring.chapter2.marygame.role" scope="request"/>
4、session
session作用域表示该针对每一次http请求都会产生一个新的bean,同时该bean仅在当前http session内有效(在一个httpsession中,一个bean定义对应一个实例,仅限于web环境)
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.marygame.role" scope="session"/>
5、global session
在一个全局的httpsession中,一个bean定义对应一个实例,仅在基于portlet的web应用中才有意义,portlet规范定义了全局session的概念
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.marygame.role" scope="global session"/>
(上面的bean作用域,可以通过<bean>定义的scope属性指定)
bean的生命周期回调
指定初始化回调方法:
<bean id = "examplebean" class = "com.foo.examplebean" init-method = "init">
</bean>
指定销毁回调方法,仅适用于singleton模式的bean:
<bean id = "examplebean" class = "com.foo.examplebean" destroy-method = "destroy">
</bean>
在顶级的<beans/>元素中的default-init-method属性,可以为容器所有<bean>指定初始化回调方法
<beans default-init-method = "init">
<bean id = "examplebean" class = "com.foo.examplebean"/>
</beans>
在顶级的<beans/>元素中的default-destroy-method属性,可以为容器所有<bean>指定销毁回调方法
<beans default-destroy-method = "destroy">
<bean id = "examplebean" class = "com.foo.examplebean"/>
</beans>
bean延迟实例化
在applicationcontext实现的默认行为就是在启动时将所有singleton bean提前进行实例化
如果不想让一个singleton bean在applicationcontext初始化时被提前实例化,可以使用<bean>元素的lazy-init = true 属性改变
一个延迟初始化bean将在第一次被用到时实例化
<bean id = "examplebean" lazy-init = "true" class = "com.foo.examplebean"/>
在顶级的<beans/>元素中的default-lazy-init属性,可以为容器所有<bean>指定延迟实例化特性
指定bean依赖关系
当一个bean对另一个bean存在依赖关系时,可以利用<bean>元素的depends-on属性指定
<bean id = "beanone" class = "examplebean" depends-on = "manager"/>
<bean id = "manager" class = "managerbean"/>
当一个bean对多个bean存在依赖关系时,depends-on属性可以指定多个bean名,用逗号隔开
<bean id = "beanone" class = "examplebean" depends-on = "manager1,manager2"/>
3.容器的ioc应用
ioc概念
ioc全称是inversion of control,被译为控制反转;
ioc是指程序中对象的获取方式发生反转,由最初的new方式创建,转变为由第三方框架创建,注入。第三方框架一般是通过配置方式指定注入哪一个具体实现,从而降低了对象之间的耦合度
ioc按实现方法不同,可以分为依赖注入di和依赖查找两种
spring容器是采用di方式实现了ioc控制,ioc是spring容器的基础和核心
di概念
di全称是dependency injection,被译为依赖注入
di的基本原理就是将一起工作具有关系的对象,通过构造方法参数或方法参数传入建立联系,因此容器的工作就是创建bean时注入那些依赖关系
ioc是一种思想,而di是实现ioc的主要技术途径
di主要有两种注入方式,即setter注入和构造器注入
setterr注入
通过调用无参构造器或无参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.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;
public oracleuserdao(jdbcdatasource datasource){
this.datasource = datasource;
}
//其他代码.....
}
按构造器参数索引指定注入
<bean id = "datasource" class = "org.dao.jdbcdatasource">
<property name = "driver" value = "oracle.jdbc.oracledriver"/>
<property name = "url" value = "jdbc:oracle:thin:@localhost:1521:xe"/>
<peoperty name = "user" value = "openlab"/>
<peoperty name = "pwd" value = "open123"/>
</bean>
<bean id = "userdao" class = "org.dao.oracleuserdao">
<constructor-arg index = "0" ref = "datasource"/>
</bean>
自动装配
spring ioc容器可以自动装配(autowire)相互协作bean之间的关联关系,autowire可以针对单个bean进行设置,autowire的方便之处在于减少xml的注入配置
在xml配置文件中,可以在<bean/>元素中使用autowire属性指定自动装配规则,一共有五种类型值
属性值为no:禁止自动装配,默认值;
属性值为byname:根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配;
属性值为bytype:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;
属性值为constructor:与bytype的方式类似,不同之处在于它应用于构造器参数;
属性值为autodetect:通过bean类来决定是使用constructor还是bytype方式进行自动装配,如果发现默认的构造器,那么将使用bytype方式
配置示例:
<bean id = "userdao" class = "org.dao.oracleuserdao">
<constructor-arg index = "0" ref = "datasource"/>
</bean>
<bean id = "userservice" class = "org.service.userservice" autowire = "bytype"/>
上述配置,在userservice中如果存在接收userdao类型的方法setter方法,spring就可以自动将userdao对象注入进去
以上就是spring ioc容器的详细内容。