Spring Bean配置细节

可用字符串表示的值,可以通过

元素标签或value属性进行注入。

如果字面值包含特殊字符,可以使用<![CDATA[]]>包裹起来

属性值可以使用value直接进行配置

<constructor-arg type=java.lang.String>
    <value><![CDATA[<ShangHai^>]]></value>
</constrctor-arg>

在Spring容器读取bean配置创建bean实例之前。必须对它进行实例化,只有容器实例化后,才可以从IOC容器获取bean的实例。

IOC容器的实现方式:

  • BeanFactory:IOC创建基本实现,面向Spring本身;
  • ApplicationContext: 提供更多高级特性,是BeanFactory的子接口,面向Spring框架的开发者

    几乎所有的应用场合都直接使用ApplicationContex而非底层的BeanFactory,无论那种方式,配置文件相同。

    AplicationContext主要实现类:

  • ClassPathXmlApplicationContext:从类路径下加载配置文件
  • FileSystemXmlApplicationContext:从文件系统加载配置文件

ApplicationContext初始化上下文时就实例化所有单例bean。

基于Setter函数的依赖注入,容器会调用Bean无参构造函数,或无参数的工厂方法,再调用Setter方法实现依赖注入。

使用utility schema定义集合

使用基本的集合标签定义集合时,不能将集合作为独立的Bean定义,导致其他Bean无法引用该集合,所以无法在不同Bean之间共享集合。

可以使用util schema 里的集合标签定义独立的集合Bean需要注意的是,必须在 根元素里添加util schema定义。

p命名空间

简化property的应用

<bean id="**" class="**">
    p:name="**"
    p:car-ref="**"
</bean>

autowire

可以使用autowire属性指定自动装配的方式。

byName根据bean的名字和当前bean的setter风格属性名进行自动装配,若有匹配,进行自动装配,没有则不装配。

byType根据bean的属性的类型进行自动装配。若IOC容器中有1个以上的类型匹配的bean,则抛异常。

bean作用域

singeton: 默认值,(容器初始化时创建bean实例),在整个容器的生命周期内只创建以一个bean。

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

使用外部属性文件

配置bean时,在bean配置中混入系统部署的细节信息(文件路径,数据源配置信息),部署细节要和bean配置相分离。

spring提供PropertyPlaceholderConfigurer的BeanFactory后置处理器,将用户bean配置到外移的属性文件。${var}的变量。Spring使用$(propName),实现属性相互吸引。

SpEL

Spring表达式语言,支持运行时查询和操作对象图的强大表达式语言

类似于EL:SpEL使用#{…}作为定界符

  • 通过bean的id对bean进行引用
  • 调用方法以及引用对象的属性
  • 计算表达式的值
  • 正则表达式的匹配

bean生命周期方法

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

  • 通过构造器或工厂方法创建bean的实例
  • 为bean的属性设置值和对其他bean的引用
  • bean可以使用了
  • 当容器关闭时,调用bean的销毁方法

在bean的申明中,设置init-method和destroy-method属性,为bean指定从初始化和销毁方法。

实现BeanPostProcessor接口,并具体提供

Object postProcessBeforeInitialization(Object bean, String beanName): init-method之前被调用

Object postProcessAfterInitialization(Object bean, String beanName): destroy-method之前被调用

bean:bean实例本身

beanName:IOC容器配置的bean的名字

返回值:实际上返回给用户的那个bean,可以在以上两方法修改返回bean,或返回一个新bean

不需要配置id,IOC容器自动识别是一个BeanPostProcessor

静态工厂方法配置

直接调用某一个类的静态方法可以返回bean的实例

class属性:指向工厂方法的全类名

factory-method:指向工厂方法的名字

constructor-arg:工厂方法需要配置参数,则使用constructor-arg

单例factory,需要指定factory-bean

factorybean 需要实现

通过factoryBean配置bean实例,class指向factorybean的全类名,peoperty可以配置factorybean的属性,但是返回的是factorybean中getObject()方法返回的实例

注解

Spring可以从classpath下自动扫描,侦测和实例化具有特定注解的组件

  • @component:基本注解,标识了一个受Spring管理的组件
  • @Repository:标识持久层组件
  • @Service:标识服务层组件
  • @Controller:标识表现层组件

Spring默认命名策略:使用非限定类名,第一个字母小写,也可以在注解中通过value属性标识组件名称。

在classpath中扫描组件

组件类使用特定的注解,需要在Spring的配置文件声明

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

    -如果仅需要扫描特定的类而非基包下所有的包,可以使用resource-pattern属性过滤特定的类,示例:

  • 子节点表示要包含的目标类

  • 字节点表示要排除在外的目标类
  • 下可以拥有若干个

其中
z主要支持多种类型的过滤表达式

  • annotation: 该类型采用目标类是否标注了某个注解进行过滤
  • assinable:该类型采用目标类是否继承或扩展某个特定类进行过滤

组件装配

元素会自动注册AutowiredAnnotationBeanPostProcessor实例,该实例可以自动装配具有@Autowired和@Resource、@Inject注解的属性。

@Autowired自动装配bean

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

  • 构造器,普通字段(即使非public),一切具有参数的方法都可以应用@Autowired注解
  • 默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时,会抛出异常。若某一属性允许不被设置(没有被bean注入IOC),可以设置@Autowired注解的required属性为false
  • 默认情况下,当IOC容器里存在多个类型兼容的Bean,通过类型的自动装配将无法工作,此时可以在@Qualifier注解提供Bean的名称,Spring允许对方法的入参标注@Qualifier已指定注入Bean的名称
  • @Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的Bean进行自动装配
  • Autowired注解可以应用在集合属性上,此时Spring读取该集合的类型信息,自动装配所有与之兼容的Bean
  • Aurowired注解用在java.util.Map上,Map的键值为String,那么Spring将自动匹配与之兼容的Bean

@Resource和@Inject和@Autowired功能相类似建议使用@Autowired

原文 

http://huihui.kim/2017/09/17/Spring属性配置细节/

PS:如果您想和业内技术大牛交流的话,请加qq群(527933790)或者关注微信公众 号(AskHarries),谢谢!

转载请注明原文出处:Harries Blog™ » Spring Bean配置细节

赞 (0)

分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址