④【Spring】IOC - 基于注解方式 管理bean

news2024/11/13 16:01:58

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

注解管理Bean

  • 一、注解的功能
  • 二、四个典型注解
  • 三、扫描注解
    • ①基本的扫描方式
    • ②指定匹配模式
    • ③指定扫描时要排除的组件
    • ④指定仅扫描什么组件
    • 注:bean的id属性
  • 四、自动装配
  • 五、完全注解开发
    • ⚪配置类
    • ⚪测试
  • 六、整合Junit 4
    • ⚪组件类
    • ⚪XML配置文件
    • ⚪测试类
  • 🚀小结


一、注解的功能


注解本身只是一种标记,是不能被执行的,但是框架功能检测到注解后,会根据当前位置注解标记的功能来执行具体的操作。

框架中的操作都由Java代码执行,注解只是告诉框架需要执行那些代码。




二、四个典型注解


  • @Component : 标记普通的组件
  • @Controller : 标记三层架构表述层中的控制器组件(controller)
  • @Service : 标记表述层中的业务逻辑组件(service)
  • @Repository : 标记持久化层组件(DAO)

@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字,对于Spring使用IOC容器管理这些组件来说没有任何区别,也就是语法层面没有区别。之所以这么做是为了增加代码可读性,让我们能够便于分辨组件的作用。





三、扫描注解


①基本的扫描方式

  • XML配置文件中,配置自动扫描的包;
<context:component-scan base-package="com.haojin.ioc.component"/>
base-package属性 配置自动扫描的包
包名:使用注解组件类所在的包


②指定匹配模式

  • XML配置文件中,配置了自动扫描的包的基础上,指定匹配模式
<context:component-scan base-package="com.haojin.ioc.component"
                            resource-pattern="Test*.class"/>
resource-pattern属性 指定匹配模式
指定匹配模式外组件类的bean不会创建,所以获取没有创建的bean时会报错


③指定扫描时要排除的组件

  • XML配置文件中,指定不扫描的组件/扫描时排除的组件
    <context:component-scan base-package="com.haojin.ioc.component">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
- context:exclude-filter标签,指定不扫描的组件
- type属性指定根据什么来进行排除,annotation取值表示根据注解来排除
- expression属性:指定排除规则的表达式,对于注解来说指定全类名即可


④指定仅扫描什么组件

  • 仅扫描 = 关闭默认规则 + 追加规则
  • 属性 use-default-filters ,取值false表示关闭默认扫描规则
  • context:include-filter标签:指定在原有扫描规则的基础上追加的规则(仅扫描)
  • expression属性:指定仅扫描规则的表达式,对于注解来说指定全类名即可
    <context:component-scan base-package="com.haojin.ioc.component" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>


注:bean的id属性

在我们使用 XML 方式管理 bean 的时候,每个 bean 都有一个唯一标识——id 属性的值,便于在其他地方引用。现在使用注解后,每个组件仍然应该有一个唯一标识。


默认:类名首字母小写就是 bean 的 id。如:TestController 类对应 testController


指定:标记注解时,使用value属性指定

@Controller(value = "controller")
public class TestController {
}




四、自动装配


  • 前提:参与自动装配的组件,全部都必须在IOC容器中。(都需要创建bean)
  • 使用 @Autowired注解 实现自动装配

案例:

- TestController 需要 TestService;
- TestService 需要 TestDao;
- 同时在各个组件中声明要调用的方法。

- TestDao组件,含getMessage()方法

@Repository
public class TestDao {

    public void getMessage(){
        System.out.println("all girls are the same...");
    }

}

- TestService组件,@Autowired注解标记 TestDao

//这个组件就是我们在三层架构中使用的业务逻辑组件。
@Service
public class TestService {
	//在成员变量上直接标记@Autowired注解即可
    @Autowired
    TestDao testDao;

    public void getMessage(){
        testDao.getMessage();
    }
}


- TestController组件,@Autowired注解标记 TestService

//这个组件就是我们在三层架构中表述层里面,使用的控制器。以前是Servlet,以后我们将会使用Controller来代替Servlet。
@Controller(value = "controller")
public class TestController {
    @Autowired
    TestService testService;

    public void getMessage(){
        testService.getMessage();
    }


}


自动装配的流程

在@Autowired注解的下一行,
可以使用@Qualifier注解 指定 bean 的 id ,不使用则默认id;
    @Autowired
    @Qualifier(value = "beanIdName")

在这里插入图片描述





五、完全注解开发


  • @Configuration注解 将一个普通的类标记为 Spring 的配置类;

  • @ComponentScan注解 配置类中配置自动扫描的包;

  • @Bean注解 相当于XML文件中的bean标签,标记的方法的返回值会被放入 IOC 容器,默认以方法名作为 bean 的 id;

  • 使用 AnnotationConfigApplicationContext 根据配置类创建 IOC 容器对象;


⚪配置类

//@Configuration注解 将一个普通的类标记为 Spring 的配置类
@Configuration
//@ComponentScan注解 配置类中配置自动扫描的包
@ComponentScan("com.haojin.ioc.component")
public class TestController {
    // @Bean 注解相当于 XML 配置文件中的 bean 标签
    // @Bean 注解标记的方法的返回值会被放入 IOC 容器
    // 默认以方法名作为 bean 的 id
    @Bean
    public void getMessage(){

    }

}


⚪测试

public class TestComponent {
    @Test
    public void test1(){
    //使用ClassPathXmlApplicationContext读取XML配置文件的方式
//        ApplicationContext context = new ClassPathXmlApplicationContext("component_bean.xml");

        //根据配置类创建 IOC 容器对象;
        ApplicationContext context = new AnnotationConfigApplicationContext(TestController.class);

        TestController controller = context.getBean(TestController.class);

        System.out.println(controller);

    }
}

在这里插入图片描述





六、整合Junit 4


优点:
1:不需要自己创建IOC容器对象了
2:任何需要的bean都可以在测试类中直接享受自动装配


⚪组件类

@Controller(value = "controller")
public class TestController {

}

⚪XML配置文件

component_bean.xml配置文件

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

⚪测试类

  • junit的@RunWith注解:指定Spring为Junit提供的运行器
  • Spring的@ContextConfiguration注解: 指定Spring配置文件的位置
**
 * @author .29.
 * @create 2023-01-21 14:18
 */
// junit的@RunWith注解:指定Spring为Junit提供的运行器
// Spring的@ContextConfiguration指定Spring配置文件的位置
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = {"classpath:component_bean.xml"})
public class TestComponent {
    //自定装配
    @Autowired
    TestController controller;

    @Test
    public void test1(){
        System.out.println(controller);
    }
}

在这里插入图片描述





🚀小结


  • @Component : 标记普通的组件

  • @Controller : 标记三层架构表述层中的控制器组件(controller)

  • @Service : 标记表述层中的业务逻辑组件(service)

  • @Repository : 标记持久化层组件(DAO)

  • @Autowired: 实现自动装配

  • @Qualifier: 用在@Autowired下一行,指定 bean 的 id

  • @Configuration : 将一个普通的类标记为 Spring 的配置类

  • @ComponentScan: 配置类中配置自动扫描的包

  • @Bean 相当于XML文件中的bean标签,标记的方法的返回值会被放入 IOC 容器,默认以方法名作为 bean 的 id

  • @RunWith:指定Spring为Junit提供的运行器

  • @ContextConfiguration: 指定Spring XML配置文件的位置




在这里插入图片描述

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

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

相关文章

day24|491.递增子序列、46.全排列、47.全排列 II

491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况…

源码深度解析Spring Bean的创建,手把手的一步一步带你看源码

在源码深度解析Spring Bean的加载 中对Bean的加载源码进行了梳理,在本文将对bean的创建进行梳理 在doGetBean()方法中createBean()方法准备创建bean,调用源码如下: createBean() 方法的源码如下: 从代码中可以得出,createBean() 方法涉及4个步骤: 步骤一: 根据设置的class属…

[论文笔记]A ConvNet for the 2020s

目录 Abstract Modernizing a ConvNet: a Roadmap 2.1.Training Techniques 2.2. Macro Design 2.3. ResNeXt-ify 2.4. Inverted Bottleneck 2.5. Large Kernel Sizes 2.6. Micro Design 论文&#xff1a;https://arxiv.org/abs/2201.03545 代码&#xff1a;GitHub - f…

扩散模型(Diffusion model)代码详细解读

扩散模型代码详细解读 代码地址&#xff1a;denoising-diffusion-pytorch/denoising_diffusion_pytorch.py at main lucidrains/denoising-diffusion-pytorch (github.com) 前向过程和后向过程的代码都在GaussianDiffusion​这个类中。​ 常见问题解决 Why self-condition…

盒相关样式-----diaplay:block、inline

盒的基本类型 CSS中的盒分为block类型与inline类型&#xff0c;例如&#xff0c; div元素与p元素属于block类型&#xff0c; span元素与a元素属于inline类型。 block类型的盒对应的是html中的块级元素&#xff0c;inline类型的盒对应了html中的行内元素。 行内元素与块级元素…

JavaScript 练手小技巧:键盘事件

键盘事件应该是鼠标事件之外&#xff0c;使用频率最高的 JS 事件了吧&#xff1f; 一般用于全局或者表单。 键盘事件由用户击打键盘触发&#xff0c;主要有keydown、keypress、keyup三个事件。 keydown&#xff1a;按下键盘时触发。Ctrl、Shift、Alt 等和其它按键组合时&…

