如何完成spring的最小化XML配置

一、自动装配

1、四种类型的自动装配

类型 解释 xml 配置
byName 根据 Bean 的 name 或者 id <bean id=”bean” class=”…” autowire=”byName”/>
ByType 根据 Bean 类型自动装配 <bean id=”bean” class=”…” autowire=”byType”/>
contructor 根据 Bean 的构造器入参具有相同类型 同上
Autodetect 首先使用 contructor,失败再尝试 byType 同上

byType 在出现多个匹配项时不会自动选择一个然是报错,为避免报错,有两种办法:1.使用<bean>元素的 primary 属性,设置为首选 Bean,但所有 bean 的默认 primary 都是 true,因此我们需要将所有非首选 Bean 设置为false;2.将 Bean 的autowire-candidate熟悉设置为false,取消 这个 Bean 的候选资格,这个 Bean 便不会自动注入了。

contructor 自动装配和 byType 有一样的局限性,当发现多个 Bean 匹配某个构造器入参时,Spring 不会尝试选择其中一个;此外,如果一个类有多个构造器都满足自动装配的条件,Spring 也不会猜测哪个更合适使用。

2、默认自动装配

如果需要为 Spring 应用上下文中的每个 Bean(或者其中的大多数)配置相同的 autowire 属性,可以在根元素<beans>上增加一个 default-autowire 属性,默认该属性设置为 none。该属性只应用于指定配置文件中的所有 Bean,并不是 Spring 上下文中的所有 Bean。

3、混合使用自动装配和显式装配

当我们对某个 Bean 使用了自动装配策略,并不代表我们不能对该 Bean 的某些属性进行显示装配,任然可以为任意一个属性配置<property>元素,显式装配将会覆盖自动装配。但是当使用 constructor 自动装配策略时,我们必须让 Spring 自动装配构造器所有入参,不能使用<constructor-arg>元素进行混合。

二、注解装配

从 Spring2.5 开始,可以使用注解自动装配 Bean 的属性,使用注解允许更细粒度的自动装配,可选择性的标注某一个属性来对其应用自动装配。Spring 容器默认禁用注解装配,需要在 Spring 配置中启用,最简单的启用方式是使用 Spring 的 context 命令空间配置中的<context:annotation-config>,如下所示:

<beans ...>
<context:annotation-config/>
<!-- bean declarations go here -->
</beans>

Spring3 支持几种不同的用于自动装配的注解:

  • Spring 自带的@Autowired 注解
  • JSR-330 的@Inject 注解
  • JSR-250 的@Resource 注解

1、使用@Autowired

@Autowired 用于对被注解对象启动 ByType 的自动装配,可用于以下对象:

  • 类属性,即使私有属性也能注入
  • set 方法
  • 构造器
  • 任意需要装配 Bean 的方法

在使用@Autowired 时有两种情况会出错:没有匹配的 Bean 和存在多个匹配的 Bean,但是都有对应的解决方法。

当没有匹配 Bean 时,自动装配会抛出 NoSuchBeanDefinitionException,如果不想抛出可使用 required 属性,设置为 false 来配置可选的自动装配,即装配失败就不进行装配,不会报错。

@Autowired(required=false)

当使用构造器配置时,只有一个构造器可以将 required 属性设置为 true,其他都只能设置为 false。此外,当使用注解标注多个构造器时,Spring 会从所有满足装配条件的构造器中选择入参最多的那个。

当存在多个 Bean 满足装配条件时,Spring 也会抛出 NoSuchBeanDefinitionException 错误,为了选择指定的 Bean,我们可以使用@Qualifier 注解进行筛选:

@Autowired
@Qualifier("name1")//筛选名为name1的Bean
private TestClass testClass;

除了通过 Bean 的 ID 来缩小选择范围,我们还可以通过直接在 Bean 上使用 qualifier 来缩小范围,限制 Bean 的类型,xml 如下:

<bean class="com.test.xxx">
<qualifier value="stringed"/>
</bean>

注解如下:

@Qualifier("stringed")
public class xxx{}

