`

Spring(14)——基于注解的配置

阅读更多

14 基于注解的配置

除了单独使用XML对Spring进行配置外,我们还可以使用注解的方式来配置对应的bean定义。如哪些class要被定义为bean,对应的bean需要注入哪些内容等。在Spring的配置中XML定义与注解定义是可以同时存在的。

14.1 启用对注解的支持

如果需要使用注解来配置bean定义,首先我们需要启用Spring对注解的支持。最简单的方式就是在Spring的配置文件中引入context对应的命名空间,然后在其中定义一个<context:annotation-config/>即可。

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- 启用对注解的支持 -->
	<context:annotation-config/>

</beans>

定义好<context:annotation-config/>后,Spring将自动注册用于支持注解的bean定义,如CommonAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessor

14.2 @Required

@Required注解是用来标注在属性对应的set方法上的,表示在调用对应bean的初始化方法之后对应的属性不允许为空。该注解主要用来做一个标注检查作用,以防止我们在运行时使用对应的属性进行操作时出现空指针问题。

public class Hello {
	
	private World world;

	public World getWorld() {
		return world;
	}

	@Required
	public void setWorld(World world) {
		this.world = world;
	}
	
}

14.3 @Autowired

@Autowired注解用来表示自动注入的,其可以定义在属性上,set方法上,构造方法上等。使用其进行标注后Spring将自动注入对应的内容,默认是按照类型进行注入。使用了@Autowired标注进行注入的内容,默认是就是@Required的,即在对应bean完全初始化后对应的属性不能为空,必须进行注入。可以通过@Autowired的require属性指定进行指定,默认为true,即必须进行注入。

14.3.1 标注在属性上

public class Hello {
	
	@Autowired
	private World world;

}

14.3.2 设为非必须注入

public class Hello {
	
	@Autowired(required=false)
	private World world;

}

14.3.3 标注在set方法上

public class Hello {
	
	private World world;

	@Autowired
	public void setWorld(World world) {
		this.world = world;
	}
	
}

14.3.4 标注在普通方法上

Spring也支持通过普通方法进行自动注入,对应的普通方法可以接收一到多个参数。

public class Hello {
	
	private BeanA beanA;
	private World world;

	@Autowired
	public void inject(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}

14.3.5 标注在构造方法上

@Autowired也可以标注在构造方法上,以完成对构造方法参数的自动注入。

public class Hello {
	
	private World world;

	@Autowired
	public Hello(World world) {
		this.world = world;
	}
	
}

但是有一点需要注意的是使用@Autowired进行注入的内容默认是@Required的,即不能为空的。当我们的bean类定义有多个构造方法时,Spring允许我们在多个构造方法上使用@Autowired进行标注,但是当在多个构造方法上标注@Autowired时,我们必须指定对应的required属性的值为false。如下这样两个构造方法都是@Autowired,且是@Required是不行的。

public class Hello {
	
	private World world;
	private BeanA beanA;

	@Autowired
	public Hello(World world) {
		this.world = world;
	}
	
	@Autowired
	public Hello(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}
	
}

通过将对应的required属性设置为false后,我们的定义就又是合法的了。这个时候Spring将在bean容器中寻找对应构造方法参数类型对应的bean,然后将利用能满足最多构造方法参数进行注入的那个构造方法进行注入。如下示例当bean容器中既能寻找到World类型的bean,又能寻找到BeanA类型的bean时就将通过第二个构造方法进行注入,否则就是第一个了。

public class Hello {
	
	private World world;
	private BeanA beanA;

	@Autowired(required=false)
	public Hello(World world) {
		this.world = world;
	}
	
	@Autowired(required=false)
	public Hello(World world, BeanA beanA) {
		this.world = world;
		this.beanA = beanA;
	}

}

14.3.6 注入数组、集合类型等

@Autowired除了能注入单个的bean对象之外,还能注入数组类型、集合类型和key为String的Map类型的bean。当需要注入的是数组类型或集合类型时,Spring将在bean容器中寻找出所有对应类型的bean,然后将它们都作为其中的元素注入给对应的数组或集合,如果这些对应类型的bean是实现了Ordered接口的,那么Spring在将它们作为一个元素进行注入时还将根据Ordered接口的getOrder()方法的返回结果按从小到大的顺序进行添加。当需要自动注入的是一个key为String类型的Map类型时,Spring将在bean容器中寻找所有Map的value对应类型的bean,然后将它们以对应bean名称即bean定义中的beanName作为key注入到对应的Map中。对于key为非String类型的Map,Spring是不能进行自动注入的。

public class Hello {
	
	@Autowired
	private World[] worldArray;
	@Autowired
	private List<World> worldList;
	@Autowired
	private Set<World> worldSet;
	@Autowired
	private Map<String, World> worldMap;
	
}

14.3.7 注入ApplicationContext等

我们还可以通过@Autowired自动注入与Spring内部机制相关的内容,如BeanFactory、ApplicationContext、Environment等。

public class Hello {
	
	@Autowired
	private BeanFactory beanFactory;
	@Autowired
	private ApplicationContext applicationContext;
	@Autowired
	private ConfigurableApplicationContext configurableContext;
	@Autowired
	private Environment environment;
	@Autowired
	private ResourceLoader resourceLoader;
	@Autowired
	private ApplicationEventPublisher eventPublisher;
	@Autowired
	private MessageSource messageSource;
	@Autowired
	ResourcePatternResolver resourcePatternResolver;
	
}

 

 

本文转自:https://elim.iteye.com/blog/2388584

分享到:
评论

相关推荐

    跟我学spring3(8-13)

    【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3 【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3 【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3 ...

    spring杂谈 作者zhang KaiTao

    1.18 不重复配置——利用Spring通用化配置 1.19 @Value注入Properties 错误的使用案例 1.20 @Value注入Properties 使用错误的案例 1.21 扩展SpringMVC以支持更精准的数据绑定 1.22 扩展SpringMVC以支持更精准的数据...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    10.3 云部署——基于Docker 的部署 419 10.3.1 Dockerfile 419 10.3.2 安装Docker 421 10.3.3 项目目录及文件 421 10.3.4 编译镜像 423 10.3.5 运行 424 10.4 Spring Boot 的测试 424 10.4.1 新建Spring Boot 项目 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    10.3 云部署——基于Docker 的部署 419 10.3.1 Dockerfile 419 10.3.2 安装Docker 421 10.3.3 项目目录及文件 421 10.3.4 编译镜像 423 10.3.5 运行 424 10.4 Spring Boot 的测试 424 10.4.1 新建Spring Boot 项目 ...

    超详细的Spring框架讲解,就这一篇!足矣

    Spring框架概述1、什么是Spring2、Spring框架的优点3、Spring框架体系结构Spring框架——控制反转(IOC)1、IOC介绍2、基于配置的IOC2.1、导入jar包2.2、配置文件2.3、测试3、基于注解的IOC3.0、导包3.1、开启注解...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    10.3 云部署——基于Docker 的部署 419 10.3.1 Dockerfile 419 10.3.2 安装Docker 421 10.3.3 项目目录及文件 421 10.3.4 编译镜像 423 10.3.5 运行 424 10.4 Spring Boot 的测试 424 10.4.1 新建Spring Boot 项目 ...

    Spring.3.x企业应用开发实战(完整版).part2

    4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 ...

    Spring3.x企业应用开发实战(完整版) part1

    4.10.2 使用注解配置信息启动Spring容器 4.10.3 自动装配Bean 4.10.4 Bean作用范围及生命过程方法 4.11 基于Java类的配置 4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 ...

    跟我学spring3(8-13).pdf

    11.2 实现通用层 11.3 实现积分商城层 12.1 概述 12.2 注解实现Bean依赖注入 12.3 注解实现Bean定义 12.4 基于Java类定义Bean配置元数据 12.5 综合示例-积分商城 13.1 概述 13.2 单元测试 集成测试 ——跟我学spring3

    Spring Security 中文教程.pdf

    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    SpringSecurity 3.0.1.RELEASE.CHM

    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    Spring Security-3.0.1中文官方文档(翻译版)

    7.4. 使用其他过滤器—— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    MyStudentManagerSSM-1.0.zip

    MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 2、开发环境搭建以及创建Maven Web项目 参看之前的博文...

    基于JavaEE的快速开发框架

    模块化开发,使用注解简化配置,增强代码可读性与维护性。 组件图 组件图 单元测试组件图 模块说明 core——基础模块。 dao——持久化模块。 ctrl——控制层模块。 ctrl-http——HTTP(S)模块。 ctrl-socket——...

    基于JavaWEB+SSM+mysql框架构建的在线商城系统源码+数据库+项目说明(课程设计).zip

    * 实现了一个 **通用mapper**,免写 SQL,可进行单表和多表关联查询,自动插入一对多/多对一对象(注解配置关联对象,结合 MyBatis Generator ) * 实现了一个 **BaseService 类** ,集成了多条件的查询和增改删...

    Struts2 in action中文版

    9.3.2 基于Spring管理JPA编写代码 212 9.4 小结 216 第10章 探索验证框架 217 10.1 熟悉数据验证框架 217 10.1.1 验证框架的架构 218 10.1.2 Struts 2工作流中的验证框架 219 10.2 将动作关联到验证框架 222 10.2.1...

    支持多数据库的ORM框架ef-orm.zip

    EF的设计的一个主要目的是提高开发效率,减少编码工作,让开发者“零配置”“少编码”的操作数据库大部分功能。 例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们...

    JAVA上百实例源码以及开源项目源代码

    14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择  Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格...

    JAVA上百实例源码以及开源项目

    14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择  Java语言开发的简洁实用的日期选择控件,源码文件功能说明:  [DateChooser.java] Java 日期选择控件(主体类) [public]  [TablePanel.java] 日历表格...

Global site tag (gtag.js) - Google Analytics