spring基于注解的注入配置

269 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

背景

基于注解的配置提供了 XML 设置的替代方案,它依赖字节码元数据来注入组件,而不是使用尖括号声明。从 Spring 2.0 开始就可以使用注解来配置依赖注入,开发人员不使用 XML 来描述 bean 连接,而是使用相关的类、方法或字段声明上的注解将配置移动到组件类本身。

Spring 2.0 引入了 @Required 注解,标记属性必须存在。这种方式虽然可以避免后期的 NullPointerException,但这样做会强制那些必需的引用和值,所以在 Spring 5.1 开始 @Required 注解正式被弃用,还是建议使用构造器注入或 Setter 注入方式可以更灵活。Spring 2.5 使得遵循相同的方法来驱动 Spring 的依赖注入成为可能。@Autowired 注解提供了与 Autowiring Collaborators 中描述的相同的功能,但是具有更细粒度的空值和更广泛的适用性。Spring 2.5 还增加了对 JSR-250 注解的支持,Spring 3 开始为 javax.inject 包中包含的 JSR-330 注解添加了支持。 环境参考之前的文章

image.png

注解注入默认情况下在 Spring 容器中不打开。因此,在使用基于注解的注入之前,我们需要在 Spring 配置文件中启用它。

启用注解需要在配置文件中加入 context 规则,以及添加 <context:annotation-config /> 元素。 添加 context 的规则时需要注意正确书写,否则 context 中的元素无法正常使用:

图片描述

使用 Spring 开发时,进行配置主要有两种方式,一是 XML 的方式,二是 Java Config 的方式。Spring 技术自身也在不断的发展和改变,Java Config 的应用是越来越广泛了,我们不可避免的会有各种各样的注解打交道. 其中,我们使用最多的注解应该就是 @Autowired 注解了,这个注解的功能就是为我们注入一个定义好的 bean

@Autowired 注解的作用

@Autowired 注解是一个用于容器配置的注解,来源于英文单词 autowire,这个单词的意思是自动装配的意思。自动装配就是自动将一些需要完成的组装任务完成。而在 Spring 的世界当中,自动装配指的就是使用将 Spring 容器中的 bean 自动的和我们需要这个 bean 的类组装在一起。

@Autowired 注解用法

  1. 将 @Autowired 注解用于构造器,如下所示
public class UserService {
@Autowired 
public UserService(IUserADAO userdaoa, IUserBDAO userdaob, Users user) { 
this.userdaoa = userdaoa;
this.userdaob = userdaob;
this.user = user; 
}
}
  1. 将 @Autowired 注解用于类声明的属性之上这是最常用的,如下所示:
public class UserService {
@Autowired 
private IUserADAO userdaoa; 
@Autowired 
private IUserBDAO userdaob;
@Autowired
private Users user;
// 类文件中其他代码此处省略 
}

这里给的代码主要是使用 @Autowired 注解的核心代码,其他的代码下载导入的工程都有,也是你之前写过的代码。

  1. Spring 配置文件中的所需要配置不同的 <bean>
<bean id="user" class="com.yamiya.pojo.Users">
    <property name="userid" value="2000001"/>
    <property name="username" value="Kaka" />
    <property name="usertype" value="VVVip会员" />
</bean>

<bean id="userdaoa" class="com.yamiya.dao.UserADAOImpl"></bean>

<bean id="userdaob" class="com.yamiya.dao.UserBDAOImpl"></bean>

<bean id="userservice" class="com.yamiya.service.UserService"></bean>
  1. 在测试类 TestSpring.java 中添加测试内容。
@Test
public void test(){
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService us = context.getBean("userservice", UserService.class);
    us.getUsers();
    context.close();
}

不管是在构造器上使用 @Autowired 还是在成员变量上使用 @Autowired 效果都是一样的。

类路径扫描组件配置

大多数使用 XML 来指定在 Spring 容器中生成每个 BeanDefinition 的配置元数据,而 Spring 3.0 之后建议大家使用 JavaConfig 提供注解操作,而不是传统的 XML 配置。

