Spring 使用介绍—— 零配置
Posted Matt_Cheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、
以上是关于Spring 使用介绍—— 零配置的主要内容,如果未能解决你的问题,请参考以下文章
Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解 - 基本介绍