Spring入门系列:篇4——SpringIOC注解开发

Posted thinmoon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring入门系列:篇4——SpringIOC注解开发相关的知识,希望对你有一定的参考价值。

前言

我们在篇1与篇2讲的都是使用xml来配置的SpringIOC,这篇文章中我们来学习一下SpringIOC的注解开发。

一、配置注解

1.idea开启注解扫描

要想在idea中使用注解,请确保下面这个?已经打上

技术图片

2.配置application.xml

在Spring4之后,我们要想使用注解的形式则必须要引入:

spring-aop-5.0.7.RELEASE.jar

接着我们applicationContext.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="icu.thinmoon.demo1"/>

</beans>

我们的applicationContext.xml多了两行context约束:

 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd"

并且我们需要使用以下语句来配置我们需要使用的注解的包,以便Spring进行扫描

 <!--配置那个包下使用注解扫描-->
 <context:component-scan base-package="icu.thinmoon.demo1"/>

二、注解

1.@Component

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("user")
public class User {
    String name;
}

@Component注解作用于类上,它的作用类似于:

<bean id="user" class=".....">

即将User类交由Spring进行管理,并且指定id为user。

@Component还有三个衍生注解分别为:

  • @Controller:使用在web层

  • @Service:使用在service层

  • @Repository:使用在dao层

目前这三个注解功能完全一致,都是将类交由Spring管理。这样做的目的是为了我们写代码时更好的分层。

2.属性注入注解

@Value

@Value的用法很简单,就是给基本类型进行赋值。可以直接在属性定义上方直接注入:

@Component("user")
public class User {
    @Value("小明")
    String name;
}

也可以在set方法上方进行注入:

@Component("user")
public class User {

    String name;
    @Value("小明")
    public void setName(String name) {
        this.name = name;
    }
}
@Autowired && @Resource

@Autowired用于给引用对象进行赋值

Dog

@Component("dog")
public class Dog {
    @Value("旺财")
    String name;
}

User

@Component("user")
public class User {
    @Value("小明")
    String name;

    @Autowired
    Dog dog;
}

类似于上方代码,我们直接在dog上方贴一个@Autowired并没有指定id,Spring会在它管理的所有对象中寻找相同类型的对象给我们赋值。

但是我们平常开发过程中更喜欢显示的指定id,这时候我们可以使用@Autowired@Qualifier共同注入,@Autowired指定了类,@Qualifier指定了id

@Component("user")
public class User {
    @Value("小明")
    String name;

    @Autowired
    @Qualifier("dog")
    Dog dog;
}

当然,我们可以直接使用@Resource标签进行注入

@Component("user")
public class User {
    @Value("小明")
    String name;

    @Resource(name="dog")
    Dog dog;
}

3.生命周期注解

@PostConstruct :标记为初始化方法初始化方法,类似init-method
@PreDestroy:标记为销毁方法,类似destroy-method

@Component("user")
public class User {
    @Value("小明")
    String name;

    @Resource(name="dog")
    Dog dog;

    @PostConstruct
    public void init() {
        System.out.println("user--init");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("user---destroy");
    }

}

4.@Scope

用法于xml中完全一致,标记在类上方即可。

@Component("user")
@Scope("singleton")
public class User {
    @Value("小明")
    String name;

    @Resource(name="dog")
    Dog dog;

    @PostConstruct
    public void init() {
        System.out.println("user--init");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("user---destroy");
    }

}

三、xml形式与注解的区别

  • XML可以适用任何场景 ,结构清晰,维护方便
  • 注解开发简单方便,但是不是自己提供的类使用不了并且需要到源码中修改

我们可以采用XML与注解整合的方式进行开发,即使用XML管理Bean,利用注解完成属性注入,在这种方式下我们可以不用使用注解扫描,即可以删除以下代码

 <!--配置那个包下使用注解扫描-->
 <context:component-scan base-package="icu.thinmoon.demo1"/>

单是我们在没有扫描的情况下还想要使用注解进行属性注入需要加上以下代码:

<context:annotation-config/>

以上是关于Spring入门系列:篇4——SpringIOC注解开发的主要内容,如果未能解决你的问题,请参考以下文章

Spring入门系列:篇3——再探IOC

Spring入门篇——第2章 Spring IOC容器

Spring Security安全框架入门篇

spring入门篇-学习笔记

Java自学!spring-kafka监听器不好使

Spring Boot 2从入门到入坟 | 基础入门篇:「Spring Boot 2从入门到入坟」系列教程介绍