马士兵Spring学习笔记

来源:互联网 发布:linux 禁止用户登录 编辑:程序博客网 时间:2024/06/09 21:25

1.      Spring的注入的三种方式:

详见博文,以作参考:

http://blessht.iteye.com/blog/1162131

http://jnotnull.iteye.com/blog/153406

http://www.blogjava.net/jiadong/archive/2007/08/29/140962.html

a)      setter方法注入 (重点)

【1】      Java Bean中要有相应成员变量的gettter,setter方法

【2】      Spring配置文件中如下配置:

<bean id=”xxx”class=”包名.类名”>

       <property name=”成员变量名1” ref=”另外一个bean的id”>

       <property name=” 成员变量名2” value=”Xxx”>

</bean>

(准确地说,name=”成员变量名这个说法不准确,应该指一个setter方法应该是这个name中的文字首字母变为大写并加前缀“set,setXxx()正好是JavaBean中的一个setter方法;

<propertyname=” 成员变量名2” value=”Xxx”>一般使用vaule=”Xxx”,功能为给JavaBean某个成员直接赋值,这种成员类型一般为String或简单值类型。也须添加getter,setter方法。

)

 

b)     构造方法注入(可以忘记)

在JavaBean中使用Eclipse中的快捷键Alt+R+A使用字段生成构造器

(Spring中一般使用默认构造函数即无参构造函数通反射机制实例化Java Bean,如果JavaBean添加了重载构造函数,请显式添加无参构造器,以防别处实例化时出问题),如:

1)

2)在Spring的配置文件中使用如下格式的有关构造器的配置:

以上是单行XML标签格式,也可以使用嵌套标签格式,两者效果一致

在<bean>中使用子标签<constructor-arg>,index从0开始,表示重载构造器的参数顺序,ref引用其它bean id来实例化对应的成员。

c)      接口注入 (可以忘记)

略…

 

2.      Spring给简单属性赋值

a)比较简单,一般是采用如下标签:

<bean id=”Xxx” class=”包名.类名”>

<property name=”Xxx” value=”Yyy” />  value里直接填值,一般给String或简单值类型赋值

</ bean>

或 使用子标签形式

<bean id=”Xxx” class=”包名.类名”>

<property name=”Xxx”>

<value> Yyy </value>

</ property>

</ bean>

b)使用Spring为开发者预写好的bean作为<value />的值

 

3.      Spring中bean的生命范围 scope.

Spring中bean的生命周期默认为单例模式。

在<bean ….>中加入属性 scope=”singleton” (单例模式) scope=”prototype”(原型,即每次都new一个实例)

 

4.      Spring中的Collection集合类型成员的注入

List,Set,Map,Properties类型变量对应的注入配置方法如下示例:

 

 

5.      Spring自动装置AutoWire

意思为自动根据Spring配置文件的上下文寻找合适的其它bean并注入当前bean中的属性中,这样就可以省略编写<property>标签及其内容

(实际上该功能用得很少,以免出错)

在<bean …autowire=””>使用,autowire有5个选项,

autodetect:和构造器相关的

byName:通过检索与当前bean成员同名的<beanname=”…”>的name值相关的bean, name默认和id相同

byType:通过当前bean中成员的类型检索上下文相同类型的bean

constructor,

default:继承来自父标签<beans>的default-autowire属性,可在<beans ..>中增default-autowire属性,该属性选项和autowire一样

no:不进行自动装配,开发者自己手动装配。

 

6.      Spring中的生命周期:

a)<bean ….lazy-init=”true”>中设置lazy-init属性指,当用到当前bean时才进行实例化,而不是在容器加载Spring的时候就进行实例化。

在父标签<beansdefault-lazy-init=”true”></ beans>中设置default-lazy-init属性,指为全局设置lazy-init属性,子标签<bean>如果不显式指定lazy-init属性,则默认继承父标签的这一属性,从而不必一一指定该属性。

b)在<bean…init-method=”init” destroy-method=”destory”>中配置此两属性,指容器在初始化bean时执行init()方法,在容器销毁bean执行destory()方法,为此,要在对应的java bean文件中添加int()和destory()方法,书写方法体。

<bean scope=”singleton/prototype”>中为singleton单例时,多次调用singleton,也只执行一次init()和destory();为prototype时,(马士兵讲解)显示只调用init()方法,因此建议init-method=”init” destroy-method=”destory”不要和scope=”prototype”组合使用

 

7.      Spring中的IoC  Annotation注解(以版本spring-framework-3.0.5.RELEASE为例)

a)      在使用Annotation注解之前,请在Spring配置文件中头文档下,<beans></beans>中增加xml命名空间说明,并加上标签<context:annotation-config />

xmlns:context="http://www.springframework.org/schema/context"

 

完整<beans>结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
   <context:annotation-config/>
 
</beans>

 

 

b) 自动装配 @Autowired

写在setter方法之上。默认使用 byType注入。可放在setter方法,其它方法,构造器,fields成员变量等之上。如要使用byName注入,请使用@Qualifier,不建议写在private fields上,因为破坏封装性。

@Qualifier

中文意思为“合格者”,使用@Qualifier(“beannameXxx”)表示指定符合当前注入的name为Xxx的bean。

如果写在settter上,@Qualifier需要要写在参数上。

 

@Required

写在setter方法之上,表示在编译时必须装配,否则不予通过编译,从而避免空指针异常等错误或异常。

@Resource

可写在fields (不推荐)和setter方法之上。

默认首先使用byName进行装配。若指定name参数,则按name的值Xxx进行查找name为Xxx的bean;若没有指定,如果写在fields之上,则按照fields (即成员变量)的名字匹配相应的name为fields的bean,如果写在setter方法之上,则使用去除set前缀之后的首字母改为小写的String作为查找依据。

若使用byName查找不到指定的bean,则Spring再使用byType进行查找

@Component

写在类名之上,表示作为一个bean,可以被其它bean用来依赖注入,从而省去仍然要在Spring配置文件里手动配置bean的要求。

默认采用ByName形式表示name.若不手动指定name,,则name为当前类名的首字母小写形式,也可以手动指定name。

要使用该@Component,请先作如下配置:

增加<beans …>相关的xml命名空间xmlns:并增加如下语句:

<context:component-scan base-package="org.example"/>

 

其中base-package为你自己定义的包名,指到你指定的包名下扫描所有class.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
   <context:component-scan base-package="org.example"/>
 
</beans>

 

@Scope

写在类名之上,指定当前Class对应的Bean的生命范围,@Scope(“singleton”) @Scope(“prototype”)

@PostConstruct

放在某一普通方法之上,相当于<beaninit-method=”Xxx” ></bean>,初始化bean后自动调用的方法

@PreDestory

放在某一普通方法之上,相当于<beandestroy-method=”Xxx”></bean>,从内存中销毁当前类对象前自动调用的方法。