| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> (续)SSM整合之spring笔记(IOC 基于注解管理bean之注解和扫描,扫描组件,bean的id)(P087—P090) -> 正文阅读 |
|
[Java知识库](续)SSM整合之spring笔记(IOC 基于注解管理bean之注解和扫描,扫描组件,bean的id)(P087—P090) |
基于注解管理bean?一. 实验一:标记与扫描(基于注解管理bean之注解和扫描)1 .注解与扫描的概念①注解
和
XML
配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测
到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。
本质上:所有一切的操作都是
Java
代码来完成的,
XML
和注解只是告诉框架中的
Java
代码如何执行。
举例:元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,红色的地方贴上拉花,黄色的地方贴 上气球。
?
班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,后面同学们 做的工作,相当于框架的具体操作。
基于xml管理bean也是很多的? ?
因为要管理bean,?bean是一个对象? 基于注解管理bean? ?注解是要加到当前对象所对应的类上的,
如果让ioc管理第三方jar包里面提供的类? 就没法用注解? 因为这个不是我们自己写的? 就好比druid
是第三方jar包提供的? ?第三方放的都是calls文件? calls文件没法修改 加上注解??
管理bean的二种方式: xml? ?注解
②扫描
Spring
为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。然后根据注解进行后续操作。
以后的实体类是不会交给ioc容器为管理的? ? ?所以不可能在每一个类上都加上注解? 不可能每一类都交给ioc管理 所以不但要有注解还要扫描??
演示??com.atguigu.spring
2 .准备工作① 新建spring_ioc_annotation?②? 导入依赖<dependencies> <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.1</version> </dependency> <!-- junit测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> ③? 创建三层架构?控制层 com.atguigu.spring.controller.UserController 业务层 :com.atguigu.spring.service.UserService? ? ?接口 ? ? ? ? ? ? ? ?com.atguigu.spring.service.impl.UserServiceImpl? ?实现类? 持久层:com.atguigu.spring.dao.UserDao? ? 接口 ? ? ? ? ? ? ? com.atguigu.spring.dao.impl.UserDaoImpl? ? 实现类 代码如下 : 控制层 com.atguigu.spring.controller.UserController
业务层 :com.atguigu.spring.service.UserService? ? ?接口 ? ? ? ? ? ? ? ?com.atguigu.spring.service.impl.UserServiceImpl? ?实现类?
持久层:com.atguigu.spring.dao.UserDao? ? 接口 ? ? ? ? ? ? ? com.atguigu.spring.dao.impl.UserDaoImpl? ? 实现类
④? ?创建Spring配置文件 spring-ioc-annotation.xml⑤? 测试类? ?IOCByAnnotationTest
? 3 .现在我们要做的事情现在要做的事情就是通过注解来管理bean? 那我们有哪些注解呢? 我们现在要把一个类交给IOC来管理? 我们要用到以下四个注解 ① 标识组件的常用注解
@Component
:将类标识为普通组件
组件:每一个bean都是IOC容器的组件? ?所以将类标识为普通组件就是加上这个注解并扫描之后,就可以把当前加上这个注解的类做为一个bean 被IOC容器管理?
@Controller
:将类标识为控制层组件
@Service
:将类标 识为业务层组件
@Repository
:将类标识为持久层组件
问:以上四个注解有什么关系和区别?
通过查看源码我们得知,
@Controller
、
@Service
、
@Repository
这三个注解只是在
@Component
注解
的基础上起了三个新的名字。
对于
Spring
使用
IOC
容器管理这些组件来说没有区别。所以
@Controller
、
@Service
、
@Repository
这
三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。
注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。
②? 接下来我们要把注解标记在我们刚才创建的三层架构上代码如下:
控制层组件
业务层组件
UserServiceImpl
持久层组件
UserDaoImpl
注意:注解不能加到接口? ?一定要加到实现类上?? 因为加上注解的作用是:? 加上注解的类在IOC容器中配置了一个当前类型的bean? 一个bean的类型不能够是一个接口类型?? ③? 接下去 我们要在配置文件spring-ioc-annotation.xml里面进行扫描为什么要扫描: 在类上加上注解 要想让spring知道? 得要扫描? 要让spring知道哪些类加上了注解? 加了什么注解?? 因为一层一层的包 就是一层一层的目录? 所以我们主要扫描包就可以
④? 接下来我们来进行测试一下在理解一下 注解+扫描的意思: 它可以将我们扫描的包下 加上注解的这些类做为组件进行管理? 做为组件进行管理:在IOC容器中就有了 当前加上这个注解 的这个类 所对应的bean对象 测试:
??二. 标记与扫描(基于注解管理bean之扫描组件)问题: 以后在ssm整合的时候? spring 和springmvc 是放在一块使用的? 而springmvc要扫描的是我们的控制层,spring要扫描的是除控制层以外的所有组件??? 这个时候应该怎么办? 我们现在要做的是 springmvc 扫描控制层 然后spring把其他的层给扫描了? 就要用到排除扫描标签 具体如下 1 .排除扫描第一种??annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名(用得多)
测试:
? 虽然在控制层加了 但是因为排除了 所以并没有扫描到? ?但是不影响对其他层的扫描 如下 测试
? 全类名的复制方法; 要把控制层的扫描给排除掉? 所以我们找到控制层 找到注解 点击右键? 把全类名放过来? 这个时候就不扫描控制层了? ??第二种 :assignable:根据类的类型进行排除,expression需要设置排除的类的全类名(用得少)
测试:
全类名的复制方法 我们找到控制层 找到UserController类?点击右键? 把全类名放过来? 这个时候在扫描包的时候就会把UserController类给排除? ?注意:以后用得比较多的是根据注解的方式排除 因为以后要用到这个标签<context:exclude-filter type=""的时候是在ssm整合的时候? ?springmvc要扫描的是控制层? spring要扫描的是除控制层以外的其他组件? 二种方法整合一起并解释:
总结: <!-- context:exclude-filter:排除扫描 type:设置排除扫描的方式 type="annotation|assignable" annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名 assignable:根据类的类型进行排除,expression需要设置排除的类的全类名--> 2 .包含扫描? ?只扫描
测试:
测试结果发现都可以扫描到 修正如下:
?测试:
总结: context:include-filter:包含扫描 注意:需要在context:component-scan标签中设置use-default-filters="false" use-default-filters="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描 use-default-filters="false",所设置的包下所有的类都不需要扫描,此时可以使用包含扫描 ?二种方法全部总结: <!-- context:exclude-filter:排除扫描 type:设置排除扫描的方式 type="annotation|assignable" annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名 assignable:根据类的类型进行排除,expression需要设置排除的类的全类名 context:include-filter:包含扫描 注意:需要在context:component-scan标签中设置use-default-filters="false" use-default-filters="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描 use-default-filters="false",所设置的包下所有的类都不需要扫描,此时可以使用包含扫描 --> ?我们以后排除扫描用得比较多? 包含扫描用得比较少 因为麻烦 平常用的话只要下如下就可以
三. 标记与扫描(基于注解管理bean之bean的id)
在我们使用
XML
方式管理
bean
的时候,每个
bean
都有一个唯一标识,便于在其他地方引用。现在使用 注解后,每个组件仍然应该有一个唯一标识。
默认情况
类名首字母小写就是
bean
的
id
。例如:
UserController
类对应的
bean
的
id
就是
userController
。
自定义
bean
的
id
可通过标识组件的注解的
value
属性设置自定义的
bean
的
id
@Service("userService")//
默认为
userServiceImpl public class UserServiceImpl implements
UserService {}
复习: 注解所标识的类交给IOC管理: 注解标识的类经过 扫描之后在IOC容器中 自动去配置一个相对应的bean? 新知识: 问题:我们知道bean 都是有id的? 通过注解+扫描的id是啥呢? 答案:通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名的首字母为小写的结果 验证: IOCByAnnotationTest
?自定义bean的id? 可以通过标识组件的注解的value属性值设置bean的自定义的id UserController
? ? springmvc文件上传解析器? 就是根据id来获取的? 其他的地方一般用到的都是根据类型来获取? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年5日历 | -2024/5/18 6:14:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |