zoukankan      html  css  js  c++  java
  • 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();
        }
  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/yaochc/p/5034791.html
Copyright © 2011-2022 走看看