15 基于注解的配置
除了单独使用XML对Spring进行配置外,我们还可以使用注解的方式来配置对应的bean定义。如哪些class要被定义为bean,对应的bean需要注入哪些内容等。在Spring的配置中XML定义与注解定义是可以同时存在的。
15.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定义,如CommonAnnotationBeanPostProcessor
、RequiredAnnotationBeanPostProcessor
、PersistenceAnnotationBeanPostProcessor
和AutowiredAnnotationBeanPostProcessor
。
15.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;
}
}
15.3 @Autowired
@Autowired
注解用来表示自动注入的,其可以定义在属性上,set方法上,构造方法上等。使用其进行标注后Spring将自动注入对应的内容,默认是按照类型进行注入。使用了@Autowired标注进行注入的内容,默认是就是@Required的,即在对应bean完全初始化后对应的属性不能为空,必须进行注入。可以通过@Autowired的require属性指定进行指定,默认为true,即必须进行注入。
15.3.1 标注在属性上
public class Hello {
@Autowired
private World world;
}
15.3.2 设为非必须注入
public class Hello {
@Autowired(required=false)
private World world;
}
15.3.3 标注在set方法上
public class Hello {
private World world;
@Autowired
public void setWorld(World world) {
this.world = world;
}
}
15.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;
}
}
15.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;
}
}
15.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;
}
15.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;
}
相关推荐
在本主题中,我们将深入探讨Spring框架的2.5版本引入的一个重要特性——基于注解的Spring MVC配置。Spring MVC是Spring框架的一部分,专门用于构建Web应用程序,它提供了一个模型-视图-控制器(MVC)架构来组织和...
Spring 2.5基于注解驱动的SpringMVC配置方式代表了现代Web应用开发的一个重要趋势——减少XML配置,增强代码的自描述性和可维护性。通过上述核心注解的使用,开发人员能够更快速、高效地构建响应式、可扩展的Web应用...
Spring提供了三种配置方式:基于XML的配置、基于注解的配置和基于Java的配置。基于XML的配置方式需要在配置文件中声明bean,依赖和服务的配置,这样的配置方式有利于将配置信息和代码分离。 在Spring框架中,通常会...
### MyBatis与Spring整合方式详解:基于注解的实现 #### 一、概述 在实际的软件开发过程中,为了更好地实现项目的模块化管理和提高代码的可维护性,通常会将MyBatis与Spring框架进行整合。这种方式不仅能够简化...
本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...
### 使用 Spring 2.5 基于注解驱动的 Spring MVC #### 概述与背景 自从Spring 2.0版本对Spring MVC框架进行了重大升级之后,Spring 2.5再次对该框架进行了显著改进,引入了注解驱动的功能。这使得开发人员能够更加...
SpringCloud Zookeeper配置中心允许动态更新应用程序的配置,无需重启服务。此外,Zookeeper还可以作为分布式锁的实现,解决分布式环境下的并发问题。 总结来说,SpringCloud与Zookeeper的结合,使得开发者能够快速...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用来处理 Web 请求。在本文中,我们将深入探讨 Spring MVC 的基本使用,包括它的架构、配置、控制器、模型视图解析以及数据绑定...
Spring 3.0引入了基于注解的配置,使得我们不再需要为每个控制器创建单独的bean定义。例如,我们可以使用`@Controller`注解标记一个类作为Spring MVC的控制器: ```java @Controller @RequestMapping("/users") ...
它基于"约定优于配置"的原则,通过提供开箱即用的功能,让开发者能够快速地创建独立运行的、生产级别的基于Spring的应用。 **构建RESTful服务** REST(Representational State Transfer)是一种网络应用程序的设计...
通过XML或注解配置SQL语句,MyBatis能够将Java对象映射到数据库记录,实现数据的增删改查操作。结合Spring,可以实现DAO(Data Access Object)的自动管理,进一步简化开发流程。 项目开发环境包括Eclipse IDE,这...
以上就是基于注解的SpringMVC的一些核心概念。通过使用这些注解,开发者可以编写更简洁、更易于维护的代码,同时减少了XML配置的工作量。在实际项目中,还会涉及到更多高级特性,如拦截器、异常处理、视图解析等,...
SpringCloud是基于Spring Boot构建的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)操作中的...
Eureka是由Netflix公司开发的服务发现框架,它基于RESTful接口,可以方便地集成到Spring Cloud生态系统中。Eureka分为两个主要组件:Eureka Server(服务注册中心)和Eureka Client(服务提供者和服务消费者)。服务...
MyBatis可以使用简单的XML或注解来进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 三、Spring框架简介 Spring框架是用于构建企业级Java应用程序的...
- Spring支持基于代理的AOP和基于注解的AOP。 4. **IoC容器** - IoC容器是Spring的基石,负责管理对象的生命周期和对象之间的依赖关系。 - 容器通过读取配置元数据(XML、注解或Java配置类)来创建和管理Bean。 ...
这个“毕业设计——基于SSM的个人书签管理系统”项目,就是利用这三个框架搭建的一个实用系统,非常适合进行毕业设计或课程设计,同时也可以作为学习SSM框架的实例。 1. **Spring框架**:Spring是Java企业级应用的...
在IT行业中,SSH2框架是三个非常著名的开源Java框架——Struts2、Spring和Hibernate的组合,用于构建高效、可维护的企业级Web应用程序。在这个基于Spring注解的SSH2框架集成中,我们将深入探讨如何将这三个组件有效...
Spring3引入了基于注解的事务管理,极大地简化了事务配置,使得开发者可以在方法级别声明事务边界,这就是`@Transactional`注解的用处。本文将深入探讨这个注解以及如何在Spring3中有效地使用它。 `@Transactional`...