1.前言

基于注解的IOC和基于XML的IOC在本质上都是一样的,都是为了降低程序间的依赖、解耦。不同的地方在于配置的形式,XML的形式需要额外的配置文件,基于注解的可以直接在源代码上进行改进。

如果想让Spring知道我们在哪使用了注解,还需要在xml配置文件中表明Spring在创建容器时要扫描的包,但是该配置不是在beans的约束中,而是在context名称空间和约束中。配置Demo如下:

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.eastnotes"></context:component-scan>

</beans>

配置完成之后,Spring会扫描该包及其子包下的所有类或接口上的注解。

2.注解的种类

  • 用于创建对象的注解:和xml配置文件中的标签的作用一样
  • 用于注入数据的注解:和bean标签下的标签作用一样
  • 用于改变作用范围的:和bean标签里使用scope属性的作用是一样的
  • 声命周期相关的注解:和bean标签里使用init-methoddestory-method属性的作用是一样的

3.创建对象的注解

  • @Component
    • 作用:将当前类存入Spring容器中
    • 命名:如果你想给此bean指定一个id,那么可以在注解括号里加属性,如:@component(value="idname"),如果括号里面只有value这个属性,那么value这个字段可以不写。
@Component(value = "accountService")
public class AccountServiceImpl implements AccountService {

    private AccountDao accountDao = new AccountDaoImpl();
    public void saveAccount(){
        accountDao.saveAccount();
    }
}

另外还有三个注解的作用与Component注解的作用和属性是一样的,只不过他们有特定的适用领域,分别对应于三层

  • @Controller:一般用在表现层
  • @Service:一般用于业务层
  • @Repository:一般用于持久层

4.注入数据的注解

  • @Autowired:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。如果没有任何匹配就报错,如果有两个或多个,首先会按类型筛选出匹配的对象,然后按照变量名称作为变量id,继续筛选,如果有一样的就注入成功。

    • 使用位置:可以在变量上,也可以是方法上
    • 注意:使用注解进行依赖注入,那么set方法就不是必须的了。
  • @Qualifier:在按照类中注入的基础之上,再按照名称注入。它在给类成员注入时不能单独使用(需要在上面配合@Autowired注解),但是再给参数注入时可以。

    • 属性:value,用于指定注入bean的id
@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    @Qualifier("accountDao")
    private AccountDao accountDao;

    public void saveAccount(){
        accountDao.saveAccount();
    }
}
  • @Resource:直接按照bean的id注入,它可以独立使用,但是他的属性不是value,而是name,用于指定bean的id
@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Resource(name = "accountDao")
    private AccountDao accountDao;

    public void saveAccount(){
        accountDao.saveAccount();
    }
}

以上三个注解(@Resource@Qualifier@Autowired)只能注入其他bean类型的数据,而基本类型和String类型是无法使用上述注解实现的。另外,集合类型只能通过XML来实现。

  • @Value:用于注入基本类型和String类型,属性是value,用于指定数据的值。它可以使用spring中的el表达式。Spel的写法:${}

5.改变范围的注解

  • @scope:用于指定bean的作用范围(写在类上,与Component位置一样),属性是value,指定范围的取值,常用取值有两个:singleton、prototype,默认是单例

6.指定生命周期注解

  • @PreDestory:用于指定销毁方法
  • PostConstruct:用于指定初始化方法

这两个注解放在初始化方法和销毁方法前面,但是了解即可。