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

Sprint学习笔记(1)之Spring中的Bean配置

2016-01-24 10:29 411 查看

Spring中的Bean配置

IOC & DI概述

1.        IOC(控制反转):器思想是反转资源获取的方向。

1)        传统:资源查找方式要求组件向容器发起请求查找资源。作为回应回应,容器适时的返回资源。 

2)        IOC:容器主动地将资源推送给它所管理的组件,组件所要做的就是选择一种合适的方式来接受资源。

2.        DI(依赖注入):IOC的另一种表达方式:组件以一些预先定义好的方式(setter方法)接受来自如容器的资源注入。

Bean:基于XML文件的方式

1.        属性注入:通过属性的setter方法注入属性值。(常用)



1)        Id:用于在java文件中找到指定的bean。

2)        Class:指定Bean的类文件名称。

3)        Property:子标签,用来为bean中的属性赋值。

a)        Name:属性名称

b)        Value:变量值

2.        构造器注入属性值(常用)



1)        要求:Bean中有相应的构造器。

2)        若一个Bean中有多个构造器,可以通过index和type进行更加精确的定位.

3)        若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值. (了解)

<constructor-arg>
         <value><![CDATA[<ATARZA>]]></value>
</constructor-arg>

3.        Bean配置细节

1)        属性为一个对象的配置(常用)

a)        通过ref属性值指定当前属性指向哪一个bean。



b)        使用内部bean的方式,内部bean不能被外部的bean来引用。



2)        设置级联属性(了解)



注意:在使用级联属性时,这里Service对象属性必须先初始化,即指定一个bean的引用。否则使用级联时,由于Service没有初始化,即为NULL,获取属性时会报错。

3)        设置空属性(了解)



4)        装配集合属性

a)        对List集合的配置:使用property的子标签list来配置属性



                   注:在list标签内同样可以使用内部bean的方式来创建list容器中的一个实体对象。

b)        对map集合的配置:与list类似。使用property子标签map来配置。



使用map下子标签entry,配置Map类型的成员变量。

5)        通过utl声明外部集合类型



好处:在外部任何一个bean中都能通过ref应用的方式来使用同一个外部集合,即实现了不同Bean之间的集合共享。

6)        为Properties类型对象配置属性值



7)        P命名空间的使用



a)        可以简化bean中属性的赋值。

b)        注:需要导入p命名空间。

4.        自动装配



1)        在 <bean> 的 autowire 属性里指定自动装配的模式

2)        byType(根据类型自动装配): 若 IOC 容器中有多个与目标 Bean 类型一致的 Bean. 在这种情况下, Spring 将无法判定哪个 Bean 最合适该属性, 所以不能执行自动装配.

3)        byName(根据名称自动装配): 必须将目标 Bean 的名称和属性名设置的完全相同.

4)        缺点:

a)        若只希望装配个别属性时, autowire 属性就不够灵活了。

b)        autowire 属性要么根据类型自动装配,要么根据名称自动装配, 不能两者兼而有之。

5.        bean之间的关系:继承和依赖

1)        继承

Ø  子Bean从父Bean中继承配置,即属性配置。同时也可以覆盖从父Bean中继承的属性值。类似于父类和子类的关系。



Ø  可通过abstract=true,将父Bean设置为一个纯的模板Bean。此时父Bean不能被实例化。

Ø  父Bean也可以忽略class属性,此时父Bean的abstact属性必须置为true。

2)        依赖

Ø  Bean可以通过depends-on属性设定Bean的前置依赖Bean。此时这个前置依赖Bean必须在本Bean实例化之前创建好。即不能为空。

Ø  如果前置依赖有多个,则可以通过逗号,空格或的方式配置 Bean 的名称

Ø  依赖的这个Bean不一定是本Bean中的属性。

6.        Bean的作用域

1)        使用Bean的scope属性来配置bean的作用域。

2)        Singleton:默认值。容器初始时创建bean的实例。在整个容器的生命周期中只创建这一个bean,即单例的。

3)        Prototype:原型的。容器初始化时不创建bean的实例。而在每次请求时都创建一个新的Bean实例,并返回。

7.        使用外部属性文件

1)        Spring 提供了一个PropertyPlaceholderConfigurer 的BeanFactory 后置处理器,

a)        这个后置处理器将Bean 配置的部分内容外移到属性文件中。可以在 Bean 配置文件里使用形式为${var} 的变量。

b)        PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量。

2)        Spring 还允许在属性文件中使用${propName},以实现属性之间的相互引用

8.        SpELl语言

1)        字面值表示:<property name="count" value="#{5}"/>

2)        引用其他Bean对象:

3)        引用其他Bean对象的属性:

4)        链式操作,调用Bean对象方法

5)        逻辑运算、字符串连接、比较运算、逻辑运算符、if-else变体和正则表达式

6)        调用静态方法或静态属性:通过T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性。

9.        IOC容器中Bean的生命周期(相对而言重要,要能说出来)

1)        Bean的声明里设置init-method和destory-method属性,为 Bean 指定初始化和销毁方法。

2)        Bean后置处理器

Ø  作用:在调用init()方法【前】、【后】对Bean进行额外的处理。

Ø  应用:检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性。

Ø  实现BeanPostProcessor接口,并实现两个方法。

Ø  在配置文件中配置。

Ø  Bean的后置处理器对IOC容器里的所有Bean实例都进行处理。



3)        Spring IOC容器对Bean的生命周期进行管理的过程

a)        通过【构造器】或工厂方法创建 Bean 实例

b)        为 Bean 的【属性设置值】和对其他 Bean 的引用

c)        将 Bean实例传递给 Bean后置处理器的 postProcessBeforeInitialization 方法

d)        调用 Bean 的初始化方法

e)        若有指定init-method,则执行这个方法

f)         将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

g)        使用Bean

h)        当容器关闭时,器生成的Bean同时销毁,若指定destory-method方法则执行对应的方法

 


10.    通过工厂创建Bean

1)        通过静态工厂方法来配置Bean



Ø  Class:指向静态工厂方法的全类名。

Ø  Factory-method:指向静态工厂方法的名字。

Ø  Constructor-arg:如果工厂方法需要传入参数,通过这个子标签来配置。

2)        通过工厂实例方法来配置Bean

a)        配置实例工厂

<bean id="carFactory" class="com.atguigu.spring,bean.factory.InstanceCarFactory"/>

b)        通过实例工厂方法来配置Bean

<bean id="car2" factory-bean="carFactory" factory-method="getCar">

<constructor-arg value="ford"/>

</bean>

Ø  factory-bean:指向某工厂实例ID。

Ø  factory-method:指向工厂方。

基于注解的方式

1.        特定组件(在Bean中设置)

1)        @Component: 基本注解, 标识了一个受 Spring管理的组件

2)        @Respository: 标识持久层组件

3)        @Service: 标识服务层(业务层)组件

4)        @Controller: 标识表现层组件

2.        对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称

3.        当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明<context:component-scan>

1)        base-package:属性指定一个需要扫描的基类包Spring 容器将会扫描这个基类包里及其子包中的所有类. 当需要扫描多个包时, 可以使用逗号分隔.

2)        resource-pattern:扫描特定的类而非基包下的所有类。

4.        子节点

1)        <context:include-filter>:表示要包含的目标类

2)        <context:exclude-filter>:表示要排除在外的目标类

5.        <context:component-scan> 下可以拥有若干个<context:include-filter> 和 <context:exclude-filter> 子节点


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring bean ioc