Spring-IoC 基于注解

基于xml方法见:http://t.csdnimg.cn/dir8j
注解是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理,简化 Spring的 XML配置。
格式:@注解(属性1="属性值1",...)
可以加在类上、属性上、方法上。

Spring 通过注解实现自动装配的步骤如下:

引入依赖:与xml同,不做赘述
开启组件扫描
使用注解定义 Bean
依赖注入

一、开启组件扫描

配置bean.xml文件扫描:<context:component-scan>
Spring 默认不使用注解装配 Bean,因此我们需要在 Spring的 XML 配置中(bean.xml),通过<context:component-scan>开启 Spring Beans的自动扫描功能。
需在bean.xml文件最上头添加:
开启此功能后,Spring 会自动从扫描指定的包(base-package 属性)及其子包下的所有类,如果类上使用了 @Component 注解,就将该类装配到容器中。

1. 最基本的扫包:扫描指定的包及其子包下的所有类

2. 指定要排除的组件:<context:exclude-filter>指定排除规则

属性type:设置排除或包含的依据
type="annotation",根据注解排除,expression中设置要排除的注解的全类名
type="assignable",根据类型排除,expression中设置要排除的类型的全类名

3. 仅扫描指定的组件:<context:include-filter>

其他与1.2相同。

二、使用注解定义Bean

以下注解写在类前,将类定义成Spring Bean。

这四个注解的作用功能一模一样,只是给开发者做一些区分。

value值与xml中bean的id作用相同,不写的话默认为该类的首字母小写的字符串。

三、依赖注入

1. @Autowired注入

在IoC容器匹配bean时,自动为该bean依赖的类类型、接口类型的属性赋值。

对应xml中的bean属性autowired,同样有两种:byType和byName。默认byType

可以加在构造方法、方法、属性、形参、注解上。

该注解有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,如果不存在则报错。如果required属性设置为false,表示注入的Bean存在或者不存在都没关系,存在的话就注入,不存在的话,也不报错。

以下例子中:

创建三个包,controller、Service、dao,其中controller包下有一个UserController类,Service包下有userService接口和实现该接口的userServiceImpl类,dao包下有userDao接口和实现该接口的userDaoImpl类。

1.1 属性注入:

1.2 set注入:在该属性的set方法前加注解

1.3 构造方法注入

如果只有一个有参构造函数,无参构造也没有,可以省略注解

1.4 形参注入

2. @Qualifier注入

与@Autowired联合使用,为byName注入:当接口有多个实现类时,使用byType注入会报错。
@Qualifier注解中的value属性为接口的一个实现类的类名(把首字母小写)

3. @Resource注入

@Resource注解也可以完成属性注入。那它和@Autowired注解有什么区别?

@Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。@Autowired注解是Spring框架自己的。
@Resource注解默认byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。@Autowired注解默认byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
@Resource注解用在属性上、set方法上。@Autowired注解用在属性上、set方法上、构造方法上、构造方法参数上。

@Resource注解属于JDK扩展包,所以不在IDK当中,需要额外引入以下依赖:(如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。)

使用:给Service的实现类通过@Service去个别名,在@Resource中设置好name。
如果@Resource中没有设置name,要保证属性名与别名一致。
如果@Resource没有设置name,也没有令属性名与别名保持一致,则会自动byType,但要保证该类型的bean唯一:

四、全注解开发

即不使用配置文件bean.xml,而是使用一个配置类来替代。
@Configuration注解:标注一个类为配置类。
@ComponentScan注解:替代配置类中<context:component-scan>标签,实现开启组件扫描功能,
主函数中加载配置类:配置类.class
参考:b站尚硅谷
相关推荐
喵叔哟12 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生18 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
不是二师兄的八戒42 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study2 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data2 小时前
二叉树oj题解析
java·数据结构
牙牙7052 小时前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck2 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端