一、概述

所谓零配置,并不是说一点配置都没有了,而是配置很少而已。通过约定来减少需要配置的数量,提高开发效率。

零配置实现主要有以下两种方式:

  • 惯例优先原则:也称为约定大于配置(convention over configuration),即通过约定代码结构或命名规范来减少配置数量,但不会减少配置文件。
  • 基于注解的规约配置:通过在指定类上指定注解,约定其含义来减少配置数量,从而提高开发效率;如事务注解@Transaction是基于注解的规约,在指定的类或方法上使用该注解就表示其需要事务。

Spring基于注解的规约配置有三个层级:

  • Bean依赖注入:通过注解方式替代基于XML配置中的依赖注入,如使用@Autowired注解来完成依赖注入。
  • Bean定义:通过注解方式进行Bean配置元数据定义,从而完全将Bean配置元数据从配置文件中移除。
  • Java类替换配置文件:使用Java类来定义所有的Spring配置,完全消除XML配置文件

二、Bean依赖注入

1、开启注解支持

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:annotation-config /> </beans>

2、@Autowired

@Autowired根据类型自动注入,可作用于字段、构造器、方法,提供required设置注入是否必须,默认为必须

public @interface Autowired {
boolean required() default true;
}

示例如下:

实体类

public class TestBean {
private String message1; // for: 字段注入
@Autowired
private String message2; // for: 静态字段不能注入
@Autowired
private static String message3; private String message4; // for: 泛型注入
@Autowired
private List<String> messages; // for: 泛型注入(指定具体类型)
@Autowired
private ArrayList<String> messages2; // for: 构造器注入
@Autowired
private TestBean(String msg) {
this.message1 = msg;
} public String getMessage1() {
return message1;
} public String getMessage2() {
return message2;
} public String getMessage3() {
return message3;
} public String getMessage4() {
return message4;
} // for: 方法注入
@Autowired
public void setMessage4(String message4) {
this.message4 = message4;
} public List<String> getMessages() {
return messages;
} public List<String> getMessages2() {
return messages2;
}
}

XML配置

<bean class="java.util.ArrayList">
<constructor-arg index="0">
<list value-type="java.lang.String">
<value>matt</value>
<value>pretty</value>
</list>
</constructor-arg>
</bean> <bean id="str" class="java.lang.String">
<constructor-arg index="0" value="kevin"/>
</bean> <bean class="cn.matt.noconfig.TestBean"></bean>

测试

@org.junit.Test
public void testAutowired() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
TestBean testBean = context.getBean(TestBean.class);
System.out.println("构造器注入:" + testBean.getMessage1());
System.out.println("字段注入:" + testBean.getMessage2());
System.out.println("静态字段不能注入:" + testBean.getMessage3());
System.out.println("方法注入:" + testBean.getMessage4());
System.out.println("泛型注入:" + testBean.getMessages());
System.out.println("泛型注入(指定具体类型):" + testBean.getMessages2());
}
/*输出:
构造器注入:kevin
字段注入:kevin
静态字段不能注入:null
方法注入:kevin
泛型注入:[kevin]
泛型注入(指定具体类型):[matt, pretty]
*/

注意,@Autowired不支持静态字段注入;对于泛型的注入,须明确指定泛型的具体类型,详细如下:

  • 数组类型、集合(Set、Collection、List)接口类型:将根据泛型获取匹配的所有候选者并注入到数组或集合中,如“List<HelloApi> list”将选择所有的HelloApi类型Bean并注入到list中,而对于集合的具体类型将只选择一个候选者,“如 ArrayList<HelloApi> list”将选择一个类型为ArrayList的Bean注入,而不是选择所有的HelloApi类型Bean进行注入;
  • 字典(Map)接口类型:同样根据泛型信息注入,键必须为String类型的Bean名字,值根据泛型信息获取,如“Map<String, HelloApi> map” 将选择所有的HelloApi类型Bean并注入到map中,而对于具体字典类型如“HashMap<String, HelloApi> map”将只选择类型为HashMap的Bean注入,而不是选择所有的HelloApi类型Bean进行注入。

2、@Value

@Value注解用于注入SpEL表达式,可放置在字段、@Autowired注解的方法的参数上

示例如下:

实体类

public class TestBean2 {

    @Value("#{str}")
private String message1; private String message2; public String getMessage1() {
return this.message1;
} public String getMessage2() {
return message2;
} @Autowired
public void setMessage2(@Value("#{str}#{str}") String message2) {
this.message2 = message2;
}
}

XML配置:

<bean id="str" class="java.lang.String">
<constructor-arg index="0" value="kevin"/>
</bean> <bean class="cn.matt.noconfig.TestBean2"></bean>

测试:

