三、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

Spring 使用介绍(九)—— 零配置(二)的更多相关文章

  1. Parcel.js + Vue 2.x 极速零配置打包体验

    继 Browserify.Webpack 之后,又一款打包工具 Parcel 横空出世 Parcel.js 的官网有这样的自我介绍 “极速零配置Web应用打包工具” 简单接触了一下,单从效率上来说,确 ...

  2. Parcel + Vue 2.x 极速零配置打包体验

    继 Browserify.Webpack 之后,又一款打包工具 Parcel 横空出世 Parcel.js 的官网有这样的自我介绍 “极速零配置Web应用打包工具” 简单接触了一下,单从效率上来说,确 ...

  3. Spring Cloud 微服务入门(二)--Spring Cloud 架构

    Spring Cloud整体核心架构:Rest服务,在Spring Cloud配置过程中,都是遵循Rest风格规范,在Rest处理中,必不可少两个对象端:服务的提供者(provider)和服务消费者( ...

  4. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

  5. Spring 使用介绍(八)—— 零配置(一)

    一.概述 所谓零配置,并不是说一点配置都没有了,而是配置很少而已.通过约定来减少需要配置的数量,提高开发效率. 零配置实现主要有以下两种方式: 惯例优先原则:也称为约定大于配置(convention ...

  6. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  7. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  8. spring+hibernate+struts2零配置整合

    说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置. 一.前期准备工作 gradle配置文件: group 'com.bdqn.lyrk.ssh.study' ...

  9. Spring 使用介绍(十二)—— Spring Task

    一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...

随机推荐

  1. 内联函数:static inline 和 extern inline 的含义

    引入内联函数的目的是为了解决程序中函数调用的效率问题. 函数是一种更高级的抽象.它的引入使得编程者只关心函数的功能和使用方法,而不必关心函数功能的具体实现:函数的引入可以减少程序的目标代码,实现程序代 ...

  2. 开启Tomcat的manager页面访问

    如何进入Tomcat的manager页面 一张图解决! 找到conf目录下的tomcat-users.xml文件,打开. <role rolename="admin-gui" ...

  3. Python股票分析系列——系列介绍和获取股票数据.p1

    本系列转载自youtuber sentdex博主的教程视频内容 https://www.youtube.com/watch?v=19yyasfGLhk&index=4&list=PLQ ...

  4. 第十五次oo作业

    作业十五 测试与正确性论证的效果差异 程序的测试需要通过输入特定数据等方式,检查程序是否和预期相同,因为测试不可能穷举,导致了不穷举的测试不可能验证程序是完全正确的,只能验证程序在测试时没有发生错误, ...

  5. 学习用Node.js和Elasticsearch构建搜索引擎(1):了解并运行Elasticsearch

    1.学习Elasticsearch概述. 了解Elasticsearch是什么?能做什么?可以查一下elasticsearch.lucene等的相关介绍,另外也可以查查资料比较一下其它的搜索引擎sph ...

  6. H5 audio标签

    37-audio标签 注意点: audio标签的使用和video标签的使用基本一样, video中能够使用的属性在audio标签中大部分都能够使用, 并且功能都一样 只不过有3个属性不能用, heig ...

  7. 【kindle笔记】之 《鬼吹灯》-9-20

    [kindle笔记]读书记录-总 9-20 日常吐槽 连着几天,基本是一口气读完了鬼吹灯. 想来,也算是阴差阳错了.本来是想看盗墓的,读了几页开头,心想坏了,拷贝错了,这是鬼吹灯-- 讲真的,每每读小 ...

  8. 基于CRM跟进(活动)记录中关键字识别的客户跟进加权值的成单概率算法

    1.提取销售人员的跟进记录,分析其中的骂人文字(负面情绪),将有负面情绪的客户的跟进排期,进行降权(权重)操作.重点跟进加权值较高的客户. 执行办法: 将销售与客户沟通的语音:电话,微信,QQ,通过调 ...

  9. windows 内建环境变量

    PS C:\Windows> ls env: Name Value ---- ----- _NT_SYMBOL_PATH srv*C:\Users\vv\Documents\symbols AL ...

  10. HTML中的几种空格

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(       ‌‍)在不同浏览器中宽度各异.     ...