热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(续)SSM整合之spring笔记(IOC基于注解管理bean之注解和扫描,扫描组件,bean的id)(P087—P090)

基于注解管理bean一.实验一:标记与扫描(基于注解管理bean之注解和扫描)1.注解与扫描的概念①注解和XML配置文件一样,注解本身并不能执行&#

基于注解管理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 

②  导入依赖

org.springframeworkspring-context5.3.1junitjunit4.12test

③  创建三层架构 

控制层 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

package com.atguigu.spring.controller;public class UserController {}

业务层 :com.atguigu.spring.service.UserService     接口

               com.atguigu.spring.service.impl.UserServiceImpl   实现类 

package com.atguigu.spring.service;public interface UserService {}

package com.atguigu.spring.service.impl;import com.atguigu.spring.service.UserService;public class UserServiceImpl implements UserService {}

持久层:com.atguigu.spring.dao.UserDao    接口

              com.atguigu.spring.dao.impl.UserDaoImpl    实现类

package com.atguigu.spring.dao;public interface UserDao {}

package com.atguigu.spring.dao.impl;import com.atguigu.spring.dao.UserDao;public class UserDaoImpl implements UserDao {}

④   创建Spring配置文件 spring-ioc-annotation.xml

⑤  测试类   IOCByAnnotationTest

package com.atguigu.spring.test;import org.junit.Test;public class IOCByAnnotationTest {@Testpublic void test(){}
}

 

3 .现在我们要做的事情

现在要做的事情就是通过注解来管理bean  那我们有哪些注解呢?

我们现在要把一个类交给IOC来管理  我们要用到以下四个注解

① 标识组件的常用注解

@Component:将类标识为普通组件
组件:每一个bean都是IOC容器的组件   所以将类标识为普通组件就是加上这个注解并扫描之后,就可以把当前加上这个注解的类做为一个bean 被IOC容器管理 
@Controller:将类标识为控制层组件
@Service:将类标 识为业务层组件
@Repository:将类标识为持久层组件
问:以上四个注解有什么关系和区别?
通过查看源码我们得知,@Controller@Service@Repository这三个注解只是在@Component注解
的基础上起了三个新的名字。
对于Spring使用IOC容器管理这些组件来说没有区别。所以@Controller@Service@Repository
三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。
注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。

②  接下来我们要把注解标记在我们刚才创建的三层架构上

代码如下:

控制层组件

package com.atguigu.spring.controller;import org.springframework.stereotype.Controller;@Controller
public class UserController {}

业务层组件UserServiceImpl

package com.atguigu.spring.service.impl;import com.atguigu.spring.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {}

持久层组件UserDaoImpl

package com.atguigu.spring.dao.impl;import com.atguigu.spring.dao.UserDao;
import org.springframework.stereotype.Repository;@Repository
public class UserDaoImpl implements UserDao {}

注意:注解不能加到接口   一定要加到实现类上  

因为加上注解的作用是:  加上注解的类在IOC容器中配置了一个当前类型的bean  一个bean的类型不能够是一个接口类型  

③  接下去 我们要在配置文件spring-ioc-annotation.xml里面进行扫描

为什么要扫描:

在类上加上注解 要想让spring知道  得要扫描  要让spring知道哪些类加上了注解  加了什么注解  

因为一层一层的包 就是一层一层的目录  所以我们主要扫描包就可以

④  接下来我们来进行测试一下

在理解一下 注解+扫描的意思:

它可以将我们扫描的包下 加上注解的这些类做为组件进行管理 

做为组件进行管理:在IOC容器中就有了 当前加上这个注解 的这个类 所对应的bean对象

测试:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}

  二. 标记与扫描(基于注解管理bean之扫描组件)

问题:

以后在ssm整合的时候  spring 和springmvc 是放在一块使用的  而springmvc要扫描的是我们的控制层,spring要扫描的是除控制层以外的所有组件    这个时候应该怎么办?
如果springmvc 把控制层给扫描了  spring也把控制层扫描了  这个时候一个组件就被扫描多次  

我们现在要做的是 springmvc 扫描控制层 然后spring把其他的层给扫描了 

就要用到排除扫描标签 具体如下

1 .排除扫描


第一种  annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名(用得多)


测试:

@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}

 

虽然在控制层加了 但是因为排除了 所以并没有扫描到   但是不影响对其他层的扫描 如下 测试

@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");/* UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);*/UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}

 

全类名的复制方法;

要把控制层的扫描给排除掉  所以我们找到控制层 找到注解 点击右键  把全类名放过来  这个时候就不扫描控制层了 

  第二种 :assignable:根据类的类型进行排除,expression需要设置排除的类的全类名(用得少)


测试:

public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}

全类名的复制方法

我们找到控制层 找到UserController类 点击右键  把全类名放过来  这个时候在扫描包的时候就会把UserController类给排除 

 注意:以后用得比较多的是根据注解的方式排除 因为以后要用到这个标签

二种方法整合一起并解释:


总结:

2 .包含扫描   只扫描


测试:

public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}

测试结果发现都可以扫描到

修正如下:


 测试:

public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean(UserController.class);System.out.println(userController);UserService userService = ioc.getBean(UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean(UserDao.class);System.out.println(userDao);}
}

总结:

context:include-filter:包含扫描
注意:需要在context:component-scan标签中设置use-default-filters="false"
use-default-filters="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描
use-default-filters="false",所设置的包下所有的类都不需要扫描,此时可以使用包含扫描

 二种方法全部总结:

 我们以后排除扫描用得比较多  包含扫描用得比较少 因为麻烦

平常用的话只要下如下就可以


. 标记与扫描(基于注解管理bean之bean的id)

在我们使用XML方式管理bean的时候,每个bean都有一个唯一标识,便于在其他地方引用。现在使用 注解后,每个组件仍然应该有一个唯一标识。
默认情况
类名首字母小写就是beanid。例如:UserController类对应的beanid就是userController
自定义beanid
可通过标识组件的注解的value属性设置自定义的beanid
@Service("userService")//默认为userServiceImpl public class UserServiceImpl implements
UserService {}

复习:

注解所标识的类交给IOC管理:

注解标识的类经过 扫描之后在IOC容器中 自动去配置一个相对应的bean 

新知识:

问题:我们知道bean 都是有id的  通过注解+扫描的id是啥呢?

答案:通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名的首字母为小写的结果

验证:

IOCByAnnotationTest

public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean("userController",UserController.class);System.out.println(userController);UserService userService = ioc.getBean("userServiceImpl",UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);System.out.println(userDao);}
}

 自定义bean的id 

可以通过标识组件的注解的value属性值设置bean的自定义的id

UserController

package com.atguigu.spring.controller;import org.springframework.stereotype.Controller;@Controller("controller")
public class UserController {}

public class IOCByAnnotationTest {/* @Component:将类标识为普通组件* @Controller:将类标识为控制层组件* @Service:将类标识为业务层组件* @Repository:将类标识为持久层组件*/@Testpublic void test(){ApplicationContext ioc =new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");UserController userCOntroller= ioc.getBean("controller",UserController.class);System.out.println(userController);UserService userService = ioc.getBean("userServiceImpl",UserService.class);System.out.println(userService);UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);System.out.println(userDao);}
}

 

 

springmvc文件上传解析器  就是根据id来获取的 

其他的地方一般用到的都是根据类型来获取 

 

 

 

 

 



                 



 




推荐阅读
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
author-avatar
ebt1775010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有