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站尚硅谷
相关推荐
张国荣家的弟弟10 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S21 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos28 分钟前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
qxlxi1 小时前
【Spring事务】深入浅出Spring事务从原理到源码
spring
Yuan_o_1 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言