BCNF与3NF

今天学了一下午这个BCNFBCNFBCNF与3NF3NF3NF&#xff0c;有感而发&#xff0c;特来总结。好像好久不打键盘了&#xff0c;这手好像刚长出来的一样。本文浅显的分析一下两种范式的关系与不同以及判断方法和分解算法&#xff0c;以做总结。 BCNFBCNFBCNF范式的定义如下: 设属性集…

linux 常用指令大全

目录一、基本指令指令基本格式1、ls1.1 ls相关选项2、pwd3、cd4、mkdir4.1、mkdir相关选项5、touch6、cp6.1 cp相关选项7、mv8、rm8.1、rm相关选项9、输出重定向10、cat11、df11.1、df 相关选项12、free12.1、free 相关选项13、head13.1、head相关选项14、tail14.1 tail相关选项…

day13 二叉树 | 144、二叉树的前序遍历 145、二叉树的后序遍历 54、二叉树的中序遍历

二叉树基础 二叉搜索树 二叉搜索树是一个有序树。 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉排序树 下面这两棵…

零食商城|基于springboot的零食商城

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

GuLi商城-简介-项目介绍、分布式基础概念、微服务架构图

一、项目简介 1 、项目背景 1 &#xff09;、电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O&#xff1b; 1 、 B2B 模式 B2B (Business to Business)&#xff0c; 是指商家与商家建立的商业关系。 如&#xff1a;阿里巴巴 2 、 B2C 模式 B2C (Business…

Win7安装高版本的NodeJS方法,亲测可用

Win7安装高版本的NodeJS方法 正常情况下&#xff0c;Win7所能支持的Node.js最高版本为:V13.14&#xff0c;在开发过程中&#xff0c;git下来的项目由于node版本比较高的原因&#xff0c;好多package都不能还原或出现诸多警告 网络大神分享的安装高版本的方法&#xff1a; 1、…

Express 通过 CORS 或 JSONP 解决跨域问题

文章目录参考描述同源策略同源同源策略示例CSRF 攻击解决跨域问题CORSCORS 响应头部Access-Control-Allow-Origin简单请求预检请求预检请求包含的两次请求解决CORS 中间件使用 CORS 中间件处理跨域请求JSONP通过原生 JS 向服务器端发起 JSONP 请求通过 jQuery 向客户端发起 JSO…

mysql:如何在windows环境下配置并随意切换两种mysql版本

系列文章目录 文章目录系列文章目录前言一、去官网下载zip安装包二、配置创建my.ini文件2.环境变量3、使用管理员身份打开dos命令窗口4、安装mysql8的服务和初始化data5、启动6 错误解决&#xff1a;修改mysql8服务的注册表最后前言 之前安装过5.7的版本 后来由于需要 就安装了…

天龙八部TLBB从0到1搭建教程-上

服务器的配置选择与购买 我们需要准备的东西,是环境安装和4核8G的服务器一台。 其实购买服务器的地方很多以下这些服务商都可以,具体看服务器的配置选择,像这种4核8G的 服务器价格在260-400之间一台仅供参考,当然还有带防的服务器价格就偏高了阿里云、腾讯、百度、西部数码…

年后公司新来一00后卷王,我们这帮老油条真干不过.....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 2023年春…

MySQL深分页 + 多字段排序场景的优化方案【三百万级数据量】

需求背景 目前产品需要针对一个大范围地区内的所有用户做排行榜功能&#xff0c;且这个排行榜有几个比较蛋疼的附加需求&#xff1a; 排行榜需要全量展示所有用户&#xff0c;且做分页展示&#xff08;大坑&#x1f4a5;&#xff09; 排行榜有4种排序条件&#xff0c;且每个排…

fatal error怎么解决,有什么快捷的解决方法

fatal error怎么解决&#xff0c;其实是有多种的解决方法的&#xff0c;主要是看你想用哪种解决方法去进行解决&#xff0c;下面一起来看看。 一.fatal error的解决方法 1、按winR&#xff0c;弹出运行窗口。 2、输入regedit点击确定&#xff0c;弹出注册表编辑器。 3、在注…

2023年数据库优化顶级原理

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

Acwing-1116. 马走日

本题求有多少路径遍历棋盘上的所有点&#xff0c;属于外部搜索&#xff0c;所以需要回溯。另外&#xff0c;对于递归终止条件&#xff0c;我们添加一个参数用来表示当前遍历到第几个点&#xff0c;如果是n*m表明已经将棋盘遍历一遍了&#xff0c;方案数1&#xff0c;return即可…