Spring 从入门到精通系列 06 —— Spring 中的 IOC 常用注解

  Spring 的 IOC 常用注解主要有用于创建对象的、用于注入数据的、用于改变作用范围的以及和生命周期相关的四部分,本文针对此块内容,进行深入分析与解读。

在这里插入图片描述



Spring 中的 IOC 常用注解

之前 xml 的配置:

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
         scope="" init-method="" destroy-method="">
        <property name=""  value="" | ref="" ></property>
</bean>

对比之前的 xml 配置,注解开发中都有注解与之相对应。

导入依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
</dependencies>

使用注解配置需要在 bean.xml 中进行配置,以说明 bean 的注入采用注解形式,具体配置如下:

<!--告知 spring 在创建容器时要扫描的包,配置所需要的标签不是在 beans 的约束,
	而是一个名称为 context 名称空间和约束中-->
<context:component-scan base-package="com.itheima"></context:component-scan>

一、用于创建对象的

他们的作用就和 XM L配置文件中编写一个 <bean> 标签实现的功能是一样的。

1.1 Component

  1. 作用:用于把当前类对象存入spring容器中

  2. 属性:value 用于指定 bean 的 id。当我们不写时,他默认值是当前类名,且首字母改小写。 属性 value 当只有一个值时,value 书写可以省略。
    如: 在IOC容器反射创建 AccountServiceImpl 的对象的时候。如果不传入参数,则表现层:
    IAccountService as = (IAccountService) ac.getBean("accountServiceImpl");

    也可以通过在类上面配置 @Component("accountService"),则表现层传入的参数应保持一样:
    IAccountService as = (IAccountService) ac.getBean("accountService");

1.2 Controller(一般用在表现层)

1.3 Service(一般用在业务层)

1.4 Repository(一般用于持久层)

以上三个注解他们的作用和属性与 Component 是一模一样的,因此可以混用。但是为清晰,还是按照标准来。


工程目录:
在这里插入图片描述

bean.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">

    <!--告知 spring 在创建容器时要扫描的包,配置所需要的标签不是在 beans 的约束中,而是一个名称为 context 名称空间和约束中-->
    <context:component-scan base-package="com.axy" />
</beans>

业务层实现类:

@Service("accountService")
public class AccountServiceImpl implements IAccountService {
    public AccountServiceImpl() {
        System.out.println("无参构造");
    }

    public void  saveAccount(){
        System.out.println("保存了账户");
    }
}

模拟表现层 Client:

public class Client {
    public static void main(String[] args) {
        //1.获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取Bean对象
        IAccountService as  = (IAccountService)ac.getBean("accountService");
        as.saveAccount();
        ac.close();
    }
}

测试结果:
在这里插入图片描述


二、用于注入数据的

他们的作用就和 XML 配置文件中的 bean 标签中写一个 <property> 标签的的作用是一样的

2.1 Autowired(★)

  • 作用

    1. 自动按照类型注入只要容器中有唯一的一个 bean 对象类型和要注入的数据类型匹配,就可以注入成功(实现类也可以匹配,如下图)

    2. 如果 ioc 容器中没有任何 bean 的类型和要注入的变量类型匹配,则报错。
      在这里插入图片描述

    3. 如果 ioc 容器中有多个 bean 的类型和要注入的变量类型匹配,先根据 数据类型 (如:IAccountDao)找到范围,并在范围中在根据 变量的名称(如:accountDao)与 IOC 容器的 key 相匹配,最终注入。
      在这里插入图片描述

  • 出现的位置: 可以是变量上,也可以是方法上
    细节:在使用 Autowired 注解注入时,set 方法就不是必须的了。

    @Service("accountService")
    public class AccountServiceImpl implements IAccountService {
    	private AccountDao accountDao;
        // Setter注入
        @Autowired
        public void setAccountDao(AccountDao accountDao) {
            this.accountDao= accountDao;
        }
    }
    
    等同于...
    
    @Service("accountService")
    public class AccountServiceImpl implements IAccountService {
    	@Autowired
    	private AccountDao accountDao;
    }
    

2.2 Qualifier

  • 作用再按照类中注入的基础之上在按照 value 注入
    他在给类成员注入时不能单独(使用需和 Autowired 配合),但是在给方法参数注入时可以。

  • 属性:value 用于指定 bean 的 id,无须考虑 Autowired,但是还需要写上 Autowired。如:

    @Autowired
    @Qualifier("accountDao1")
    private IAccountDao accountDao = null;
    

2.3 Resource

  • 作用直接按照 bean 的 id 注入。它可以独立使用

  • 属性:name 用于指定 bean 的 id。如:

    @Resource(name = "accountDao1")
    private IAccountDao accountDao = null ;
    

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


2.4 Value

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

三、用于改变作用范围的

他们的作用就和在 bean 标签中使用 scope 的属性实现的功能是一样的

  • Scope:
    1. 作用:用于指定bean的作用范围
    2. 属性:value 指定范围的取值。常用取值:singleton, prototype
      @Scope(“prototype”)
      在类上使用,如:
      @Component("accountService")
      @Scope("prototype")
      public class AccountServiceImpl implements IAccountService {...}
      

四、和生命周期相关的(了解)

他们的作用就和在 bean 标签中使用 init-method 和 destroy-method 的作用是一样的

  • PostConstruct
    1. 作用:用于指定初始化方法
  • PreDestroy
    1. 作用:用于指定销毁方法
    @PostConstruct
    public void init(){
    	System.out.println("初始化");
    }
    @PreDestroy
    public void destroy(){
    	System.out.println("销毁方法Service");//这里单例对象需要手动关闭才会执行该方法
    }
    

本文针对 Spring 对 IOC 常用注解进行分析与讲解,如果大家对文章内容还存在一些疑问,欢迎大家在评论区留言哦~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiu Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值