通过扫描类路径隐式检测候选组件的选项,候选组件是与筛选条件相匹配的类,并在容器中注册了相应的 bean 定义,这样就不需要使用 XML 来执行 bean 注册。

你可以在需要注册的 JavaBean 类中加入不同的注解:

注解描述
@Component所有的 JavaBean 都可以使用进行定义
@Service服务层的 JavaBean 可以使用进行定义
@Controller控制层的 JavaBean 可以使用进行定义
@Repository持久层的 JavaBean 可以使用进行定义

注意:一般来说数据 Bean,像 entity、domain、pojo 不使用注解进行注册操作。

我们可以在上一节的处理基础上,使用类路径扫描方式更简化的来进行操作。

  1. 在 resources 目录下创建配置文件 springScan.xml
<!--扫描 com.yamiya.service 和 com.yamiya.dao 两个路径下的所有类-->
<context:component-scan base-package="com.yamiya.service, com.yamiya.dao" />
<!--定义数据Bean-->
<bean id="user" class="com.yamiya.pojo.Users">
    <property name="userid" value="2000001"/>
    <property name="username" value="Kaka" />
    <property name="usertype" value="VVVip会员" />
</bean>
  1. 修改逻辑 Bean,添加 @Component 、@Service 注解。

在 UserADAOImpl.java 类开始的地方加入 @Component 注解,代码如下

@Component
public class UserADAOImpl implements IUserADAO { 
public List<Users> queryUsers(){
System.out.println("查询所有员工信息"); 
return null;
}

在 UserBDAOImpl.java 类开始的地方加入 @Component 注解,代码如下:

@Component
public class UserBDAOImpl implements IUserBDAO {

public Users updateUser(Users user){
System.out.println("修改用户信息");
return user;
}

在 UserService.java 类开始的地方加入 @Service 注解,代码如下:

@Service
public class UserService {
@Autowired
private IUserADAO userdaoa;
@Autowired
private IUserBDAO userdaob;
@Autowired
private Users user;

public UserService(){

}
  1. 在测试类 TestSpring 中添加测试方法 testScan() 进行检测,代码如下:
public class TestSpring {
@Test
public void testScan(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springScan.xml");
UserService us = context.getBean(UserService.class);
us.getUsers();
context.close();
}}

基于 Java 的容器配置

基于 Java 的容器配置,可以使你在不用配置 XML 的情况下编写大多数的 Spring,就是不再需要写配置文件了,但是需要使用注解才能完成。

这里是 @Configuration 和 @Bean 注解,带有 @Configuration 的注解类表示这个类可以作为 Spring IOC 容器而存在的。@Bean 注解告诉 Spring,一个带有 @Bean 的注解方法将返回一个对象,该对象被定义为在 Spring 容器中的 bean。

  1. 我们需要来创建一个配置类 SpringConfig.java
@Configuration 
public class SpringConfig { 
@Bean
public Users getUser(){ 
Users user = new Users(3000032, "Tom", "SVIP会员");
return user;
}
  1. 在测试类 TestSpring 中添加测试方法 testConfig() 中进行检测
@Test 
public void testConfig() { 
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( SpringConfig.class, UserService.class, UserADAOImpl.class, UserBDAOImpl.class ); 
UserService us = context.getBean(UserService.class); 
us.getUsers(); 
context.close(); 
}

通过 Java 类来书写配置类,那么在读取配置类时需要使用的是 AnnotationConfigApplicationContext 类来进行数据的读取,获取不同的类实例进行操作。

总结

Spring 注入操作有两种方式,一是 XML 注入,二是 JavaConfig 注入,它们可以分别使用,也可以混合一起使用,值得说明的是,通过它的 JavaConfig 选项,Spring 允许以非侵入性的方式使用注解,而不接触目标组件源代码,并且在工具方面,所有配置样式都由 Spring 工具套件支持。

注意:注解注入在 XML 注入之前执行,因此,当两个同时使用时,XML 配置会覆盖注解注入的属性。

图片描述

注解注入配置大大简化了配置文件的书写