目录

  • Sprin 基于注解的 IOC 以及 IOC 案例
  • 一、注解分类
    • 1.用于创建对象的
    • 2.用于注入数据的
    • 3.用于改变作用范围的
    • 4.和生命周期相关
  • 二、 bean.xml 配置
  • 三、注解配置接口与实现类代码
    • 1.结构图
    • 2. IAccountService
    • 3. AccountServiceImpl
    • 4. Client 主函数
    • 5.由 Component 衍生的注解
  • 四、自动按照类型注入
    • 1.@AutoWired

      • 问题
    • 2. @Qualifier
    • 3. @Resource(name="")
  • 五、用于改变作用范围的
    • 1. AccountServiceImpl 实现类
    • 2. Client 主函数
  • 六.和生命周期相关
    • 1.实现类
    • 2.Client

Sprin 基于注解的 IOC 以及 IOC 案例

  1. spring 中 ioc 的常用注解
  2. 案例使用 xml 方式和注解方式实现单表的 CRUD 操作
    • 持久层技术选择:dbutils
  3. 改造基于注解的 IOC 案例,使用纯注解的方式是心啊
    • spring 的一些新注解使用
  4. spring 和 Junit 整合

明确:写在前面

学习基于注解的 IOC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。

关于实际的开发中到底是用 xml 还是注解,每家公司有着不同的使用习惯,所以这两者配置方式我们都需要掌握。

在讲解注解配置时,采用上一章案例,吧 spring 的 xml 配置内容改为使用注解逐步实现。

一、注解分类

1.用于创建对象的

  • 他们的作用和在 xml 配置文件中编写一个 标签实现的功能是一样的
  • @Component
    • 作用:用于把当前类对象存入 spring 容器中
    • 疑惑,spring 容器为 map 结构,那它对应的值呢?
      • 属性:

        • value:用于指定 bean 的 id。当我们不写时,他的默认值是当前类名,且首字母改小写。
    • @Controller:一般用于表现层
    • @Service:一般用于业务层
    • @Repository:一般用于持久层
    • @Repository
      • 以上三个注解它们的做哦那个和属性与 Component 是一模一样的。
      • 他们三个是 spring 框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

2.用于注入数据的

  • 他们的作用和在 xml 配置文件中编写一个 标签实现的功能是一样的
  • @Autowired:
    • 作用:

      • 自动按照类型注入。只要容器中有唯一的 bean 对象类型和要注入的变量类型匹配,就可以注入成功。
      • 如果 IOC 容器中没有任何 bean 的类型和要注入的变量类型匹配,则报错。
      • 如果 IOC 容器中有多个类型匹配时:
    • 出现位置:可以是变量上,也可以是方法上
    • 细节:咋使用注解注入时,set 方法就不是必须的了。
  • @Qualifier:
    • 作用:

      • 在按照类中注入的基础之上再按照名称注入。他在给类成员注入时不能单独使用。但是再给方法参数注入时可以。
    • 属性:
      • value:用于指定注入 bean 的 id
  • @Resource:
    • 作用:

      • 直接按照 bean 的 id 注入。它可以独立使用
    • 属性:
      • name:用于指定 bean 的 id
  • 注意
    • 以上三个注入都只能注入其他 bean 类型的数据,而基本类型和 String 类型无法使用上述注解实现。
    • 另外,集合类型的注入只能通过 XML 来实现
  • @Value
    • 作用:

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

3.用于改变作用范围的

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

      • 用于注入基本类型和 String 类型的数据
    • 属性:
      • value:指定范围的取值。常用取值:singleton(默认),prototype

4.和生命周期相关

  • 他们的作用和在 bean 标签中使用 init-method 和 destroy-method 的作用是一样的
  • PreDestroy
    • 作用:用于指定销毁方法
  • PostConstruct
    • 作用:用于指定初始化方法

二、 bean.xml 配置

spring-core路劲 按住 ctrl + f 搜索 xmlns:context

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--告知 spring 在创建容器时要扫描的包,配置所需要的标签不是在 beans 的约束中,而是一个名称为 context 名称空间和约束中--><context:component-scan base-package="com"/>
</beans>

三、注解配置接口与实现类代码

1.结构图

2. IAccountService

public interface IAccountService {void saveAccount();
}

3. AccountServiceImpl

//@Component(value = "accountServiceImpl") 指定 id
@Component
public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao;public AccountServiceImpl(){System.out.println("AccountServiceImpl 对象创建了");}public void saveAccount() {accountDao.saveAccount();}
}

4. Client 主函数

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

