• Spring 使用介绍(九)—— 零配置(二)


    三、Bean定义

    1、开启bean定义注解支持

    开启注解支持须添加以下配置项:

    <context:component-scan base-package="cn.matt"/>  

    2、支持bean定义的注解

    Spring自带@Component注解及扩展@Repository、@Service、@Controller,用于定义bean,如图所示

    上述注解默认的bean名字是以小写开头的类名(不包含包名),bean的名字也可由注解的value属性明确指定

    @Service
     public class ServiceAImpl { 
        ...
     }  
     // 默认bean名称:serviceAImpl
    @Service("myService")
     public class ServiceAImpl { 
        ...
     }  
     // 明确指定

    3、自定义扩展

    可在@Component、@Repository@Service、@Controller基础上,定义自己的注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Service
    public @interface MyService {
        String value() default "";
    }

    注意,value属性可指定bean名称,与spring自带注解相同

    4、细粒度控制Bean定义扫描

    <context:component-scan>标签支持细粒度控制Bean定义扫描

    <context:component-scan  
            base-package=""  
            resource-pattern="**/*.class"  
            name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"  
            use-default-filters="true"  
            annotation-config="true">  
                    <context:include-filter type="aspectj" expression=""/>  
                    <context:exclude-filter type="regex" expression=""/>  
    </context:component-scan> 

    属性说明:

    • base-package表示扫描注解类的开始位置,即将在指定的包中扫描,其他包中的注解类将不被扫描,默认将扫描所有类路径。
    • resource-pattern表示扫描注解类的后缀匹配模式,即“base-package+resource-pattern”将组成匹配模式用于匹配类路径中的组件,默认后缀为“**/*.class”,即指定包下的所有以.class结尾的类文件。
    • name-generator默认情况下的Bean标识符生成策略,默认是AnnotationBeanNameGenerator,其将生成以小写开头的类名(不包括包名),也可以自定义自己的标识符生成策略。
    • use-default-filters默认为true表示过滤@Component、@ManagedBean、@Named注解的类,如果改为false默认将不过滤这些默认的注解来定义Bean,即这些注解类不能被过滤到,即不能通过这些注解进行Bean定义。
    • annotation-config表示是否自动支持注解实现Bean依赖注入,默认支持,如果设置为false,将关闭支持注解的依赖注入,需要通过<context:annotation-config/>开启。

    过滤器说明:

    • <context:include-filter>表示过滤到的类将被注册为Spring管理Bean。
    • <context:exclude-filter>表示过滤到的类将不被注册为Spring管理Bean,它比<context:include-filter>具有更高优先级。
    • type表示过滤器类型,目前支持注解类型、类类型、正则表达式、aspectj表达式过滤器,当然也可以自定义自己的过滤器,实现org.springframework.core.type.filter.TypeFilter即可。
    • expression表示过滤器表达式。

    过滤器使用示例:

    <!---->
    <context:include-filter type="assignable" expression="cn.matt.TestBean1"/>  
    
    <!-- 注解 -->
    <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> 
    
    <!-- 正则表达式 -->
    <context:exclude-filter type="regex" expression="cn.matt.TestBean2*"/>  

    Spring MVC中的典型配置:

    <!-- spring-context.xml中的配置 -->
    <context:component-scan base-package="com.wind.pac" use-default-filters="true">
      <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    
    <!-- spring-mvc.xml中的配置 -->
    <context:component-scan base-package="com.wind.pac" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController" />
    </context:component-scan>

    5、其他配置

    i)@Lazy:定义Bean将延迟初始化

    @Component("component")  
    @Lazy(true)  
    public class TestCompoment {  
     ...
    } 

    ii)@Scope:定义Bean作用域,默认单例

    @Component("component")  
    @Scope("singleton")  
    public class TestCompoment {  
     ...
    }  

    iii)@Qualifier:指定限定描述符,对应于基于XML配置中的<qualifier>标签

    @Component("component")  
    @Qualifier("component")  
    public class TestCompoment {  
     ...
    }  

    iv)@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

    @Component("component")  
    @Primary  
    public class TestCompoment {  
     ...
    }

     四、Java类替换配置文件

    1、简单示例

    简单类

    public class Girl {
        @Autowired
        private String name;
    
        public String getName() {
            return name;
        }
    }

    配置元数据的java类

    @Configuration
    public class MyConfig {
        @Bean
        public String myGirl() {
            return "qqm";
        }
        
        @Bean
        public Girl girl() {
            return new Girl();
        }
    }

    测试

    public class ConfigTest {
        @Test
        public void test() {
            
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
            Assert.assertTrue(StringUtils.equals("qqm", context.getBean("myGirl", String.class)));
            
            Girl girl = context.getBean(Girl.class);
            Assert.assertTrue(StringUtils.equals("qqm", girl.getName()));
        }
    }

    2、详细介绍

    i)@Configuration

    • 通过@Configuration注解的类将被作为配置类使用,表示在该类中将定义Bean配置元数据
    • @Configuration是@Component注解的扩展,因此@Configuration注解的类本身也是一个Bean
    • @Configuration注解的类不能是final的,且应该有一个默认无参构造器
    • 使用AnnotationConfigApplicationContext 指定配置类时,@Configuration注解可省略

    ii)@Bean

    @Bean(name={},  
          autowire=Autowire.NO,  
          initMethod="",  
          destroyMethod="")  
    • name:指定Bean的名字,可有多个,第一个作为Id,其他作为别名
    • autowire:自动装配,默认no表示不自动装配该Bean
    • initMethod和destroyMethod:指定Bean的初始化和销毁方法
    • 对于依赖注入,可使用赋值的方式注入(如同创建一个实体并赋值),也可使用注解的方式注入(不需要开启注解,如上例)

    iii)引入其他配置

    引入基于java方式的配置类

    @Configuration  
    @Import({MyConfig2.class})  
    public class MyConfig {  
     ...
    }  

    引入基于XML的配置

    @Configuration
    @ImportResource("classpath:spring-context.xml")  
    public class ApplicationContextConfig {  
     ...
    }  

    3、XML配置中引入Java方式的配置

    XML开启bean定义支持,并扫描到@Configuration配置类,即可引入

    参考:

    第十二章 零配置 之 12.3 注解实现Bean定义 ——跟我学spring3

    第十二章 零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3

  • 相关阅读:
    vue+antDesign 多个select下拉组件实现已选择项不可用(置灰)
    antd + vue 点击编辑文本切换成可编辑状态(附下拉框)
    antDesign的table组件设置行列样式
    jQuery 效果之显示隐藏
    jQuery 样式操作
    jQuery对象筛选选择器
    jQuery 和DOM对象互相转化方法
    JQuery-01-1
    常见网页特效
    WebApl-javescript-动画函数
  • 原文地址:https://www.cnblogs.com/MattCheng/p/9035028.html
Copyright © 2020-2023  润新知