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

一、概述

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

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

  • 惯例优先原则:也称为约定大于配置(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 {
    // for: 构造器注入
    private String message1;

    // for: 字段注入
    @Autowired
    private String message2;

    // for: 静态字段不能注入
    @Autowired
    private static String message3;

    // for: 方法注入
    private String message4;

    // for: 泛型注入
    @Autowired
    private List<String> messages;

    // for: 泛型注入(指定具体类型)
    @Autowired
    private ArrayList<String> messages2;

    @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;
    }

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

原文地址:https://www.cnblogs.com/MattCheng/p/9014958.html

时间: 2024-08-09 20:21:19

Spring 使用介绍(八)—— 零配置的相关文章

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

Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后台的纯Java开发,很少涉及web开发这块,最近换了个纯的互联网公司,需要做Web后台管理系统,之前都是用xml配置的项目,接触了公司Spring4.x的零配置项目,觉得非常有感觉,不仅仅配置简单,而且条理清晰,所以,这里把学习的内容记录下来,一来加深对这块技术的印象,另外准备做个简单的教程,如果给

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

经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源.视图和消息器>两篇博文的介绍,我们已经配置好了Spring所需的基本配置.在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类. 我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现

Spring AOP基于注解的“零配置”方式

Spring AOP基于注解的“零配置”方式: Spring的beans.xml中 <!-- 指定自动搜索Bean组件.自动搜索切面类 --> <context:component-scan base-package="org.crazyit.app.service,org.crazyit.app.aspect"> <context:include-filter type="annotation" expression="or

Spring零配置

@Component :标注一个普通的Spring Bean类. @Controller: 标注一个控制器组件类. @Service:标注一个业务逻辑组件类. @Repository:标注一个DAO组件类. 首先要使用注解需要配置Spring自动扫描的包 <!-- 自动扫描该路径下的所有类 --> <context:component-scan base-package="com.manager"/> 将ScheduleDaoImp类注入在Spring中,此时S

spring boot基础之servlet3.0和spring4.x零配置相关文章

Servlet 3 + Spring MVC零配置:去除所有xml Spring4中的WebApplicationInitializer理解 servlet3注解替代web.xml 利用WebApplicationInitializer配置SpringMVC取代web.xml servlet3.0 ServletContainerInitializer初始化器 servlet 3.0笔记之servlet的动态注册 一个基于注解配置的Web项目的启动流程分析 SpringMVC4零配置 servl

【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , 面向切面编程 . 1.AOP的基本概念: AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定的切入点(Pointcut),而不与具体某个类耦合.AOP框架具有如下特征: 1.各步骤之间的良好隔离性. 2.源代码无关性. AOP的专业术语: 1.Aspect(切面) : 应用运行过程中的关

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

摘要: 在Spring 3.0之前,我们工程中常用Bean都是通过XML形式的文件注解的,少了还可以,但是数量多,关系复杂到后期就很难维护了,所以在3.x之后Spring官方推荐使用Java Config方式去替换以前冗余的XML格式文件的配置方式: 在开始之前,我们需要注意一下,要基于Java Config实现无web.xml的配置,我们的工程的Servlet必须是3.0及其以上的版本: 1.我们要实现无web.xml的配置,只需要关注实现WebApplicationInitializer这个

Spring MVC的WebMvcConfigurerAdapter用法收集(零配置,无XML配置)

原理先不了解,只记录常用方法 用法: @EnableWebMvc 开启MVC配置,相当于 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi

Spring Web MVC框架(八) 配置Spring Web MVC

这一篇文章对应于Spring参考文档 Configuring Spring MVC,讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法. 启用MVC Java配置和XML命名空间 默认配置 要启用MVC Java配置(@Controller等各种注解)和XML命名空间,如果使用的是Java配置,在配置类上再添加@EnableWebMvc注解即可. @Configuration @EnableWebMvc public class