Java_Spring:5. 基于注解的 IOC 配置

目录

1 环境搭建

1.1 第一步:拷贝必备 jar 包到工程的 lib 目录。

1.2 第二步:使用@Component 注解配置管理的资源

1.3 第三步:创建 spring 的 xml 配置文件并开启对注解的支持

2 常用注解

2.1 用于创建对象的注解

2.1.1 @Component

2.1.2 @Controller @Service @Repository

2.2 用于注入数据的注解

2.2.1 @Autowired

2.2.2 @Qualifier

2.2.3 @Resource

2.2.4 @Value

2.3 用于改变作用范围的@Scope注解:

2.4 和生命周期相关的注解

2.5 关于 Spring 注解和 XML 的选择问题

3 spring 的纯注解配置

3.1 待改造的问题

3.2 新注解说明

3.2.1 @Configuration

3.2.2 @ComponentScan

3.2.3 @Bean

3.2.4 @PropertySource

3.2.5 @Import

3.2.6 通过注解获取容器:

3.3 工程结构图


  • 1 环境搭建

    • 注解配置和 xml 配置要实现同样的功能都,即降低程序间的耦合,只是配置的形式不同。
    • 实际的开发中依赖于使用习惯,都需要掌握。
    • 1.1 第一步:拷贝必备 jar 包到工程的 lib 目录。

      • 注意:在基于注解的配置中,要多拷贝一个 aop 的 jar 包。如下图:
    • 1.2 第二步:使用@Component 注解配置管理的资源

      • 账户的业务层实现类
      • @Component("accountService")
        public class AccountServiceImpl implements IAccountService {
            
            private IAccountDao accountDao;
            
            public void setAccountDao(IAccountDao accountDao) {
                this.accountDao = accountDao;
            }
        }
      • 账户的持久层实现类
      • @Component("accountDao")
        public class AccountDaoImpl implements IAccountDao {
            private DBAssit dbAssit;
        }

      • 注意:使用注解注入时,set 方法不用写
    • 1.3 第三步:创建 spring 的 xml 配置文件并开启对注解的支持

      • 注意:
        • 基于注解整合时,导入约束时需要多导入一个 context 名称空间下的约束。
        • 由于使用了注解配置,此时不能在继承 JdbcDaoSupport,需要自己配置一个 JdbcTemplate
        • <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
              xmlns:context="http://www.springframework.org/schema/context"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/context
                  http://www.springframework.org/schema/context/spring-context.xsd">
          
              <!-- 告知 spring 创建容器时要扫描的包 -->
              <context:component-scan base-package="com.itheima"></context:component-scan>
              
              <!-- 配置 dbAssit -->
              <bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
                  <property name="dataSource" ref="dataSource"></property>
              </bean>
          
              <!-- 配置数据源 -->
              <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                  <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
                  <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
                  <property name="user" value="root"></property>
                  <property name="password" value="1234"></property>
              </bean>
          </beans>
  • 2 常用注解

    • 2.1 用于创建对象的注解

      • 相当于:<bean id="" class="">
      • 2.1.1 @Component

        • 作用:
          • 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
        • 属性:
          • value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
      • 2.1.2 @Controller @Service @Repository

        • 这三个注解都是针对上一个的衍生注解,他们的作用及属性都是一模一样的,只不过是提供了更加明确的语义化。
        • @Controller:一般用于表现层的注解。
        • @Service:一般用于业务层的注解。
        • @Repository:一般用于持久层的注解。
        • 细节:如果注解中有且只有一个属性要赋值时,且名称是 value,则value 在赋值是可以不写
    • 2.2 用于注入数据的注解

      • 相当于:
        • <property name="" ref=""> 
        • <property name="" value="">
      • 2.2.1 @Autowired

        • 作用:
        • 自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。
        • 当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
      • 2.2.2 @Qualifier

        • 作用:
          • 在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用。
        • 属性:
          • value:指定 bean 的 id。
      • 2.2.3 @Resource

        • 作用:
          • 直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
        • 属性:
          • name:指定 bean 的 id。
      • 2.2.4 @Value

        • 作用:
          • 注入基本数据类型和 String 类型数据
        • 属性:
          • value:用于指定值
    • 2.3 用于改变作用范围的@Scope注解:

      • 相当于:<bean id="" class="" scope="">
      • 作用:
        • 指定 bean 的作用范围。
      • 属性:
        • value:指定范围的值。
        •  取值:singleton、prototype、request、session、globalsession
    • 2.4 和生命周期相关的注解

      • 相当于:<bean id="" class="" init-method="" destroy-method="" />
      • 2.4.1 @PostConstruct
        • 作用:
          • 用于指定初始化方法。
      • 2.4.2 @PreDestroy
        • 作用:
          • 用于指定销毁方法。
    • 2.5 关于 Spring 注解和 XML 的选择问题

      • 基于注解的 spring IoC 配置中,bean 对象的特点和基于 XML 配置是一模一样的
      • 注解的优势:
        • 配置简单,维护方便(找到类,就相当于找到了对应的配置)。
      • XML 的优势:
        • 修改时,不用改源码。不涉及重新编译和部署。
      • Spring 管理 Bean 方式的比较:
  • 3 spring 的纯注解配置

    • 选择哪种配置的原则是简化开发和配置方便,而非追求某种技术。
    • 3.1 待改造的问题

      • 之所以离不开 xml 配置文件,是因为有一句很关键的配置:
        • <!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 -->
        • <context:component-scan base-package="com.itheima"></context:component-scan>
      • 如果他要也能用注解配置,就离脱离 xml 文件又进了一步。
      • 另外,数据源和 JdbcTemplate 的配置也需要靠注解来实现。
      • <!-- 配置 dbAssit -->
        <bean id="dbAssit" class="com.itheima.dbassit.DBAssit">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 配置数据源 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"></property>
            <property name="user" value="root"></property>
            <property name="password" value="1234"></property>
        </bean>
    • 3.2 新注解说明

      • 3.2.1 @Configuration

        • 作用:
          • 用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用:
            • AnnotationApplicationContext(有@Configuration 注解的类.class)。
        • 属性:
          • value:用于指定配置类的字节码
        • 示例代码:spring 的配置类,相当于 bean.xml 文件
        • @Configuration
              public class SpringConfiguration {
          }
        • 注意:
          • 已经把配置文件用类来代替了,但是如何配置创建容器时要扫描的包呢?
          • 请看下一个注解。
      • 3.2.2 @ComponentScan

        • 作用:
          • 用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
            • <context:component-scan base-package="com.itheima"/>是一样的。
        • 属性:
          • basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。
          • 示例代码: spring 的配置类,相当于 bean.xml 文件
          • @Configuration
            @ComponentScan("com.itheima")
                public class SpringConfiguration {
            }
        • 注意:
          • 已经配置好了要扫描的包,但是数据源和 JdbcTemplate 对象如何从配置文件中移除呢?
          • 请看下一个注解。
      • 3.2.3 @Bean

        • 作用:
          • 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
        • 属性:
          • name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。
          • 示例代码:连接数据库的配置类
          • public class JdbcConfig {
            
                /**
                * 创建一个数据源,并存入 spring 容器中
                * @return
                */
                @Bean(name="dataSource")
                public DataSource createDataSource() {
                    try {
                        ComboPooledDataSource ds = new ComboPooledDataSource();
                        ds.setUser("root");
                        ds.setPassword("1234");
                        ds.setDriverClass("com.mysql.jdbc.Driver");
                        ds.setJdbcUrl("jdbc:mysql:///spring_day02");
                        return ds;
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            
                /**
                * 创建一个 DBAssit,并且也存入 spring 容器中
                * @param dataSource
                * @return
                */
                @Bean(name="dbAssit")
                public DBAssit createDBAssit(DataSource dataSource) {
                    return new DBAssit(dataSource);
                }
            }
        • 注意:
          • 已经把数据源和 DBAssit 从配置文件中移除了,此时可以删除 bean.xml 了。
          • 但是由于没有了配置文件,创建数据源的配置又都写死在类中了。如何把它们配置出来呢?
          • 请看下一个注解。
      • 3.2.4 @PropertySource

        • 作用:
          • 用于加载.properties 文件中的配置。例如配置数据源时,可以把连接数据库的信息写到properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。
        • 属性:
          • value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:
        • 示例代码:
          • 配置:连接数据库的配置类
          • public class JdbcConfig {
            
                @Value("${jdbc.driver}")
                private String driver;
            
                @Value("${jdbc.url}")
                private String url;
            
                @Value("${jdbc.username}")
                private String username;
            
                @Value("${jdbc.password}")
                private String password;
            
                /**
                * 创建一个数据源,并存入 spring 容器中
                * @return
                */
                @Bean(name="dataSource")
                public DataSource createDataSource() {
                    try {
                            ComboPooledDataSource ds = new ComboPooledDataSource();
                            ds.setDriverClass(driver);
                            ds.setJdbcUrl(url);
                            ds.setUser(username);
                            ds.setPassword(password);
                            return ds;
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                }
            }
          • jdbc.properties 文件:
            • jdbc.driver=com.mysql.jdbc.Driver
            • jdbc.url=jdbc:mysql://localhost:3306/day44_ee247_spring
            • jdbc.username=root
            • jdbc.password=1234
          • 注意:
          • 此时已经有了两个配置类,但是他们还没有关系。如何建立他们的关系呢?
          • 请看下一个注解。 
      • 3.2.5 @Import

        • 作用:
          • 用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题。
        • 属性:
          • value[]:用于指定其他配置类的字节码。
        • 示例代码:
        • @Configuration
          @ComponentScan(basePackages = "com.itheima.spring")
          @Import({ JdbcConfig.class})
          public class SpringConfiguration {
              }
          
          @Configuration
          @PropertySource("classpath:jdbc.properties")
          public class JdbcConfig{
          }
        • 注意:
          • 已经把要配置的都配置好了,但是新的问题产生了,由于没有配置文件了,如何获取容器呢?
          • 请看下一小节。
      • 3.2.6 通过注解获取容器:

        • ApplicationContext ac = 
          • new AnnotationConfigApplicationContext(SpringConfiguration.class);
    • 3.3 工程结构图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL高级篇】第09章_性能分析工具的使用

第09章_性能分析工具的使用 在数据库调优中&#xff0c;我们的目标是 响应时间更快, 吞吐量更大 。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式。 1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1…

在vue项目中使用echarts(echarts不显示,echarts使用详细)

简述&#xff1a;我们在写大屏项目和vue项目时经常会用到echarts&#xff0c;用于数据统计和可视化&#xff0c;它是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff0c;下面分…

【IAR工程】STM8S208RB基于ST标准库蜂鸣器(BEEP)驱动

【IAR工程】STM8S208RB基于ST标准库蜂鸣器(BEEP)驱动&#x1f33e;寄存器版本《STM8S系列基于IAR开发&#xff1a;蜂鸣器&#xff08;BEEP&#xff09;驱动功能模块示例》&#x1f33f;相关篇《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例》&#x1f33f;《【IAR工程】ST…

总结803

早上&#xff1a; 6:44起床 7:00~7:04开合跳100 7:09~8:00小湖读英语 8:00~9&#xff1a;30句句真研 9&#xff1a;40~10:00去教室 10:03~10:15阅读《运动改造大脑》 10:15~12:00上课 12:00~12:20背单词 12:23~12:50吃饭 1:00~2:10午觉 2:30~5:00核聚课程一篇考研英…

HashMap, HashTable, ConcurrentHashMap 之间的区别

目录关于线程安全HashTable 和 ConcurrentHashMap 的区别1. 加锁粒度不同(最关键 最核心的区别!!!)2. ConcurrentHashMap 利用了 CAS 机制 (无锁编程)3. 优化了扩容策略关于线程安全 我们知道 HashMap 是线程不安全的. 如果要在多线程环境下使用哈希表, 则可以使用:HashTable …

深度学习语义分割篇——FCN原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解    目标检测系列——Faster R-CNN原理详解 &#x1f34a;近期目标&…

说微软翻译比谷歌准,有人不信,就拿雾霾造了个句子

导读近年来&#xff0c;谷歌(微博)、微软、亚马逊和Facebook等硅谷巨头在人工智能&#xff08;AI&#xff09;领域进行着军备竞赛。在应用层面&#xff0c;有的开发智能管家、有的做机器人、有的训练AI治疗疾病。谷歌和微软则在翻译领域较上了劲。 长久以来&#xff0c;谷歌翻译…

Redis Stream消息并发和未ack消息处理

文章目录1. RedisStreamConfig2. 消费者MyMessageListener3. RedisStreamUtil4. RedisStreamConstant5. 测试6. 处理消费者已读取未ack的消息redis stream文档参考 https://zhuanlan.zhihu.com/p/60501638 1. RedisStreamConfig package com.tophant.eventdemo.common.config…

CSS3笔试题精讲1

防止父元素高度坍塌 4种方案 父元素的高度都是由内部未浮动子元素的高度撑起的。 如果子元素浮动起来,就不占用普通文档流的位置。父元素高度就会失去支撑,也称为高度坍塌。 即使有部分元素留在普通文档流布局中支撑着父元素,如果浮动 起来的元素高度高于留下的素。那么浮…

MySQL日志管理、备份与恢复

文章目录一.MySQL 日志管理1、错误日志2、通用查询日志3、二进制日志4、慢查询日志5、查看日志6、实例操作二、数据库备份的重要性与分类1、数据备份的重要性2、从物理与逻辑的角度&#xff0c;备份分为&#xff1a;3、从数据库的备份策略角度&#xff0c;备份可分为&#xff1…

Spring Cloud Sentinel实战(四)-流控规则-关联、预热、排队等待

流控规则-关联 名词解释 资源名&#xff1a;唯一名称&#xff0c;默认请求路径针对来源&#xff1a;Sentinel可以针对调用者进行限流&#xff0c;填写微服务名&#xff0c;默认default&#xff08;不区分来源&#xff09;阈值类型/单机阈值&#xff1a; QPS&#xff08;每秒钟…

常见问题自助服务,你做对了吗?

一遍又一遍地回答重复的问题可能会成为客户支持团队的一项令人恼火的任务。当您的业务不断增长时&#xff0c;这些问题的数量可能会让您的座席不知所措。但是&#xff0c;如果您为客户设置一个常见问题自助回复服务&#xff0c;会大大减少这一工作量&#xff0c;提高客户体验&a…

安装部署skywalking8.2

SkyWalking是一个开源的分布式系统跟踪解决方案&#xff0c;它提供了分布式系统的性能监控、调用链追踪、度量分析和服务网格等功能。SkyWalking能够帮助开发人员快速定位分布式系统的性能问题&#xff0c;提高系统的可靠性和可扩展性。 SkyWalking支持多种语言和框架&#xff…

【linux】常用指令大全

这篇文章涵盖了linux中常用的所有指令&#xff0c;欢迎大家阅读查询。(如有不正确的地方&#xff0c;各位大佬可以在评论区指出&#xff0c;我会及时进行更正)。 文章目录登录远程服务器ssh添加删除用户当前路径pwd列出文件目录ls进入cdtreewhoami创建文件touch创建目录mkdir删…

java 高考志愿填报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 高考志愿填报系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

发现一个白嫖GPT4.0的方法!真的是完胜3.5!

大家好&#xff0c;我是五竹。 先说个基本的科普&#xff0c;最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号&#xff0c;需要绑定国外的支付方式&#xff0c;每个月大概130左右&#xff01;plus账号更稳&#xff01;更快&am…

rk3568 音频调节音量-rk809

rk3568 音频调节音量-rk809 daisy使用的是rk3568的主板&#xff0c;系统使用的是v2版本的&#xff0c;使用正常-6dB的音频的文件和耳机声道输出听不清楚&#xff0c;但是使用0dB的能听清楚&#xff0c;所以先从软件上下手修改音量配置&#xff0c;从默认的3改到了0&#xff0c;…

骨传导蓝牙耳机排行榜10强,盘点几款性能高的骨传导耳机

骨传导耳机是一种新型的耳机&#xff0c;它将声音转化为不同频率的机械振动&#xff0c;通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波。不需要通过耳道&#xff0c;是一种耳挂式的无线耳机。 骨传导耳机与普通耳机相比&#xff0c;最大的优势是不需要入耳&am…

【Linux系统编程】静态库和共享库

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;Linux系统编程 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f…

CMD中dos命令

1 Ctrl R 2 有关某个命令的详细信息&#xff0c;请键入 HELP 命令名 ASSOC 显示或修改文件扩展名关联。 ATTRIB 显示或更改文件属性。 BREAK 设置或清除扩展式 CTRL C 检查。 BCDEDIT 设置启动数据库中的属性以控制启动加载。 CACLS 显示或修改文件的访问控制列表(ACL)。 CA…