您的位置:首页 > 编程语言 > Java开发

spring学习笔记(一)

2014-01-13 00:00 113 查看
摘要: Ioc容器(BeanFactory)与Spring容器/应用上下文(ApplicationContext)区别联系、Bean的注入

前言

用了很长时间的Spring了,但发现有些时候一点小细节疏忽导致的错误很久才能找到原因,对Spring的基础知识没有一个系统的整理,所以整理一下Spring的知识,加强记忆也希望可以帮到跟多的人。

Spring Ioc 容器

Ioc(inverse of control)控制反转:对象之间的依赖关系由代码转交给外部容器,降低依赖

Spring通过配置文件描述Bean与Bean之间的依赖关系(3.0还也可以用配置类代替配置文件),利用java的反射机制实例化Bean并建立Bean之间的依赖关系,换句话说Bean的实例化是在程序运行期间完成的,至于Bean在Spring容器(ApplicationContext)初始化时就完成实例化,还是在第一次调用的时候初始化就和bean的作用域以及是否配置延迟加载(lazy-init)有关,具体规则如下:

首先,这里先不考虑bean在web应用上下文中作用域(session、request、global session),现在只考虑singleton(单例)、prototype两种。

1.当在Spring容器(ApplicationContext)默认情况下,即不延迟加载的情况下:

1.1scope=’singleton’(默认)的bean会在Spring容器初始化时就实例化,并缓存于Ioc容器(BeanFactory)中,每次使用时都返回的缓存中的实例,不会创建新的实例

1.2scope=’prototype’的bean会在Spring容器初始化时就实例化的时候创建Bean的实例,并且每调用一次getBean都会产生一个新的实例

2.当在Spring容器配置延迟加载的情况下:

2.1 scope=’singleton’(默认)的bean会在第一次调用时实例化,并缓存于Ioc容器(BeanFactory)中,每次使用时都返回的缓存中的实例,不会创建新的实例

2.2 scope=’prototype’的bean会在第一次调用getBean方法的时候创建Bean的实例,并且每调用一次都会产生一个新的实例

Ioc容器(BeanFactory)与Spring容器/应用上下文(ApplicationContext)区别联系

ApplicationContext派生至BeanFactory,同时ApplicationContext提供了更多的功能,如自动化BeanPostProcessor注册、自动BeanFactoryProcessor注册、i18n支持、ApplicationEvent发送等;Application默认不延迟加载,而BeanFactory默认延迟加载;所以非特殊情况下,都推荐使用ApplicationContext而非BeanFactory

ApplicationContext初始化

ApplicationConText ctx = new ClassPathXmlApplicationContext(“配置文件地址”);

ApplicationConText ctx = new FileSystemXmlApplicationContext(“配置文件地址”);

ApplicationConText ctx = new AnnotationConfigApplicationContext(配置类);

ClassPathXmlApplicationContext和FileSystemXmlApplicationContext主要的区别是如果不显示的指定资源型前缀,将分别将路径解析为类路径和文件系统路径。在J2SE项目中使用Spring时需要使用上面的ApplicationContext初始化代码,在main方法中初始化或在静态类型中初始化。

WebApplicationContext的初始化需要在web.xml中使用Servlet或Listener初始化

1.listener

<!-- 指定配置文件-->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

<!-- 声明Web容器监听器-->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

2.Servlet

<!-- 指定配置文件-->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>



<!-- 声明自动启动的Servlet-->

<servlet>

<servlet-name>spring</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</ servlet-class>

<load-on-startup>1</ load-on-startup>

</servlet>



Bean的注入

Bean的注入分为属性注入、构造函数注入、接口注入三种

1.属性注入:

提供setter方法,同时保证有一个无参的构造函数,java语法规定当类中没有构造函数是,JVM会自动为其生成一个无参的构造函数,但当类中有有参的构造函数是不会在自动生成,这是需要手动的加上一个无参的构造函数。

备注:Spring中会检查Bean中是否有对应的Setter方法,属性不要求;属性变量的命名都是以小写字母开头如speed、maxSpeed等,但是也存在特殊情况如IDCode、IC、ICCard是合法的,即必须满足“变量的前两个字母只能同位小写或者大写”

2.构造函数注入

提供带需要注入参数的构造方法,配置文件如下配置

(1)根据参数类型注入

<bean id=”car” class=”com.smart.ditype.Car”>

<constructor-arg type=”参数类型” value=””/>

</bean>



(2)根据参数索引注入

<bean id=”car” class=”com.smart.ditype.Car”>

<constructor-arg index=”索引” value=””/>

</bean>

(3)接口注入

接口注入不常用,有兴趣的朋友可以自行了解

先到这里了,休息下再继续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring