• 2015年12月10日 spring初级知识讲解(二)最小化Spring XML配置 注解


    序,随着Spring容器管理Bean数量增加,XML文件会越来越大,而且纯手工配置XML很繁琐,Spring和JAVA都提供了一些注解方式用以简化XML配置。

    目录

    一、自动装配(autowiring)
    1 byName
    2 byType
    3 constructor
    4 autodetect
    5 默认自动装配
    二、使用注解自动装配
    1 使用@AutoWired
    2 使用@Qualifier限定歧义性的依赖
    3 @Inject
    4 @Named
    三、自动检测(autodiscovery)
    1 构造型(stereotype)注解
    2 过滤组件扫描
    四、使用Spring基于Java的配置
    1 定义一个配置类
    2 声明一个简单的Bean

     一、自动装配(autowiring)

    自动装配有助于减少<property>元素和<constructor-arg>元素。

    自动装配粗略有四种byName/byType/constructor/autudetect,自动装配策略用在<beans>或<bean>节点,达到减少XML配置的目的,自动装配只能适用于部分场景,要和手动装配搭配使用。

    1 byName

    与bean的属性具有相同名字的其他bean自动装配到bean的对应属性中。

    例子:添加autowire="byName"后,缺少的参数就会寻找同名的bean名字进行装配。

    <bean id="poeticDuke" class="single.spring.PoeticJuggler" autowire="byName">

    2 byType

    与bean的属性具有相同类型的其他bean自动装配到bean的对应属性中。

    autowire="byType"

    3 constructor

    与bean的构造器入参具有相同类型的其他bean自动装配到bean构造器的对应入参中

    autowire="constructor"

    4 autodetect

    首先尝试使用constructor进行自动装配,如果失败,再尝试使用byType进行自动装配。

    autowire="autodetect"

    5 默认自动装配

    如果需要为spring应用上下文中的每个Bean配置相同的autowire属性,就可以配置相同的自动装配策略来简化配置,在<beans>上增加一个default-autowire属性。

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
           http://www.springframework.org/schema/context "
    
           default-autowire
    ="byType">

    注意事项:当使用constructor自动装配策略时,我们必须让Spring自动装配构造器的所有入参---我们不能混合使用constructor自动装配策略和<constructor-arg>元素。

    二、使用注解自动装配

    Spring2.5开始开始使用注解自动装配Bean的属性。

    使用<context:annotation-config/>启动基于注解的自动装配。

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
           http://www.springframework.org/schema/context ">
           <context:annotation-config/>
           <!-- bean declarations go here -->
    </beans>

     1 使用@AutoWired

    org.springframework.beans.factory.annotation.Autowired

    对属性的set方法、构造器、甚至是Bean引用的任意方法,Spring会对该方法执行byType自动装配。

    例子

    @Autowired
    public void setInstrument(Instrument instrument) {
       this.instrument = instrument;
    }

    另外也可对属性直接标注,required=false表示,当无匹配Bean时,默认赋值为null。而不会抛出NoSuchBeanDefinitionException

        @Autowired(required=false)
        private Instrument instrument;

    2 使用@Qualifier限定歧义性的依赖

    org.springframework.beans.factory.annotation.Qualifier

    当匹配的Bean太多时,需要使用Qualifier来限定范围。

    例如:指定ID为guitar的bean

        @Autowired(required=false)
        @Qualifier("guitar")
        private Instrument instrument;

    3 @Inject

    javax.inject.Inject

        @Inject
        private Poem poem;

    4@Named

    javax.inject.Named

        @Inject
        @Named("guitar")
        private Poem poem;

    三、自动检测(autodiscovery)

    自动检测比自动装配更进了一步,让spring能够自动识别哪些类需要被配置成Spring Bean,从而减少对<bean>元素的使用。

     例子:base-package="com.springinaction.springidol"制动了扫描的包及其子包。

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   
           http://www.springframework.org/schema/context ">
           <context:component-scan
               base-package="com.springinaction.springidol">       
           </context:component-scan>
    </beans>

    1  构造型(stereotype)注解

    @Component---通用的构造型注解,标识该类为Spring组件

    org.springframework.stereotype.Component

    @Component("name")此时为类指定ID为name,否则默认类名首字母小写。

    @Controller---标识将该类定义为Spring MVC controller

    org.springframework.stereotype.Controller

    @Repository---标识该类定义为数据仓库

    org.springframework.stereotype.Repository

    @Service---标识该类定义为服务

    org.springframework.stereotype.Service

    2 过滤组件扫描

     配置Instrument类的所有子类都自动注册为Spring容器的Bean

        <context:component-scan base-package="com.springinaction.springidol">
            <context:include-filter type="assignable" expression="com.springinaction.springidol.Instrument" />        
        </context:component-scan>

      除了使用自定义@SkipIt注解的类,其他所有的Instrument实现都需要注册为Spring容器的Bean。

        <context:component-scan base-package="com.springinaction.springidol">
            <context:include-filter type="assignable" expression="com.springinaction.springidol.Instrument" />  
            <context:exclude-filter type="annotation" expression="com.springinaction.springidol.SkipIt" />  
        </context:component-scan>

    过滤器类型type的取值及示意:

    过滤器类            型               描述                                            
    annotation 过滤器扫描使用指定注解所标注的那些类。通过expression属性指定要扫描的注解
    assignable 过滤器扫描派生于expression属性所指定类型的那些类
    aspectj 过滤器扫描与expression属性所指定的AspectJ表达式所匹配的那些类
    custom 使用自定义的org.springframework.core.type.TypeFilter实现类,该类由expression属性指定
    regex 过滤器扫描类的名称与expression属性所指定的正则表达式所匹配的那些类。

    四、使用Spring基于Java的配置

     spring 3.0提供了利用纯粹Java代码来配置spring应用了。

    <context:component-scan base-package="com.springinaction.springidol" />不仅自动注册那些使用构造型(stereotype)注解所标注的Bean,而且也会自动加载使用@Configuration注解所标注的类。

    1 定义一个配置类

     @Configuration注解等价于XML中<beans>元素

    package com.springinaction.springidol;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class Juggler{
        //Bean declaration methods go here
    }

     2 声明一个简单的Bean

    org.springframework.context.annotation.Bean

    @Bean等价于<bean>,告知Spring将返回一个对象,方法名duke做为该Bean的ID,

        @Bean
        public Performer duke(){
            return new Juggler();
        }
  • 相关阅读:
    表单文件上传
    页面布局
    HDU 2089 不要62
    洛谷 P1776 宝物筛选(多重背包)
    HDU 5569 matrix
    洛谷 P1244 青蛙过河
    洛谷 P2362 围栏木桩
    洛谷 P2719 搞笑世界杯
    洛谷 P1877 [HAOI2012]音量调节
    洛谷 P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…
  • 原文地址:https://www.cnblogs.com/yaochc/p/5034791.html
Copyright © 2020-2023  润新知