| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring(IOC与DI相关)的纯注解配置详解 -> 正文阅读 |
|
[Java知识库]Spring(IOC与DI相关)的纯注解配置详解 |
导读:? ? ? ?? ?????????我们在刚开始进行spring的学习时, 大部分都是在applicationContext.xm的配置文件中向IOC容器中注入bean,但是这种方式实在是有点麻烦,所以从spring的2.5版本开始就引入注解的方式来帮助我们简化bean的配置,而现在spring版本已经升级到5.0以上了,使用注解的方式来进行配置bean已经越来越普遍,在springboot中更是没有了applicationContext.xml的配置文件,都是采用注解的方式来进行IOC的注入,所以了解如何用注解来进行bean的配置变得很重要了。 IOC相关的注解@Configuration注解? ? ? ? 作用:在applicationContext.xml配置文件中我们配置bean都是在<beans></beans>标签中进行的,而在纯注解的配置中我们不需要applicationContext.xml这个文件,所以在这里Configuration注解就相当于applicationContext.xml中的beans标签 ? ? ? ? 使用:? 在一个类前加上这个注解即可,该类就相当于一个beans标签了
启动容器????????与通过配置文件启动容器的方式相同,只不过是使用AnnotationConfigApplicationContext这个实现类传入字节码对象即可
@ComponentScan注解(包扫描注解)????????作用: 我们在使用配置注解(比如@Autowired,@Component等注解,下面会讲)时, 如果我们只是在一个方法或者类前写一个注解,那么spring怎么知道我们要将哪个类交给IOC容器管理呢,所以这个注解的作用就是告诉spring要扫描哪些包下的类,将这些配置了注解的类交给IOC容器管理 ? ? ? ? 使用:?在添加了@Configuration的注解类前加上此注解, 并且指定basePackages属性的值即可.
@Component注解????????作用:将一个类注入IOC容器中,相当于先前配置文件中的bean标签 ? ? ? ? 使用:? 在一个类前加上此注解即可, 有一个value参数,作用是指定注入类的名称,相当于bean标签中的id属性.也可以省略不写,默认为类名首字母小写名称,例如Plant类的默认名称为plant
@Controller,@Service,@Repository注解? ? ? ? 与上面的@Component注解作用与用法一样,只是帮助我们标识此类在项目中的层面罢了, @Controller常用于控制层(其实在后面的web开发中,被它修饰的类中的方法默认都是一个Servlet,现在了解即可),@Service用于业务层,@Repository用于数据操作层。 @Scope注解? ? ? ? 作用:指定类的制造方式为单例还是单例 ? ? ? ? 使用:放置在类前面即可,指定为单例还是多例模式
@PostConstruct,@PreDestroy注解????????作用:为一个类指定初始化(@PostConstruct)或者销毁(@PreDestroy)方法,相当于bean标签中的init-method和destroy-method方法 ? ? ? ? 使用:在一个想要充当初始化或者销毁方法的方法前添加此注解
测试:
结果:
DI相关注解?@Autowired,@Resource, @Qualifier(需配合Autowired注解使用)注解? ? ? ? 作用: 这些注解都是用来自动装配引用类型的注解,装配的bean必须在IOC容器中存在 ? ? ? ? 使用: 在一个setter或者字段名之前都可以添加使用.
? ? ? ? 区别:@Autowired:@Autowired注解是默认首先按照类型装配的(byType),如果找不到对应类型的bean或者找到多个类型相同的bean,则再按照名称进行装配(byName)。如果想直接指定名称进行装配则需要配合@Qualifier注解进行使用: 首先我们创建两个类型一样的bean,一个为animal,一个为animal1 ?然后我们在字段animals前添加此注解,由于@Autowired先根据类型进行装配,但是IOC中有两个类型相同的bean(animal和animal1),如前面所说,当找到多个类型的bean时,@Autowired注解会按照名称进行装配,所以这里就会按照bean的名称进行装配,但是这里变量的名称为animals,而两个bean的名称为animal和animal1(与变量名称不同,因为是按名称装配所以装配不成功),所以这里就会报错
开启测试:
结果:
但是我们只要将字段名改为"animal"或者"animal1"就会运行成功
结果:
还可以直接为@Autowired注解指定以名称进行装配,这时就要使用@Qualifier注解,例如:
我们这里使用@Qualifier注解指定@Autowired以指定名称进行装配(@Qualifier必须配合@Autowired使用),所以@Autowired会找到名称为"animal"的bean装配给myAnimal这个属性。 @Resource? ? ? ? @Resource注解如果没有指定name和type属性则默认以名称进行装配,当注解写在字段上时,默认取字段名为指定名称,如果没有找到对应的bean,则再以类型进行自动装配,如果找不到或者找到多个同一类型的bean则报错;如果指定name属性则只会按照名称进行装配,没有找到指定的名称则报错,如果指定type属性则只会按照类型进行装配,如果找不到或者找到多个同一类型的bean则报错; @Value注解? ? ? ? 作用:给简单类型字段进行赋值 ? ? ? ? 使用:在简单类型字段前添加即可
测试:
结果:
可以看出值已经注入进去了; @Value还可以读取properties配置文件中的值: 1.通过@PropertySource注解将properties文件加载进来
2.通过${属性名}进行引用
@Bean注解? ? ? ? 作用: 将静态工厂方法或者实例工厂方法的返回对象注入到IOC容器中 ? ? ? ? 使用: 在工厂方法前加上此注解即可,可通过value指定bean的名称,如果不进行指定的话默认为方法名名称。
从下图可以看出@Bean如果没有指定value值则会使用方法名作为bean的名称,并且已经成功的将工厂方法产生的对象注入到IOC容器中了 ?@Import注解? ? ? ? 当我们在被@Configuratin注解修饰的类中写多个被@Bean修饰的工厂方法时,可能会使修饰的类变得臃肿庞大,所以我们可以通过@Import注解将其它类中的被@Bean修饰的方法名引入进来来.
PersonFactory类:
结果: ?可以看出工厂方法返回的对象也被注入到IOC中了 上面这些注解就是我们在spring配置中常用的注解了,感谢您的阅读!! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 13:25:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |