Spring 管理 Bean-IOC--基于注解配置 bean

news2024/9/21 23:51:22

目录

Spring 管理 Bean-IOC--基于注解配置 bean

● 基本介绍

● 组件注解的形式有

代码演示--了解注解

UserDao  

 UserService 

 UserAction 

 MyComponent

  配置 beans.xml

 注意

测试

 

注意事项和细节说明

自动装配

基本说明

应用实例需求

UserService 

UserAction

配置.xml

测试

 

注意事项和细节说明

注意事项和说明

@Autowired

@Resource

说明:

泛型依赖注入

● 基本说明

各个类关系图

创建Book类

创建Phone类

 创建BaseDao类

  创建BookDao类

创建PhoneDao类

创建BaseService类

创建BookService类

创建PhoneService类

修改xml配置

 测试


Spring 管理 Bean-IOC--基于注解配置 bean

● 基本介绍

基于注解的方式配置 bean, 主要是项目开发中的组件,比如 Controller、Service、和 Dao.

● 组件注解的形式有

1. @Component 表示当前注解标识的是一个组件

2. @Controller 表示当前注解标识的是一个控制器,通常用于 Servlet

3. @Service 表示当前注解标识的是一个处理业务逻辑的类,通常用于 Service 类

4. @Repository 表示当前注解标识的是一个持久化层的类,通常用于 Dao 类

代码演示--了解注解

 创建UserDao  UserService UserAction MyComponent类来方便了解

UserDao  

@Repository

public class UserDao { }

 UserService 

@Service

public class UserService { }

 UserAction 

@Controller

public class UserAction { }

 MyComponent

@Component

public class MyComponent { }

  配置 beans.xml

1. component-scan 要对指定包下的类进行扫描, 并创建对象到容器
2. base-package 指定要扫描的包
3. 含义是当spring容器创建/初始化时,就会扫描com.hspedu.spring.component包
下的所有的 有注解 @Controller / @Service / @Respository / @Component类将其实例化,生成对象,放入到ioc容器
4. resource-pattern="User*.class" 表示只扫描com.hspedu.spring.component 和它的子包下User打头的类 

<?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:context="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">

    <!--配置容器要扫描的包
    1. component-scan 要对指定包下的类进行扫描, 并创建对象到容器
    2. base-package 指定要扫描的包
    3. 含义是当spring容器创建/初始化时,就会扫描com.hspedu.spring.component包
       下的所有的 有注解 @Controller / @Service / @Respository / @Component类
       将其实例化,生成对象,放入到ioc容器
    4. resource-pattern="User*.class" 表示只扫描com.hspedu.spring.component 和它的子包下的User打头的类

    -->
    <!--<context:component-scan base-package="com.spring.component"/>-->


    <!--
        需求:如果我们希望排除某个包/子包下的某种类型的注解,可以通过exclude-filter来指定
        1. context:exclude-filter 指定要排除哪些类
        2. type 指定排除方式 annotation表示按照注解来排除
        3. expression="org.springframework.stereotype.Service" 指定要排除的注解的全路径
    -->

    <!--<context:component-scan base-package="com.spring.component">-->
    <!--    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>-->
    <!--    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
    <!--</context:component-scan>-->

    <!--
        需求:如果我们希望按照自己的规则,来扫描包/子包下的某些注解, 可以通过 include-filter
        1. use-default-filters="false" 表示不使用默认的过滤机制/扫描机制
        2. context:include-filter 表示要去扫描哪些类
        3. type="annotation" 按照注解方式来扫描/过滤
        4. expression="org.springframework.stereotype.Service" 指定要扫描的注解的全路径
    -->

    <context:component-scan base-package="com.spring.component" use-default-filters="false">
       <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
       <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
       <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>
</beans>

 注意

如果我们希望排除某个包/子包下的某种类型的注解,可以通过exclude-filter来指定
        1. context:exclude-filter 指定要排除哪些类
        2. type 指定排除方式 annotation表示按照注解来排除
        3. expression="org.springframework.stereotype.Service" 指定要排除的注解的全路径

