【进阶】Spring更简单的读取和存储对象
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
努力经营当下直至未来明朗
文章目录
普通小孩也要热爱生活
一、存储Bean对象
在spring-config.xml中配置bean标签比较麻烦此时就可以使用注解。注解在jdk1.5之后出现
一前置工作配置扫描路径重要
- 配置xml文件
xml文件
<?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:content="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.demo.component"></content:component-scan>
<bean id="article" class="com.demo.component.ArticleController"></bean>
</beans>
- 补充包的平铺
二添加注解存储Bean对象
- 类注解将注解写到类中将某个依赖动态地加载到类中将类对象存储到Spring中。
- 方法注解将方法返回的对象存储到Spring中。
3. 五大类注解
1@Controller控制器存储默认的id是类名小写。
2@Service服务存储
3@Repository仓库存储
4@Component组件存储
5@Configuration配置存储
4. 方法注解
@Bean将当前@Bean修饰方法的方法对象存储到Spring当中。
- 演示
6. 相关问题
1如果类名首字母是小写要怎么从Spring中获取Bean默认id是首字母小写
答
① 和首字母大写时是一样的都是使用将类名首字母小写的方式来获取Bean对象的。
② 同样的方式获取Spring对象ApplicationContext/BeanFactory、获取Bean对象getBean(“id”,类名.class)、使用Bean。
③ 【注意但是千万不要忘记加上类注解否则编译失败】
④ 默认id是小写开头当类名是小写字母开头时id同样也是小写开头也就是与类名相同此时是可以正确输出结果的。
2如果首字母和第二个字母都是大写会怎么样
答
① 当使用默认规则id首字母小写获取Bean对象的方法已经不适用了会抛出NoSuchBeanDefinitionException异常。
② 正确获取Bean的方式是id直接使用原类名就能成功获取到了。
3项目中如果没有包目录所有的类都写在java根路径下那么要怎么存取Bean对象呢
答
① 此时不管在xml的 base-package=""中配置空or其他路径都会出现NoSuchBeanDefinitionException错误此时需要使用通配符。
② 通配符*表示匹配任意一个的**表示匹配根路径以及根路径底下的所有子路径。
但是执行速度巨慢不建议使用
③ 使用通配符后可能会报错不要忘记加上类注解
④ 发现在添加了类注解之后还是报错 此时解决方法获取Spring对象的方法换为BeanFactory
7. 补充【结论、查看源码】
- 结论当使用五大类注解时默认情况下获取Bean对象id只需要将首字母小写即可然而当Bean对象首字母和第二个字母均是大写时此时需要使用原类名才能正确获取到Bean对象。【五大类注解均适用】
- 注意IDEA下按ctrl+r是查找替换当前文档内容连续按两下shift是全局搜索。
- 在IDEA中进行方法跳转ctrl+左键查看源码时适用
- 查看id命名规则方法
连续shift -> 搜索beanName -> AnnotationBeanNameGenerator
-> buildDefaultBeanName跳转 -> decapitalize跳转 -> 定位当前类位置
-> 定位到rt.jar中jdk的工具方法类
-> 分析源代码
-> 小结
默认是首字母小写如果一二个字母均是大写就直接使用原类名就ok
-
如果出现
NoSuchBeanDefinitionException
错误要么是没有加注解要么是id名字写错了亦或者是配置xml时包名没有配对。 -
如果在spring-config.xml配置package的包下还有子目录也是ok的可以访问到
三为什么要使用这么多类注解
-
为什么需要五个类注解
1通过类注解可以了解当前类的用途就类似看到车牌就知道是哪个城市的车
2功能有细微的不同在Spring MVC/Spring Boot中有体现等彼时再细讲。 -
五个类注解的用途【重要✨】
1@Controller控制器归属于业务逻辑层用来控制用户的行为它用来检查用户参数的有效性。
2@Sservice服务归属于服务层调用持久化类实现相应的功能。【不直接和数据库交互它类似于控制中心】
3@Repository仓库归属于持久层是直接和数据库进行交互的。通常每一个表都会对应一个@Repository仓库类。
4@Configuration配置归属于配置层是用来配置当前项目的一些信息。
5@Component组件归属于公共工具类提供某些公共方法。
-
五大类注解有什么关系
【使用ctrl+左键 进入源码进行查看】
1注@interface是自定义注解类
2【小结】
@Component是 @Controller / @Service / @Repository / @Configuration的父类。
五大类有区别但是具体在Spring MVC/ Spring Boot中细讲
四方法注解 @Bean
- 方法注解@Bean实现一个类的多次存到Spring中但是要注意方法注解是将方法返回的对象存到Spring中所以一定要有返回类型。
- 举栗子
1 方法注解配合五大类使用
2 进行获取
① 注意id默认是@Bean注解的方法的方法名
注意获取Spring对象的时候需要使用ApplicationContext
如果使用BeanFactory的话就会报错
BeanFactory的话就会报错原因可能是BeanFactory出现的太早导致后续在jdk1.5之后出现的注解不兼容读xml是没有问题的但是读bean就可能会存在问题。
-
注意事项==方法注解@Bean一定要配合五大类去使用==否则是无效的方法注解。
主要是考虑性能问题配合类注解更容易找到对应的路径 -
Bean是支持设置name属性的便于区分。并且是可以设置多个name的。
注意如果给@Bean设置name属性后id就不能再使用默认的方法名了
二、获取Bean对象对象装配
-
对象装配对象注入的实现方式有以下三种
1属性注入
2构造方法注入
3Setter注入 -
**以上所有的注入方法都要与类注解搭配使用**其中构造方法注入如果只有一个构造方法的话@Autowired是可以省略的。
1. 属性注入
-
@Autowired
直接进行声明就行 -
一定要进行类注释否则会编译错误
2. 构造方法注入官方推荐写法
-
直接将Bean对象作为构造方法的参数参数传入
-
依旧要使用@
Autowired构造方法上
和类注解
的搭配
-
注如果当前类中只有一个构造方法@Autowired是可以省略的。但是一个类中如果有多个构造方法就不可省略。
3. Setter注入
- 在设置setter方法的时候要加上 @Autowired注解并且在类上也要加上类注解。
- 在设置setter方法的时候不加上@Autowired注解就会报错。
4. 三种注入方式的区别【经典面试题】
请说说属性注入、构造方法注入和Setter注入的区别
【各自优缺点】
1属性注入
① 写法简单
② 但是通用性不好它只能运行在IoC容器下如果是非IoC容器就会出现问题并且只有在使⽤的时候才会出现 NPE空指针异常。
实际开发中常用
2Setter注入
① 早期Spring版本推荐的写法
② 但是Setter注入的通用性没有构造方法注入通用但是高于属性注入。
3构造方法注入
① 通用性更好它能确保使用注入对象之前此对象一定已经注入可以保证注入的类不为空因为是在构造方法中在实例化时就注入
② 但是当构造方法注入参数过多就会比较臃肿时此时开发者就要检查自己所写的代码是否符合“单一设计原则”的规范了。
此注入方式也是Spring后期版本中推荐的注入方式。
单一设计原则SRP它规定一个类只有一个发生变化的原因。如果多于一个导致类变更的原因则违反了SRP。
5. @Resource另⼀种注⼊关键字
- @Resource注入关键字类似于@Autowired使用方法很像但是有细微的差别。
- 在属性注入和Setter注入中@Resource可以替换@Autowired程序可以正常运行。
- 但是构造方法注入只能使用@Autowired使用@Resource直接报错。
- 小结@Resource支持属性注入和Setter注入但是不支持构造方法注入。
- 注@Resource是jdk提供的而@Autowired是Spring框架提供的。
6. @Resource和@Autowired的区别【经典面试题】
注意区别
① 对象注入有几种方式3种属性、构造方法和Setter注入
② 对象注入的方法2种@Resource和@Autowired
不确定时直接与面试官沟通确认是问哪一种
1相同点都可以实现将一个对象注入到一个类中
2不同点
① 出身不同@Resource来自于JDKjava亲儿子@Autowired是Spring框架提供的。
② 用法不同@Autowired 支持属性注入、构造方法注入和Setter注入@Resource不支持构造方法注入。
③ 支持的参数不同@Resource支持更多的参数设置如name、type等设置而@Autowired只支持required参数设置。
通常情况下我们会使用@Autowired
7. 同⼀类型多个 @Bean 报错
-
同一个类中出现多个@Bean类型上有类注解
-
使用属性注入获取Bean对象不要忘记类注解
-
获取到的Bean对象错误
-
此时同⼀个类型多个 bean 的解决⽅案有以下两个
① 使⽤ @Resource(name=“xxx”) 定义。
② 使⽤ @Qualifier 注解定义名称搭配@Autowired。 -
使用示例
1使⽤@Resource(name="xxx")
定义具体的方法。
注意name和@Bean的方法名保持一致
2使⽤ @Qualifier
注解定义名称。
① @Qualifier(value = “xxx”)
中的value也是和@Bean修饰的方法名保持一致
② @Qualifier必须和@Autowired配合使用
且只能是@Autowired不能是@Resource 。
小结
- 五大类注解及其关系
- 方法注解必须配合类注解
- Bean命名规则id
- 从Spring中获取Bean对象属性、Setter、构造函数注入
- 三种注入方式的区别相同点+不同点
- 注入关键字2个
- @Autowired 和 @Resource 区别出身、用法、支持的参数
- 解决同⼀类型多个 Bean 的报错2个方法