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
Spring 使用介绍(九)—— 零配置(二)的更多相关文章
- Parcel.js + Vue 2.x 极速零配置打包体验
		
继 Browserify.Webpack 之后,又一款打包工具 Parcel 横空出世 Parcel.js 的官网有这样的自我介绍 “极速零配置Web应用打包工具” 简单接触了一下,单从效率上来说,确 ...
 - Parcel + Vue 2.x 极速零配置打包体验
		
继 Browserify.Webpack 之后,又一款打包工具 Parcel 横空出世 Parcel.js 的官网有这样的自我介绍 “极速零配置Web应用打包工具” 简单接触了一下,单从效率上来说,确 ...
 - Spring Cloud 微服务入门(二)--Spring Cloud 架构
		
Spring Cloud整体核心架构:Rest服务,在Spring Cloud配置过程中,都是遵循Rest风格规范,在Rest处理中,必不可少两个对象端:服务的提供者(provider)和服务消费者( ...
 - Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍
		
Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...
 - Spring 使用介绍(八)—— 零配置(一)
		
一.概述 所谓零配置,并不是说一点配置都没有了,而是配置很少而已.通过约定来减少需要配置的数量,提高开发效率. 零配置实现主要有以下两种方式: 惯例优先原则:也称为约定大于配置(convention ...
 - Spring 基于注解零配置开发
		
本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...
 - 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
		
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
 - spring+hibernate+struts2零配置整合
		
说句实话,很久都没使用SSH开发项目了,但是出于各种原因,再次记录一下整合方式,纯注解零配置. 一.前期准备工作 gradle配置文件: group 'com.bdqn.lyrk.ssh.study' ...
 - Spring 使用介绍(十二)—— Spring Task
		
一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...
 
随机推荐
- 【原创】自己动手写一个能操作redis的客户端
			
引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...
 - Winform开发框架中的内容及文档管理模块功能介绍
			
在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...
 - JSOUP如何优秀的下载JPEG等二进制图像
			
引言 JSOUP默认是不支持解析JPEG等二进制图像的,解决方法也很简单,只需要加上Jsoup.ignoreContentType(true)这一行代码就可以.关于这一点的原因,来看看官方API说明. ...
 - OSGI 环境搭建
			
第一步,打开eclipse,新建一个plugin工程,如下图所示 第二步,输入工程的名字,并且在Target Platform中选择an OSGI framework中选中standard,如下图所示 ...
 - 关于jsp中jstl-core标签循环遍历的使用
			
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...
 - Python 内置库 sys用法
			
sys模块功能众多,这边先学习几个常用的方法sys常见函数列表① sys.argv: 实现从程序外部向程序传递参数.其实sys.argv[]就是一个列表,里面的项为用户输入的参数,但是sys.argv ...
 - CSS scroll-behavior属性: 滚动框指定滚动行为
			
概念 当用户手动导航或者 CSSOM scrolling API 触发滚动操作时,CSS 属性 scroll-behavior 为一个滚动框指定滚动行为,其他任何的滚动,例如那些由于用户行为而产生的滚 ...
 - codeforces#580 D. Kefa and Dishes(状压dp)
			
题意:有n个菜,每个菜有个兴奋值,并且如果吃饭第i个菜立即吃第j个菜,那么兴奋值加ma[i][j],求吃m个菜的最大兴奋值,(n<=18) 分析:定义dp[status][last],statu ...
 - 使用redis限制ip访问次数
			
策略1: 在redis中保存一个count值(int),key为user:$ip,value为该ip访问的次数,第一次设置key的时候,设置expires. count加1之前,判断是否key是否存在 ...
 - 如何让pl/sql developer记住密码,实现快速登录
			
前两天,有同事使用plsql的时候,切换数据库的时候需要不断的重复输入密码,这样太麻烦了. 下面,我这里说下如何的实现plsql不需要输入密码就能快速登录的方法: 1.一开始登录,首先像往常那样输入密 ...