还可以创建自定义限定器(Qualifier)

创建自定义限定器只需要使用@Qualifier 注解作为它的源注解即可,如下创建了一个 Stringed 限定器:

@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Stringed{}

然后使用它注解一个 Bean:

@Stringed
public class Guitar{}

然后就可以进行限定了:

@Autowired
@Stringed
private Guitar guitar;

2、使用@Inject 自动注入

为统一各种依赖注入框架的编程模型,JCP(Java Community Process)发布的 Java 依赖注入规范,被称为 JSR-330,从 Spring3 开始,Spring 已经开始兼容该依赖注入模型。

和@Autowired 一样,@Inject 可以用来自动装配属性、方法和构造器。但是@Inject 没有 required 属性,因此依赖关系必须存在,如不存在将抛出异常。

JSR-330 还提供另一种注入技巧,注入一个 Provider。Provider 接口可以实现 Bean 引用的延迟注入以及注入 Bean 的多个实例等功能。

例如我们有一个 KnifeJuggler 类需要注入一个或多个 Knife 实例,假设 Knife Bean 的作用域声明为 prototype,下面的 KnifeJuggler 的构造器将获得多个 Knife Bean:

private Set<Knife> knifes;
@Inject
public KnifeJuggler(Provider<Knife> knifeProvider){
knives = new HashSet<Knife>();
for(int i=0;i<5;i++){
knives.add(knifeProvider.get());
}
}

相对于@Autowired 所对应的@Qualifier,@Inject 对应的是@Named 注解。事实上 JSR-330 中也有@Qualifier 注解,不过不建议直接使用,建议通过该注解来创建自定义的限定注解,和 Spring 的@Qualifier 创建过程类似。

3、注解中使用表达式

Spring3 中引入的@Value属性可用来装配 String 类型的值和基本类型的值。借助 SpEL 表达式,@Value 不光可以装配硬编码值还可以在运行期动态计算表达式并装配,例如下面的:

@Value("#{systemProperties.name}")
private String name;

三、自动检测 Bean

在 Spring 中使用上面说到的<context:annotation-config>,可以做到自动装配,但还是要在 xml 中申明 Bean。Spring 还有另一个元素<context:component-scan>,元素除了完成自动装配的功能,还允许 Spring 自动检测 Bean 和定义 Bean ,用法如下:

<beans ...>
<context:component-scan base-package="com.springtest">
</context:component-scan>
</beans>

开启后支持如下注解:

注解 解释
@Component 通用的构造型注解,标识类为 Spring 组件
@Controller 标识该类定义为 Spring MVC controller
@Repository 标识该类定义为数据仓库
@Service 标识该类定义为服务

使用上述注解是 Bean 的 ID 默认为无限定类名。使用@Component("name")指定 ID。

1、过滤组建扫描

通过为\context:component-scan配置<context:include-filter>和<context:exclude-filter>子元素,我们可以随意调整扫描行为。下面的配置自动注册所有的 TestInterface 实现类:

<context:component-scan base-package="com.fxb.springtest">
<context:include-filter type="assignable"
expression="com.fxb.springTest.TestInterface"/>
</context:component-scan>

其中的 type 和 expression 属性一起协作来定义组件扫描策略。type 有以下值可选择:

过滤器类型 描述
annotation 过滤器扫描使用指定注解所标注的类。通过 expression 属性指定要扫描的注解
assignable 过滤器扫描派生于 expression 属性所指定类型的那些类
aspectj 过滤器扫描于 expression 属性所指定的 AspectJ 表达式所匹配的那些类
custom 使用自定义的 org.springframework.core.type.TypeFilter 实现类,该类由 expression 属性指定
regex 过滤器扫描类的名称与 expression 属性所指定的正则表达式所匹配的类

exclude-filter 使用和 include-filter 类似,只是效果相反。

四、使用 Spring 基于 Java 的配置

在 Spring3.0 中几乎可以不使用 XML 而使用纯粹的 Java 代码来配置 Spring 应用。