@org.junit.Test
public void testValue() {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
TestBean2 testBean = context.getBean(TestBean2.class);
Assert.assertTrue(StringUtils.equals("kevin", testBean.getMessage1()));
Assert.assertTrue(StringUtils.equals("kevinkevin", testBean.getMessage2()));
}

3、@Qualifier

@Qualifier注解作为修饰符,与@Autowired一起使用,解决类型有多个实例时无法指定某一实例的问题

示例如下:

接口及其两个实现类

public interface Hello {
void saySomething();
}
//@Qualifier("abc")
@Component("abc")
public class HelloImpl1 implements Hello {
@Override
public void saySomething() {
System.out.println("HelloImpl1");
}
}
@Component
public class HelloImpl2 implements Hello {
@Override
public void saySomething() {
System.out.println("HelloImpl2");
}
}

XML配置

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

测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-context.xml")
public class BaseSpringTest { }
public class SpringTest extends BaseSpringTest {
@Qualifier("abc")
@Autowired
private Hello hello; @Test
public void testHello() {
hello.saySomething();
}
}

说明:

  • @Qualifier可作用于类,用于指定修饰名
  • @Qualifier与@Autowired一起使用指定某一实例时,value可为修饰名(通过@Qualifier指定),也可为bean名(通过@componet指定)
  • 相对于bean名,@Qualifier指定的修饰名可重复,多个类可共用同一修饰名,较灵活,详细可参考 @Qualifier注解

4、@Resource

@Resource注解也是自动装配,默认根据类型装配,如果指定name属性将根据名字装配,只能作用于字段和方法

@Resource(name = "标识符")
字段或setter方法

5、@PostConstruct与@PreDestroy  

@PostConstruct与@PreDestroy用于指定初始化和销毁方法,与<bean>标签的init-method和destroy-method属性指定相同

@PostConstruct
public void init() {
System.out.println("==========init");
}
@PreDestroy
public void destroy() {
System.out.println("==========destroy");
}

参考:

第十二章 零配置 之 12.1 概述 ——跟我学spring3

第十二章 零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3

Spring注解注入bean

@Qualifier注解

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 使用介绍(九)—— 零配置(二)

    三.Bean定义 1.开启bean定义注解支持 开启注解支持须添加以下配置项: <context:component-scan base-package="cn.matt"/ ...

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

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

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

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

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

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

  7. Spring MVC 学习总结(八)——Spring MVC概要与环境配置(IDEA+Maven+Tomcat7+JDK8、示例与视频)

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

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

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

  9. Spring Web工程web.xml零配置即使用Java Config + Annotation

    摘要: 在Spring 3.0之前,我们工程中常用Bean都是通过XML形式的文件注解的,少了还可以,但是数量多,关系复杂到后期就很难维护了,所以在3.x之后Spring官方推荐使用Java Conf ...

随机推荐

  1. CF833D Red-Black Cobweb 点分治、树状数组

    传送门 统计所有路径的边权乘积的乘积,不难想到点分治求解. 边权颜色比例在\([\frac{1}{2},2]\)之间,等价于\(2B \geq R , 2R \geq B\)(\(R,B\)表示红色和 ...

  2. Docker资源限制与Cgroups

    一.Linux control groups 简介     Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如 ...

  3. DOM(二)

    文档信息 document对象还有一些标准的Document对象所没有的属性: title属性:包含着<title>元素中的文本——显示在浏览器窗口的标题栏或标签页上,通过整个属性可以取得 ...

  4. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  5. Python Revisited Day 03 (组合数据类型)

    目录 第三章 组合数据类型 3.1 序列类型 3.1.1 元组 3.1.2 命名的元组 (collections.nametuple()) 3.1.3 列表 (查询有关函数点这) 3.1.4 列表内涵 ...

  6. Python—函数的名称空间

    名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方 名称空间共3种, ...

  7. PS调出怀旧雨中特写的非主流照片

    原图 最终效果 一.打开原图素材,按Ctrl + ALt + ~ 调出高光选区,按Ctrl + Shift + I 反选,然后创建曲线调整图层,适当调暗一点. 二.合并所有图层,点通道面板,选择蓝色通 ...

  8. 敏捷开发、DevOps相关书籍——书单

    自己瞎整理的一些书单,都是豆瓣评分比较高的书,可以作为选择的一个参考. 书名 豆瓣链接 持续交付:发布可靠软件的系统方法 https://book.douban.com/subject/6862062 ...

  9. jenkins+maven+tomcat集群发布

    jenkins+Gitlab+maven+tomcat实现自动集成.打包.部署 - 李栋94 - 博客园https://www.cnblogs.com/lidong94/p/7427923.html ...

  10. JMeter学习FTP测试计划(转)

    FTP服务主要提供上传和下载功能.有时间需要我们测试服务器上传和下载的性能.在这里我通过JMeter做一个FTP测试计划的例子. 1.创建一个线程组 2.线程组--->添加--->配置元件 ...