如果我们希望按照自己的规则,来扫描包/子包下的某些注解, 可以通过 include-filter
        1. use-default-filters="false" 表示不使用默认的过滤机制/扫描机制
        2. context:include-filter 表示要去扫描哪些类
        3. type="annotation" 按照注解方式来扫描/过滤
        4. expression="org.springframework.stereotype.Service" 指定要扫描的注解的全路径 

测试

  //通过注解来配置Bean
    @Test
    public void setBeanByAnnotation() {

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans05.xml");

        UserDao userDao = ioc.getBean(UserDao.class);
        //在默认情况下, 注解标识的类创建对象后,在容器中,id 为类名的首字母小写
        UserDao userDao1 = ioc.getBean("userDao", UserDao.class);
        System.out.println("userDao1=" + userDao1);

        UserService userService = ioc.getBean(UserService.class);
        UserAction userAction = ioc.getBean(UserAction.class);
        MyComponent myComponent = ioc.getBean(MyComponent.class);


        System.out.println("userDao=" + userDao);
        System.out.println("userService=" + userService);
        System.out.println("userAction=" + userAction);
        System.out.println("myComponent=" + myComponent);



        System.out.println("ok");

    }

 

注意事项和细节说明

1. 需要导入 spring-aop-5.3.8.jar , 别忘了

2. 必须在 Spring 配置文件中指定"自动扫描的包",IOC 容器才能够检测到当前项目中哪些类被标识了注解, 注意到导入 context 名称空间

<!-- 配置自动扫描的包 -->

<context:component-scan base-package="com.spring.component" />

可以使用通配符 * 来指定 ,比如 com.spring.* 表示

提问: com.spring.component 会不会去扫描它的子包?

答:会的

Spring 的 IOC 容器不能检测一个使用了@Controller 注解的类到底是不是一个真正的控制器。

注解的名称是用于程序员自己识别当前标识的是什么组件。

其它的@Service   @Repository 也是一样的道理 [也就是说 spring 的 IOC 容器只要检查到注解就会生成对象,

但是这个注解的含义 spring 不会识别,注解是给程序员编程方便看的]

默认情况:标记注解后,类名首字母小写作为 id 的值。也可以使用注解的 value 属性 指定 id 值,

并且 value 可以省略。

@Controller(value="userAction01")

@Controller("userAction01")

 

自动装配

基本说明

1. 基于注解配置 bean,也可实现自动装配,使用的注解是:@AutoWired 或者 @Resource

2. @AutoWired 的规则说明

1) 在 IOC 容器中查找待装配的组件的类型,如果有唯一的 bean 匹配,则使用该 bean 装配

2) 如待装配的类型对应的 bean 在 IOC 容器中有多个,则使用待装配的属性的属性名作为 id 值再进行查找, 找到就装配,找不到就抛异常

3. @Resource 的规则说明

1) @Resource 有两个属性是比较重要的,分是 name 和 type,Spring 将@Resource 注解的name 属性解析为 bean 的名字,

而 type 属性则解析为 bean 的类型.所以如果使用 name 属性,则使用 byName 的自动注入策略,

而使用 type 属性时则使用 byType 自动注入策略

2) 如果@Resource 没有指定 name 和 type ,

则先使用byName注入策略, 如果匹配不上,再使用 byType 策略, 如果都不成功,就会报错

4. 建议,不管是@Autowired 还是 @Resource 都保证属性名是规范的写法就可以注入.

应用实例需求

1. 以 Action/Service/Dao 几个组件来进行演示
2. 这里就演示 UserAction 和 UserService 的两级自动组装

UserService 

@Service
public class UserService {
public void hi(){
System.out.println("UserService hi()~");
}
}

UserAction

@Controller
public class UserAction {
    //xml配置 ref
    //说明 @Autowired
    //1)在IOC容器中查找待装配的组件的类型,如果有唯一的bean匹配(按照类型),则使用该bean装配
    //2)如待装配的类型对应的bean在IOC容器中有多个,则使用待装配的属性的属性名作为id值再进行查找,
    //  找到就装配,找不到就抛异常

    //说明 @Resource
    //1) @Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,
    //  而type属性则解析为bean的类型.所以如果使用name属性,则使用byName的自动注入策略,
    //  而使用type属性时则使用byType自动注入策略
    //  比如@Resource(name = "userService") 表示装配 id=userService对对象
    //  比如@Resource(type = UserService.class) 表示按照UserService.class类型进行装配, 这时要求容器中,只能有一个这样类型的对象
    //2) 如果@Resource 没有指定 name 和 type ,则先使用byName注入策略,
    //   如果匹配不上, 再使用byType策略, 如果都不成功,就会报错

    //=================================
    //说明: @Autowired + @Qualifier(value = "userService02") 组合也可以完成指定 name/id 来进行自动装配
    //指定id进行组装, 也可以使用@Autowired 和 @Qualifier(value = "userService02")
    // 这时,是装配的 id=userService02 , 需要两个注解都需要写上

    @Resource
    private UserService userService;

    public void sayOk() {
        System.out.println("UserAction 的sayOk()");
        System.out.println("userAction 装配的 userService属性=" + userService);
        userService.hi();
    }
}

配置.xml

    <context:component-scan
            base-package="com.spring.component"/>

    <!--配置两个UserService对象-->
    <bean class="com.hspedu.spring.component.UserService" id="userService200"/>
    <bean class="com.hspedu.spring.component.UserService" id="userService300"/>

 

测试

 public void setProByAutowired() {

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans06.xml");

        UserService userService = ioc.getBean("userService", UserService.class);
        System.out.println("ioc容器中的userService=" + userService);

            UserService userService200 = ioc.getBean("userService200", UserService.class);
        System.out.println("ioc容器中的userService200=" + userService200);

        UserAction userAction = ioc.getBean("userAction", UserAction.class);
        //System.out.println("userAction=" + userAction);
        userAction.sayOk();
    }   

 

注意事项和细节说明

注意事项和说明

xml配置 ref

@Autowired

        1)在IOC容器中查找待装配的组件的类型,如果有唯一的bean匹配(按照类型),则使用该bean装配

        2)如待装配的类型对应的bean在IOC容器中有多个,则使用待装配的属性的属性名作为id值再进行查找,

找到就装配,找不到就抛异常

@Resource

        1) @Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,

而type属性则解析为bean的类型.所以如果使用name属性,则使用byName的自动注入策略,

而使用type属性时则使用byType自动注入策略

比如@Resource(name = "userService") 表示装配 id=userService对对象

比如@Resource(type = UserService.class) 表示按照UserService.class类型进行装配, 这时要求容器中,只能有一个这样类型的对象

2) 如果@Resource 没有指定 name 和 type ,则先使用byName注入策略,如果匹配不上, 再使用byType策略, 如果都不成功,就会报错

说明:

@Autowired + @Qualifier(value = "userService02") 组合也可以完成指定 name/id 来进行自动装配指定id进行组装, 也可以使用@Autowired 和 @Qualifier(value = "userService02")

这时,是装配的 id=userService02 , 需要两个注解都需要写上

 

泛型依赖注入

● 基本说明

1. 为了更好的管理有继承和相互依赖的 bean 的自动装配,spring 还提供基于泛型依赖的注入机制
2. 在继承关系复杂情况下,泛型依赖注入就会有很大的优越性 

各个类关系图

 

 传统方法是将 PhoneDao /BookDao 自动装配到 BookService/PhoneSerive 中,当这 种继承关系多时,就比较麻烦,可以使用 spring 提供的泛型依赖注入

创建Book类

public class Book {}

创建Phone类

public class Phone{}

 创建BaseDao<T>类

public abstract void save();

  创建BookDao类

@Repository
public class BookDao extends BaseDao<Book>{
    @Override
    public void save() {
        System.out.println("BookDao 的 save()..");
    }
}

创建PhoneDao类

@Repository
public class PhoneDao extends BaseDao<Phone>{
    @Override
    public void save() {
        System.out.println("PhoneDao save()");
    }
}

创建BaseService类


public class BaseService<T> {
    @Autowired
    private BaseDao<T> baseDao;

    public void save() {
        baseDao.save();
    }
}

创建BookService类

@Service
public class BookService extends BaseService<Book>{
    //并没有写属性
}

创建PhoneService类

@Service
public class PhoneService extends BaseService<Phone>{
    
}

