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

spring ioc容器注入的集中方式,以及属性注入的集中依赖,继承,使用SPEL表达式,ioc容器的生命周期,bean的几种工厂方法配置方式,bean的自动装配

2017-03-25 15:10 1266 查看
注入方式:

1.属性注入方式

<property name="" value=""/>

2.构造方法注入

<constructor >

自动装配:

SpringIOC容器可以自动装配Bean,选哟做的是仅仅是在<bean>的autowire水下那个里指定自动装配的模式

byType(根据类型自动装配)若IOC容器中有多个与目标Bean类型一致的bean。在这种情况下,springjia将无法

判定那个Bean类型一致的Bean最合适属性,所以不能指定自动装配。

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

constructor(通过构造器自动装配)当bean的名称存在多个构造器时,此种方式将变得很复杂不推荐使用

继承Bean配置

Spring允许继承bean配置,被继承的bean成为父bean。继承这个父bean的bean成为子bean。

子bean从父bean中继承配置,包括bean的属性配置

子bean也可以覆盖从父bean继承过来的配置

父bean可以作为配置模版。也可以作为Bean实例。若只想把父bean。作为模版,可以设置<bean>

的abstract属性为true。这样spring将不会实例化这个Bean。

并不是<bean>元素里的所有属性都会被继承,比如autowire abstract却不能被继承

也可以忽略父bean的class属性,让子bean指定自己的类。而共享相同的属性配置。但此时abstract属性必须为true

若某一个bean的class属性没有指定,则该bean必须是一个抽象bean.

bean之间的依赖

依赖Bean配置

spring允许用户通过depend-on属性设定基本bean的前置依赖。前置依赖的bean会在bean会在bean实例化之前创建好

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

使用外部属性文件:

在配置文件里配置bean时,有时候需要在bean的配置里混入系统部署的细节信息。(例如:文件路径,

数据源配置信息,等。而这些部署细节实际上需要和bean配置相分离)

spring提供了一个PropertyPlaceholderConfigure的BeanFactory后置处理器

这个处理器允许用户将bean配置文件里使用形式为${var}的变量。PropertyPlaceholderConfigure从属性文件里加载属性,并使用这些

属性来替换变量。

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

<!-- 导入属性文件 -->

<context:property-placeholder location="db.properties"/>

<bean id="datasource1" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<property name="user" value="${user}"></property>

<property name="password" value="${password}"></property>

<property name="driverClass" value="${driverClass}"></property>

<property name="jdbcUrl" value="${jdbcUrl}"></property>

</bean>

使用SPEL表达式

spel即spirng的表达式语言,简称(spel)是一个支持运行时查询和操作对象图的强大的表达式语言。

语法类似于El:spel使用#{...}作为定界符。所有在大括号内的自负都将被认为spel

spel为bean的属性机型动态赋值提供了便利。

通过spel为bean的属性进行动态赋值,提供了便利。

通过spel可以实现

通过bean的id对bean进行引用

调用方法以及引用对象中的属性

计算表达式的值

正则表达式的匹配

1.引用bean.属性和方法

引用其他对象

通过value属性值和spel配置bean之间的应用关系

<property name="prefix" value="#{prefixgenerator}">

引用其他对象属性值。

通过value属性值和spel配置suffix属性值。为另一个bean的suffix属性之

<property name="suffix" value="#{sequenceGenerator.suffix}">

调用其他方法。还可以是链式操作

<!--通过value属性和spel配置suffix属性值。为另一个bean的方法的返回值-->

<property name="suffix" value="#{sequenceGenerator.toString()}">

方法的链接

<property name="suffix" value="#{sequenceGenerator2.toString().toUpperCase()}">

逻辑运算符 三目运算符

正则表达式:match

<property value="#{admin.email match('正则表达式')}">

调用静态方法和静态属性

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

注意格式就是T()其中括号里为类括号外事一个变量或者方法。中间用点隔开

<propety name="iinitvalue" value="#{T(java.lang.Math).PI}">

IOC容器中bean的生命周期

SpringIoc容器可以管理Bean的生命周期。Spring允许在bean生命周期的特定点执行定制任务。

SpringIoc容器对Bean的生命周期进行管理孤傲成

通过构造器或工厂方法创建bean实例

为bean的属性设置值和对其他Bean的引用

调用Bean的初始化方法。

bean可以使用了

当容器关闭时,调用bean的销毁方法。

在bean生命里设置init-method="" destory-method=""属性

为bean指定初始话和销毁方法。

添加Bean后置处理器后Bean的生命周期

Spring Ioc容器对bean的生命周期进行管理的过程

通过构造器或工厂方法创建bean实例

为bean的属性设置值和对其他bean的引用

将bean实例传给bean后置处理器。

postPorcessBeforeInitialization方法

调用Bean实例传递给bean后期处理器的postProcessAfterinitialization方法

bean可以使用了

当容器关闭时,调用bean的销毁方法

通过工厂化方法来配置bean

实例工厂方法:将对象的创建过程封装到两外一个对象实例的方法。当客户端需要请求对象时,只需要简单到调用该实例方法而不需要关心对象的创建细节

要声明通过静态工厂方法创建的bean。

在bean的factory-bean属性里制定拥有该工厂方法的bean。

在factory-method属性里指定该工厂方法的名称。

使用construtctor-arg元素为工厂方法传递参数。

通过注解的方式来配置bean

配置形式:基于xml文件的方式;基于注解的方式(基于注解配置bean;基于注解来装配beand的属性)

-bean的配置方式;通过全类名(反射)。通过工厂方法(静态工厂方法&实例工厂方法),factorybean

-ioc容器配置BeanFactory&ApplicationContext概述

-依赖注入方式:属性注入和构造器注入:工厂方法注入

注入属性细节

配置包含的是否包含某个类。

<!-- 指定ioc容器扫描的包以及子包里配置的注解类 ,其中base-package=""是要包含要扫描的包和其的所有子包。但是如果加上resource-patter则只扫描其属性值里相关的包。

<context:component-scan base-package="com.test.spring.annoation" resource-pattern="auto/*.class">

</context:component-scan> -->

<!-- 下边是设定不包含的类。 -->

<context:component-scan base-package="com.test.spring.annoation" >

<!--<context:exclude-filter type="annotation"其中express属性值是倒入的系统包。 <context:exclude-filter

type="annotation" expression="org.springframework.stereotype.Repository"/> -->

<!-- <context:include-filter>子节点 指定包含哪些类节点,但是需要在父节点中使用use-default-filters设置为false -->

<!--不包含某个类

<context:exclude-filter type="assignable" expression="com.test.spring.annoation.repository.UserRepository"/> -->

<!-- 只包含某个类

<context:include-filter type="assignable" expression="com.test.spring.annoation.repository.UserRepository"/>

-->

</context:component-scan>

使用@Autowired自动装配Bean

@Autowire注解自动配置具有兼容类型的单个bean属性

--构造器。普通字段(即使非public)一切具有参数的方法都可以应用@Autowired注解

--默认情况下,所有使用@Autowired注解属性都要被设置,当spring找不到匹配的bean装配属性时,会抛出异常。若某一个属性

不允许被设置,可以设置@Autowired直接的required属性为false;意思就是如果引用另外一个类的对象时候,那个类没有放入到ioc容器。

此时将会包异常,我们可以在该属性上边加上@Autowired(required=false).此时如果要打印该对象时候会打印出null,不会抛出错误异常

--默认情况下当ioc容器窜在多个类型兼容的bean时候,通过类型的自动装配将无法工作。此时可在@Qualifilter

已指定注入Bean的名称

--@Autowired注解也可以应用在数组类型的属性上。此时spring读取该属性集合的类型信息。然后自动装配所有与之兼容bean。

--@Authwired注解用在java.util.Map上时。若该map的键值为String。那么spring将自动装配与之Map值类型兼容的bean。此时bean的名称作为建筑

AOP前奏

--需求-日志:在程序执行期间追踪正在发生的活动。

--需求-希望计算器只能处理正数的预算。

AOP简介

AOP(Aspect-Oriented Programming,面向切面编程)是一种新的方法论,是传统OOP(Object-Oriented Programming,面向切面编程)的补充

AOP的主要编程对象是切面(aspect)而切面模块化横切 关注点

在应用AOP编程。仍然需要定义公共功能,但可以明确的定义这个功能在哪里,以什么方式应用,并且不必修改受影响的类。这样以来

关注横切关注点就被模块化到特殊的对象(切面)里。

AOP的好处:

-每个事物逻辑位于一个位置。代码不分散,便于维护和升级

-业务模块更简洁。只包含核心业务代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