5.由 Component 衍生的注解

  • @Controller:一般用于表现层
  • @Service:一般用于业务层
  • @Repository:一般用于持久层
    • 以上三个注解它们的做哦那个和属性与 Component 是一模一样的。
    • 他们三个是 spring 框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰

四、自动按照类型注入

1.@AutoWired

接下来我们调用方法

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

结果为空指针异常

AccountServiceImpl 对象创建了
com.service.Impl.AccountServiceImpl@1f010bf0
Exception in thread "main" java.lang.NullPointerExceptionat com.service.Impl.AccountServiceImpl.saveAccount(AccountServiceImpl.java:26)at com.ui.Client.main(Client.java:24)
  • 用于注入数据的

    • 他们的作用和在 xml 配置文件中编写一个 标签实现的功能是一样的
    • @Autowired:
      • 作用:

        • 自动按照类型注入。只要容器中有唯一的 bean 对象类型和要注入的变量类型匹配,就可以注入成功。
        • 如果 IOC 容器中没有任何 bean 的类型和要注入的变量类型匹配,则报错。
        • 如果 IOC 容器中有多个类型匹配时:
      • 出现位置:可以是变量上,也可以是方法上
      • 细节:咋使用注解注入时,set 方法就不是必须的了。
@Component(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {@Autowiredprivate IAccountDao accountDao;public AccountServiceImpl(){System.out.println("AccountServiceImpl 对象创建了");}public void saveAccount() {accountDao.saveAccount();}
}

结果可以正常输出

问题

如果不止一个 IAccountDao 的实现类,而是有多个怎么办?

@Repository("accountDao1")
public class AccountDaoImpl implements IAccountDao {public void saveAccount() {System.out.println("保存了");}
}
@Repository("accountDao2")
public class AccountDaoImpl2 implements IAccountDao {public void saveAccount() {System.out.println("保存了");}
}

运行结果出错

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.dao.IAccountDao' available: expected single matching bean but found 2: accountDao1,accountDao2

解决

修改 AccountServiceImpl 中 IAccountDao 数据类型的变量名 为 accountDao1,运行结果成功

@Service(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {@Autowiredprivate IAccountDao accountDao1;public AccountServiceImpl(){System.out.println("AccountServiceImpl 对象创建了");}public void saveAccount() {accountDao1.saveAccount();}
}

2. @Qualifier

@Qualifier:

  • 作用:

    • 在按照类中注入的基础之上再按照名称注入。他在给类成员注入时不能单独使用。但是再给方法参数注入时可以。
  • 属性:
    • value:用于指定注入 bean 的 id
@Service(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {@Autowired@Qualifier("accountDao1")private IAccountDao accountDao;public AccountServiceImpl(){System.out.println("AccountServiceImpl 对象创建了");}public void saveAccount() {accountDao.saveAccount();}
}

3. @Resource(name="")

@Resource:

  • 作用:直接按照 bean 的 id 注入。它可以独立使用
  • 属性:
    • name:用于指定 bean 的 id
@Service(value = "accountServiceImpl")
public class AccountServiceImpl implements IAccountService {@Resource(name = "accountDao2")private IAccountDao accountDao;public AccountServiceImpl(){System.out.println("AccountServiceImpl 对象创建了");}public void saveAccount() {accountDao.saveAccount();}
}

五、用于改变作用范围的

1. AccountServiceImpl 实现类

@Service(value = "accountServiceImpl")
@Scope(value = "prototype")
public class AccountServiceImpl implements IAccountService {/* @Autowired@Qualifier("accountDao1")*/@Resource(name = "accountDao2")private IAccountDao accountDao;public AccountServiceImpl(){System.out.println("AccountServiceImpl 对象创建了");}public void saveAccount() {accountDao.saveAccount();}
}

2. Client 主函数

public class Client {public static void main(String[] args) {//1.获取核心容器对象ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");//2.根据 id 获取 bean 对象IAccountService as1=ac.getBean("accountServiceImpl",IAccountService.class);IAccountService as2=ac.getBean("accountServiceImpl",IAccountService.class);System.out.println(as1==as2);}
}

六.和生命周期相关

1.实现类

@Service(value = "accountServiceImpl")
@Scope(value = "prototype")
public class AccountServiceImpl implements IAccountService {/* @Autowired@Qualifier("accountDao1")*/@Resource(name = "accountDao2")private IAccountDao accountDao;@PostConstructpublic void init(){System.out.println("初始化方法执行了");}@PreDestroypublic void destroy(){System.out.println("销毁方法执行");}public void saveAccount() {accountDao.saveAccount();}
}

2.Client

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

为什么这么写?

ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");

如果你把一个子类看作父类,那么就只能调用父类的方法,这个时候就不能调用 close() 方法

注意

然而结果并没有调用销毁方法,这是因为这是一个多例对象,看实现类上面 @Scope(value = "prototype") ,多例对象销毁 spring 是不负责的,所以应该改为单例对象。

转载于:https://www.cnblogs.com/zuiren/p/11429714.html

05-常用IOC注解按照作用分类相关推荐

  1. 常用IOC注解按照作用分类

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  2. Spring框架----Spring常用IOC注解的分类

    学习基于注解的IOC配置,我们应该知道,注解配置和xml配置要实现的功能都是一样的,都是要降低程序的耦合,只是配置的形式不一样, 关于实际的开发中到底是使用xml还是注解,每家公司有着不同的使用习惯, ...

  3. Spring Ioc注解式开发中注解的作用

    Spring Ioc注解式开发中注解的作用 目标:本章节注重于Spring Ioc的注解式开发之中注解的作用. 基于注解的DI实现IOC 1.定义bean而注解 a.@Component @Repos ...

  4. 注解的作用 常用注解

    注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包.类.构造方法.域.方法.参数以及局部变量. 注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包.类.构造方法. ...

  5. Spring常用注解,以及注解的作用和简单用法

    这篇文章主要介绍了Spring当中的常见的一些注解,以及注解的简单用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 @Configuration 作用:指定当 ...

  6. spring boot常用注解的作用

    Controller层注解 @Controller和@RestController的区别 @RestController注解相当于@ResponseBody + @Controller合在一起的作用 ...

  7. 40 个 SpringBoot 常用的注解,你知道几个?

    一.Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 @RequestMapping @RequestMapping注解的主要用途是将Web请求与请求 ...

  8. 从源码深入理解Spring IoC 注解

    全注解下的 Spring IoC 本文基于 Spring Boot,所以并不使用 XML 配置,使用注解描述生成对象 版权声明:本文为博主原创文章,未经博主允许不得转载. Ioc 容器简介 Sprin ...

  9. .Net转Java自学之路—Spring框架篇二(IOC注解、AOP)

    Spring的Bean操作(注解方式): 注解:代码中特殊的标记,使用注解可以完成相关功能. @注解名称(属性名称=属性值) 注解可以使用在类.方法.属性上面. 主要用途:可以替代配置文件来创建对象和 ...

最新文章

  1. AlertDialog的使用(一)
  2. Docker部署脚本
  3. java 语言章节_2020知到Java语言程序设计章节答案
  4. Xamarin支持微软HoloLens混合现实开发
  5. 英语作文谈谈你对计算机的看法,英语作文:谈谈你对网络语言的看法
  6. (王道408考研操作系统)第三章内存管理-第一节6-4:非连续分配管理方式之基本分页存储管理之两级页表
  7. 聊聊spring的ioc
  8. iOS:Reachability网络监听
  9. 基于大数据平台的毕业设计
  10. 高考前最后一天,AI 监考老师已就位
  11. 松翰单片机定时器c语言,松翰T0 定时器中断
  12. Android作为客户端,PC作为服务端:实现网络通信
  13. 联想y7000笔记如何安装matlab,联想Y7000P笔记本怎样安装win7系统 安装win7系统操作分享...
  14. vue3自定义开发酒店房态时间组件
  15. matlab多边形检测_Matlab图像处理学习笔记(四):多边形检测
  16. Redis基础使用(四)——缓存优化
  17. 免费下载英文文献,这些网站你不能不知道!
  18. java 枚举 总结,java枚举总结
  19. Microsoft Store中应用的UWP什么意思?UWP版是什么意思?uwp版是什么意思?
  20. []==''返回?为什么?运算符==进行了什么操作?

热门文章

  1. 一款Windows管理Linux的软件
  2. 荣耀v40鸿蒙5g,荣耀V40pro再曝光,4K屏+双5000万+鸿蒙OS,再见了荣耀V30pro
  3. 彻底搞定用Xdoclet生成Hibernate所有配置文件
  4. Linux驱动程序开发 - 设备IO
  5. 先自己看文档和百度再沟通
  6. DevOps笔记-05:IT行业中BA、SM、PO、PM、PD、Dev、Ops、QA都是什么角色
  7. DevOps笔记-01:软件交付面临的问题、软件工程的三个发展阶段、什么是DevOps?
  8. springmvc十八:RestfulCRUD增删改查小实战
  9. 《编码:隐匿在计算机软硬件背后的语言(美)》读书笔记一
  10. 抓包工具Charles基本用法