修改xml配置

    <context:component-scan base-package="com.spring.depinjection"/>

 测试

    @Test
    public void setProByDependencyInjection() {

        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans07.xml");
        PhoneService phoneService = ioc.getBean("phoneService", PhoneService.class);
        phoneService.save();
        System.out.println("ok");

    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MLC LLM:将大模型运行在手机端的部署工具

前言 MLC LLM 是一个通用的解决方案 它允许任何语言模型在不同的硬件后端和本地应用程序集上进行本地部署 并为每个人提供一个高效的框架&#xff0c;以进一步优化模型的性能&#xff0c;满足他们自己的用例 其使命是让每个人都能在自己的设备&#xff08;如手机端&#xf…

WordPress 不使用ftp更新

文章目录 摘要修改 wp-config.php文件处理 413 Request Entity Too Large修改nginx配置&#xff1a;client_max_body_size重启nginx 处理uploaded file exceeds the upload max filesize找到php.ini修改 upload_max_filesize重启php 摘要 每次 WordPress 有插件或主题更新都要…

计算机组成原理第五章(2)---中断

5.1概述 产生和应用 在IO设备和主机交换数据时&#xff0c;由于设备本身的机电特性的影响&#xff0c;其工作速度比较低&#xff0c;与CPU无法匹配&#xff0c;如果采用程序查询的方式需要CPU进行等待&#xff0c;但是如果在等待的过程中CPU可以执行其他的程序&#xff0c;可…

04_Uboot操作命令与其他命令

目录 BOOT 操作命令 bootz命令 bootm 命令 reset 命令 go 命令 run 命令 mtest 命令 BOOT 操作命令 uboot的本质工作是引导Linux,所以uboot肯定有相关的boot(引导)命令来启动Linux。常用的跟boot有关的命令有:bootz、bootm和boot。 bootz命令 要启动Linux,需要先将Lin…

《LearnUE——基础指南:上篇—1》——GamePlay架构之Actor和Component

目录 Component大法好&#xff0c;谁用谁知道&#xff01;&#xff01; 1.1.1 创世&#xff08;UObject&#xff09; 1.1.2 造物&#xff08;Actor&#xff09; 1.1.3 赋能&#xff08;Component&#xff09; Component大法好&#xff0c;谁用谁知道&#xff01;&#xff0…

合肥职业技术学院分类考试招生职业技能考试 -- 计算机专业

考试大纲模块一 专业能力测试主要内容模块二 技术技能测试主要内容分值分布 分模块讲解模块一 专业能力测试计算机的发展、类型及其应用领域计算机技术的发展计算机应用领域 计算机中数据的表示、存储和处理计算机软、硬件系统的组成及主要技术指标计算机软、硬件系统的组成硬件…

YOLOv5-7.0训练中文标签的数据集

链接&#xff1a;https://pan.baidu.com/s/1KSROxTwyYnNoNxI5Tk13Dg 提取码&#xff1a;8888 以显示楷体为例&#xff08;上面的百度网盘里面有黑体、宋体、楷体ttf文件&#xff09; (1)将metric.py中&#xff1a; 将 sn.set(font_scale1.0 if nc < 50 else 0.8) # for …

iOS可视化动态绘制八种排序过程

一、可视化解决方案综述 1.交互UI综述 在本篇博客的第一部分我们先来整体的看一下我们Demo的功能。下方就是我们今天博客中的Demo的交互示意图。上方的输入框可以输入要排序元素的个数&#xff0c;下方输入的是300。程序会根据你输入的个数来随机生成数据&#xff0c;你输入30…

D. Edge Deletion(堆优化最短路)

Problem - D - Codeforces 给定一个由 n 个顶点和 m 条边组成的无向连通加权图。将从顶点 1 到顶点 i 的最短路径长度表示为 di。 你必须删除一些图中的边&#xff0c;使得最多只保留 k 条边。如果在删除边后&#xff0c;仍然存在从 1 到 i 的路径&#xff0c;其长度为 di&…

【数学建模】matlab的常用函数运用(1)

文章目录 1. matlab基本常识2. 常用输入输出函数2.1 输出函数2.2 拼接函数&#xff08;字符串的合并&#xff09;2.3 输入函数 3. 求和函数3.1 向量求和3.2 矩阵求和 4. 提取矩阵元素4.1 取第x行第y列的元素4.2 取指定行或列的所有元素4.3 取指定某些行的所有元素 1. matlab基本…

【OMNET++】V2X仿真

1.前言 车载无线通信技术V2X即Vehicle to Everything&#xff0c;是在车辆和任何会被该车辆所影响的实体之间分享信息的技术。V2X的主要动机是道路安全、交通效率和节能。 车辆影响实体的分类&#xff1a; Vehicle:对应其他车辆&#xff0c;对应通信V2V&#xff0c;对应设备是…

Linux学习[9]查找文件指令:which whereis locate find

文章目录 前言1. which2. whereis3. locate4. find总结&#xff1a; 前言 之前在弄交叉编译的时候需要找到gcc&#xff0c;gdb什么的在哪里&#xff1b;涉及到了查找文件指令。 这里对linux中的查找指令进行总结 1. which which指令一般用来寻找可执行文件的路径&#xff0c;…

C. Playing Piano(dfs)

Problem - C - Codeforces 小Paul想学弹钢琴。他已经有了一首想要开始演奏的旋律。为简单起见&#xff0c;他将这个旋律表示为键号序列a1,a2,…,an&#xff1a;数字越大&#xff0c;它就越靠近钢琴键盘的右侧。 Paul非常聪明&#xff0c;知道关键是正确地为他要演奏的音符分配…

git-windows安装

1.下载地址 https://www.git-scm.com/ 2.第一步&#xff0c;直接next 3.选择默认安装路径 4. 选择组件&#xff0c;默认 5.开始菜单是否创建&#xff0c;默认不创建 6.这里是设置 Git 默认编辑器&#xff0c;我们这里直接下一步 "Next" 7.调整新仓库中初始分支的名称…

观察 | 卫浴产业数字化转型下的中国智造样本

文 | 智能相对论 作者 | 佘凯文 数字技术的发展已成为全球科技变革向高端技术不断升级的方向。 年初&#xff0c;中共中央、国务院印发《数字中国建设整体布局规划》&#xff0c;这是党的二十大后党中央在我国数字化发展领域作出的最全面擘画&#xff0c;从顶层设计的高度对…

elasticsearch结构化查询(一)

在上一篇中我们介绍了DSL相关的知识&#xff0c;接下来我们将会学习elasticsearch的结构化查询&#xff0c;同时也实践一下上一篇的DSL的查询用法 什么是结构化搜索? 从《Elasticsearch权威指南》上摘取部分解释如下: 结构化搜索是指查询包含内部结构的数据。日期&#xff0…

CentOS 7.6更改yum源

使用字符串替换 我这里的操作参考了https://baijiahao.baidu.com/s?id1708418392526536542&wfrspider&forpc这篇文章&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/help/centos/是清华大学官网教程。 /etc/yum.repos.d/CentOS-Base.repo文件如下&#xff1a; #…

Python的类与对象、构造方法、类与对象三大特性封装、继承和多态、类型注解

类与对象 1.Python的对象 使用对象组织数据 在程序中是可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的。 在程序中设计表格&#xff0c;我们称之为&#xff1a;设计类(class) class Student: name None #记录学生姓名 在程序中打印生产表格&…

【MySQL】函数和约束

如标题所说,本文重点只有两个:MySQL语句里面的函数和约束 目录 1. 函数1.1 字符串函数1.2 数值函数1.3 日期函数1.4 流程函数 2.约束2.1 外键的删除更新行为 1. 函数 因为在前一篇文章里面有讲到聚合函数,所以在这里就不重复介绍了,本文所介绍的函数有4类:字符串函数,数值函数…

瑞吉外卖+Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目

瑞吉外卖 Redis基础 Redis入门 redis.io nosql没有表的概念 下载与安装 注意关闭防火墙 systemctl stop firewalld 启动redis src/redis-server ./redis.conf 数据类型 常用命令 字符串 string 操作命令 哈希 hash 操作命令 列表list(类似 栈 )操作命令 集合set 操作命令 sdif…