Spring Bean配置细节author: 惠惠

来源:互联网 发布:发热丝数据 编辑:程序博客网 时间:2024/05/17 01:02

## 字面值
可用字符串表示的值,可以通过元素标签或value属性进行注入。
如果字面值包含特殊字符,可以使用

使用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配置到外移的属性文件。varSpring使(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属性过滤特定的类,示例:

组件装配

元素会自动注册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

阅读全文
0 0
原创粉丝点击