Spring的自动装配方法
2016-08-19 08:49
330 查看
Spring的装配方式
我们已经了解了依赖注入的基本原理,初识了@Component和@AutoWired标注的用法。为一个应用中的Beans的配置依赖注入关系的过程称之为装配(Wiring)。Spring提供三种装配方式:
基于标注的自动装配
基于XML配置的显式装配
基于Java配置的显式装配
之前的示例就是使用自动装配。通过给Java类增加相应的标注,就能够启用Spring隐式的Bean发现机制,并自动完成装配过程。我们在开发中应该尽可能使用自动装配,足以应付开发中的绝大多数情况。
Spring通过两个特性实现自动装配:
构件扫描:自动扫描和创建Spring应用上下文中的Beans
@Autowired标注:自动建立Spring Beans之间的依赖关系
在某些情况下,基于XML配置和基于Java配置的显式装配会有用武之地,比如实例化一个第三方库中的Bean。这种情况下,Java配置和XML配置我们优先使用Java配置,因为这是一种类型安全的方式,能够在编译时就尽早发现错误。
我们先来了解自动装配吧!
启用自动扫描
如何启动自动扫描机制呢? 在Spring Boot应用中,加入@SpringBootApplication标注就能启动自动扫描。package com.tianmaying; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
我们也可以通过XML配置或者Java配置的方式来启动自动扫描。
XML配置方式
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.tianmaying" /> </beans>
<context:component-scan>标签将会开启Spring Beans的自动扫描,并可设置base-package属性,表示Spring将会扫描该目录以及子目录下所有被@Component标注修饰的类,对它们进行装配。
Java配置方式
package com.tianmaying.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages = "com.tianmaying") public class BlogSystemConfig { }
@Configuration表示这个Java文件是一个配置文件,这类Java代码的作用在于配置,要和普通的Java代码区分开发,因此一般我们需要将其放在一个专门的包中,在代码例子中是com.tianmaying.config。
@ComponentScan表示开启Spring Beans扫描,类似于XML配置,这里也可以可以设置basePackages属性。
这种字符串形式的表示虽然可以,但是不具备“类型安全”,因此Spring也提供了更加类型安全的机制,即通过类或者接口来设置扫描机制的目标目录。通过这种设置,会将类A和类B所在的目录作为扫描的目标目录。
类型安全大家可以这样理解:
如果使用字符串的形式,即使类名写错了,在开发时是发现不了的,会在运行时抛出异常。
而使用Java类的形式,类名写错的话,编译时就会提示错误,比如Eclipse中就会提示找不到类的错误信息,这就避免了这种情况下的运行时异常,因此是更加安全的。
Spring Beans的命名
@Component用于定义一个Spring Bean。启动了自动扫描后,被@Component标注的类都自动会注册为Spring Beans。比如,我们可以将UserDao和PostDao注册为Spring Beans:@Component public class UserDao { ... }
@Component public class PostDao { @Autowired private UserDao userDao; ... }
在Spring上下文中,每个Bean都有自己的ID。Spring扫描过程中所创建的Bean都有默认的ID,这个ID为将类名首字母小写形成的字符串。
如果我们希望给某个类对应的Bean取特点的名字,则可以给@Component标注传入指定的参数,比如:
@Component("customizedName") public class UserDao { ... }
自动装配Bean
@Autowired标注可以作用在以下四种地方构造函数
成员变量
Setter方法
普通方法
通常情况下,我们通过给成员变量加@Autowired标注就能满足开发中的大部分场景。
回到博客应用中,我们已经为PostDao和UserDao增加标注@Component,这样就能注册为Spring Bean,被`Service`类所使用。
同样,PostService和UserService也可以用@Component进行标注,通过在私有属性上添加@Autowired标注,将其所依赖的Dao类注入其中。
@Component public class PostService { @Autowired private PostDao postDao; ... }
@Component public class UserService { @Autowired private UserDao userDao; ... }
最后在Servlet中,可以注入Service,比如IndexController类中:
@WebServlet("") public class IndexController extends HttpServlet { @Autowired private UserService userService; ... }
可选装配
使用自动装配时,如果在应用上下文中,对应类型的Bean有且只有一个,则会自动装配到该属性上。如果没有找到对应的Bean,应用会抛出对应的异常,如果想避免抛出这个异常,则需要设置@Autowired(required=false)。
这个属性应当谨慎使用,我们可能需要处理NullPointerException的问题。
作者:David
链接:https://zhuanlan.zhihu.com/p/20676907
来源:知乎
相关文章推荐
- Spring4-自动装配Beans-通过注解@Autowired在Set方法上
- Spring4类属性自动装配和方法注入
- Spring4-自动装配Beans-通过注解@Autowired在构造方法上
- Spring-方法注入、depends-on、自动装配协作对象
- Spring自动装配Bean的两种方法(二)
- Struts的action自动装配到spring容器可能出现异常的解决方法
- Spring自动装配Bean的两种方法(—)
- Spring Bean 注入 1 - 构造方法注入,属性注入,自动装配
- Spring自动装配的方法
- Spring 自动装配;方法注入
- spring ioc--自动装配,方法注入
- 添加xml文件自动提示方法,以spring配置文件为例
- SPRING的自动装配
- spring 的自动装配 autowire
- spring的自动装配
- 转: Spring的自动装配 autowire
- spring initializingBean vs init-method && 自动装配
- 关于Spring基于构造子自动装配的一点探讨
- spring quartz 与自动装配 产生的问题
- spring 的自动装配 autowire