05-常用IOC注解按照作用分类
目录
- 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.@AutoWired
- 五、用于改变作用范围的
- 1. AccountServiceImpl 实现类
- 2. Client 主函数
- 六.和生命周期相关
- 1.实现类
- 2.Client
Sprin 基于注解的 IOC 以及 IOC 案例
- spring 中 ioc 的常用注解
- 案例使用 xml 方式和注解方式实现单表的 CRUD 操作
- 持久层技术选择:dbutils
- 改造基于注解的 IOC 案例,使用纯注解的方式是心啊
- spring 的一些新注解使用
- 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注解按照作用分类相关推荐
- 常用IOC注解按照作用分类
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Spring框架----Spring常用IOC注解的分类
学习基于注解的IOC配置,我们应该知道,注解配置和xml配置要实现的功能都是一样的,都是要降低程序的耦合,只是配置的形式不一样, 关于实际的开发中到底是使用xml还是注解,每家公司有着不同的使用习惯, ...
- Spring Ioc注解式开发中注解的作用
Spring Ioc注解式开发中注解的作用 目标:本章节注重于Spring Ioc的注解式开发之中注解的作用. 基于注解的DI实现IOC 1.定义bean而注解 a.@Component @Repos ...
- 注解的作用 常用注解
注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包.类.构造方法.域.方法.参数以及局部变量. 注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包.类.构造方法. ...
- Spring常用注解,以及注解的作用和简单用法
这篇文章主要介绍了Spring当中的常见的一些注解,以及注解的简单用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 @Configuration 作用:指定当 ...
- spring boot常用注解的作用
Controller层注解 @Controller和@RestController的区别 @RestController注解相当于@ResponseBody + @Controller合在一起的作用 ...
- 40 个 SpringBoot 常用的注解,你知道几个?
一.Spring Web MVC 与 Spring Bean 注解 Spring Web MVC 注解 @RequestMapping @RequestMapping注解的主要用途是将Web请求与请求 ...
- 从源码深入理解Spring IoC 注解
全注解下的 Spring IoC 本文基于 Spring Boot,所以并不使用 XML 配置,使用注解描述生成对象 版权声明:本文为博主原创文章,未经博主允许不得转载. Ioc 容器简介 Sprin ...
- .Net转Java自学之路—Spring框架篇二(IOC注解、AOP)
Spring的Bean操作(注解方式): 注解:代码中特殊的标记,使用注解可以完成相关功能. @注解名称(属性名称=属性值) 注解可以使用在类.方法.属性上面. 主要用途:可以替代配置文件来创建对象和 ...
最新文章
- AlertDialog的使用(一)
- Docker部署脚本
- java 语言章节_2020知到Java语言程序设计章节答案
- Xamarin支持微软HoloLens混合现实开发
- 英语作文谈谈你对计算机的看法,英语作文:谈谈你对网络语言的看法
- (王道408考研操作系统)第三章内存管理-第一节6-4:非连续分配管理方式之基本分页存储管理之两级页表
- 聊聊spring的ioc
- iOS:Reachability网络监听
- 基于大数据平台的毕业设计
- 高考前最后一天,AI 监考老师已就位
- 松翰单片机定时器c语言,松翰T0 定时器中断
- Android作为客户端,PC作为服务端:实现网络通信
- 联想y7000笔记如何安装matlab,联想Y7000P笔记本怎样安装win7系统 安装win7系统操作分享...
- vue3自定义开发酒店房态时间组件
- matlab多边形检测_Matlab图像处理学习笔记(四):多边形检测
- Redis基础使用(四)——缓存优化
- 免费下载英文文献,这些网站你不能不知道!
- java 枚举 总结,java枚举总结
- Microsoft Store中应用的UWP什么意思?UWP版是什么意思?uwp版是什么意思?
- []==''返回?为什么?运算符==进行了什么操作?
热门文章
- 一款Windows管理Linux的软件
- 荣耀v40鸿蒙5g,荣耀V40pro再曝光,4K屏+双5000万+鸿蒙OS,再见了荣耀V30pro
- 彻底搞定用Xdoclet生成Hibernate所有配置文件
- Linux驱动程序开发 - 设备IO
- 先自己看文档和百度再沟通
- DevOps笔记-05:IT行业中BA、SM、PO、PM、PD、Dev、Ops、QA都是什么角色
- DevOps笔记-01:软件交付面临的问题、软件工程的三个发展阶段、什么是DevOps?
- springmvc十八:RestfulCRUD增删改查小实战
- 《编码:隐匿在计算机软硬件背后的语言(美)》读书笔记一
- 抓包工具Charles基本用法