首先还是需要极少量的 XML 来启用 Java 配置,就是上面说到的<context:component-scan>,该标签还会自动加载使用@Configuration注解所标识的类

@Configuration 注解相当于 XML 配置中的\元素,这个注解将会告知 Spring:这个类包含一个或多个 Spring Bean 的定义,这些定义是使用@Bean 注解所标注的方法

申明一个简单的 Bean 代码如下:

@Configuration
public class TestConfig{
@Bean
public Animal duck(){
return new Ducker();
}
}

@Bean 告知 Spring 这个方法将返回一个对象,该对象应该被注册为 Spring 应用上下文中的一个 Bean,方法名作为该 Bean 的 ID 。想要使用另一个 Bean 的引用也很简单,如下:

@Bean
public Food duckFood(){
return new DuckFood();
}
@Bean //通过方法名引用一个Bean,并不会创建一个新的实例
public Animal duck(){
return new Ducker(DuckFood());
}

五、小结

终于写完了 spring 的最小化配置,对 spring 的各种注解也有了一些了解,再不是之前看到注解一脸莫名其妙了,虽然现在 Springboot 已经帮我们做了零 XML 配置,但觉得还是有必要了解下 XML 配置实现,这样对 Java 的配置实现理解也会更加深刻。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring接口通过配置支持返回多种格式(xml,json,html,excel)

    1. 简介 本文主要给大家介绍使用SpringMVC的后端服务如何通过配置来支持多种返回值类型(xml,json,html,excel) 这里的代码使用的是springboot,下载地址:https://github.com/xiagn825/springboot-todolist/tree/springboot-ContentNegotiation 2. 基础概念 2.1 HttpHeader中Content-Type和Accept设置的区别 Accept:接口要返回给客户端的数据格式 cur

  • Spring根据XML配置文件注入属性的方法

    方法一使用setter方法 package com.swift; public class Book { private String bookName; public void setBook(String bookName) { this.bookName = bookName; } @Override public String toString() { return "Book [book=" + bookName + "]"; } } 在Spring框架中

  • Spring中的事务操作、注解及XML配置详解

    事务 事务全称叫数据库事务,是数据库并发控制时的基本单位,它是一个操作集合,这些操作要么不执行,要么都执行,不可分割.例如我们的转账这个业务,就需要进行数据库事务的处理. 转账中至少会涉及到两条 SQL 语句: update Acoount set balance = balance - money where id = 'A'; update Acoount set balance = balance + money where id = 'B' 上面这两条 SQL 就可以要看成是一个事务,必

  • Spring根据XML配置文件 p名称空间注入属性的实例

    要生成对象并通过名称空间注入属性的类 代码如下: package com.swift; public class User { private String userName; public void setUserName(String userName) { this.userName = userName; } public String fun() { return "User's fun is ready."+this.userName; } } XML配置文件写法如下: &

  • SpringBoot通过yml和xml文件配置日志输出方法

    SpringBoot中默认使用Logback进行日志输出,可以同时使用SpringBoot框架的配置文件application.yml或是通过logback的配置文件logback.xml进行配置. 通过application.yml配置 <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 勿在 Lo

  • Spring装配Bean教程之XML安装配置bean详解

    前言 众所周知在Spring刚出现的时候,XML是描述配置的主要方式,在Spring的名义下,我们创建了无数行XML代码.在一定程度上,Spring成为了XML的同义词. 现在随着强大的自动化配置和Java代码的配置出现,XML不再是唯一选择,也不应该是首选,学习XML配置,更多用于维护已有的XML的配置.下面话不多说了,来一起看看详细的介绍吧. 创建XML配置规范 在使用XML配置前,需要创建一个新的配置规范,就像JavaConfig需要我们创建带有 @Configuration注解的类,而在

  • spring mvc 读取xml文件数据库配置参数的方法

    本文主要介绍怎么通过属性注入与构造器注入实现把我们项目中要用到的数据库参数放到xml文件里面去,方便部署. spring mvc 4.2.6项目 SQL Server 2008数据库 本文介绍的主要使用ApplicationContext以及其实现类实现.主要用到的是ClassPathXmlApplicationContext. ClassPathXmlApplicationContext:从类路径ClassPath中寻找指定的XML配置文件,找到并装载 完成ApplicationContext

  • spring Mvc配置xml使ResponseBody返回Json的方法示例

    前言 学习了spring mvc后,发现spring mvc返回json数据比struts2要方便,使用@ResponseBody就可以了 @ResponseBody 在返回的数据不是html标签的页面,而是其他某种格式的数据时(如json.xml等)使用: 不在springMvc中配置json的处理的话,我们通常会在Controller层中获取到数据之后进行类型转化,将数据转成json字符串,比如调用fastjson进行转化,如下 @RequestMapping("/getCategoryTr

  • 如何完成spring的最小化XML配置

    一.自动装配 1.四种类型的自动装配 类型 解释 xml 配置 byName 根据 Bean 的 name 或者 id <bean id="bean" class="-" autowire="byName"/> ByType 根据 Bean 类型自动装配 <bean id="bean" class="-" autowire="byType"/> contructo

  • Spring MVC的web.xml配置详解

    spring是目前最流行的框架.创建java web项目时,我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中.下面我们将简单讲讲web.xml中的配置. 一.一个空的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns:xsi="http://www.w3.org/2001/

  • 详解Spring Aop实例之xml配置

    AOP的配置方式有2种方式:xml配置和AspectJ注解方式.今天我们就来实践一下xml配置方式. 我采用的jdk代理,所以首先将接口和实现类代码附上 package com.tgb.aop; public interface UserManager { public String findUserById(int userId); } package com.tgb.aop; public class UserManagerImpl implements UserManager { publ

  • spring中aop的xml配置方法实例详解

    前言 AOP:即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等. aop,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征的时候诗人可以去欢送,当骑士英勇牺牲的时候,诗人可以写诗歌颂骑士的一生.那么骑士只需要关注怎么打仗就好了.而诗人也只需要关注写诗歌颂和欢送就好了,那么这样就把功能分离了.所以可以把诗

  • 在Spring Boot中加载XML配置的完整步骤

    开篇 在SpringBoot中我们通常都是基于注解来开发的,实话说其实这个功能比较鸡肋,但是,SpringBoot中还是能做到的.所以用不用是一回事,会不会又是另外一回事. 涛锅锅在个人能力能掌握的范围之内,一般是会得越多越好,都是细小的积累,发生质的改变,所以今天和小伙伴们一起分享一下. 实践 1.首先我们新建一个SpringBoot Project ,工程名为 xml 2.添加web依赖,点击Finish完成构建 3.我们新建一个类 SayHello 不做任何配置 package org.t

  • 手把手教你搭建SpringMVC框架——最小化配置

    为什么需要Spring MVC 最开始接触网页的时候,是纯的html/css页面,那个时候还是用Dreamweaver来绘制页面. 随着网站开发的深入,开始学习servlet开发,记得最痛苦的就是servlet返回网页的内容是字符串拼接的html页面,整不好就无法显示.... 再到后来开学学习SSH,庞大的架构眼花缭乱.Struts繁杂的标签.hibernate搞不清楚的数据表,Spring不知道哪里搞错的bean. 最后随着发展,前端开始占有一席之地,nodejs风生水起,很多业务逻辑开始前置

  • SpringBoot集成Druid监控页面最小化配置操作

    在项目中使用阿里的druid连接池,pom文件配置: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId&g

  • java实现Spring在XML配置java类的方法

    1. 创建自己的bean文件:beans.xml <?xml version="1.0" encoding="UTF-8"?> <busi-beans> <beans> <bean id="SysHelloImpl" type="com.cxm.test.SysHello"> <desc>test</desc> <impl-class>com.

  • Spring使用AspectJ注解和XML配置实现AOP

    本文演示的是Spring中使用AspectJ注解和XML配置两种方式实现AOP 下面是使用AspectJ注解实现AOP的Java Project 首先是位于classpath下的applicationContext.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmln

随机推荐