当前位置: 首页 > news >正文

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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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 文件
        • @Configurationpublic 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 工程结构图

相关文章:

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

目录 1 环境搭建 1.1 第一步&#xff1a;拷贝必备 jar 包到工程的 lib 目录。 1.2 第二步&#xff1a;使用Component 注解配置管理的资源 1.3 第三步&#xff1a;创建 spring 的 xml 配置文件并开启对注解的支持 2 常用注解 2.1 用于创建对象的注解 2.1.1 Component 2.1…...

Git下的.gitignore文件

.gitignore .gitignore是一个文件&#xff0c;这个文件用来指定哪些文件提交到 git 管理&#xff0c;也就是 git commit 不会提交这些文件 .gitignore文件的语法 注释 "#" 表示注释 # 注释 忽略指定文件/文件夹 直接写入文件或文件夹名即可&#xff0c;指定文…...

Unity集成GPT

GPT想必是最近互联网最火的话题了&#xff0c;作为一个Unity开发者&#xff0c;今天来介绍一下如何在Unity中使用GPT。 一、API 密钥 使用GPT的API首先要获得密钥&#xff0c;如下进入OpenAI官网(https://platform.openai.com/account/api-keys)–>选择自己的账号–>查…...

Xilinx FPGA Multiboot设计与实现(Spartan-6和Kintex-7为例)

文章目录 1. FPGA固件升级方案2. Golden镜像和Multiboot镜像简介3. ISE环境下实现(XC6SLX9)4. Vivado环境下实现(XC7K325T)5. Golden镜像Header分析6. 参考资料7. 示例工程ISE、Vivado、MicroBlaze系列教程 1. FPGA固件升级方案 FPGA的硬件可编程性给设计带来了很高的灵活…...

14、SpringMVC执行流程

文章目录14、SpringMVC执行流程14.1、SpringMVC常用组件1 DispatcherServlet&#xff08;前端控制器&#xff09;2 HandlerMapping&#xff08;处理器映射器&#xff09;3 Handler&#xff08;处理器&#xff09;4 HandlerAdapter&#xff08;处理器适配器&#xff09;5 ViewRe…...

2步搞定拼版!AD通用拼版技巧分享!

你是不是也看过很多拼版教程&#xff0c;一整篇文章全部都是文字说明和各种图示&#xff0c;照着一步步去做&#xff0c;都需要一些时间才能勉强搞定。 之前我用过AD20的自带拼版工具&#xff0c;功能上比较简单&#xff0c;而且菜单没有全部汉化&#xff0c;对于新手来说&…...

再学C语言47:字符串输出

C中有3个用于输出字符串的标准库函数&#xff1a;puts()&#xff0c;fputs()&#xff0c;printf() 一、puts()函数 示例代码&#xff1a; /* test of puts() function */ #include <stdio.h>#define ARR_T "I am an array."int main(void) {char str1[100] …...

银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划

如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心&#xff0c;实现知行果合一课程背景&#xff1a; 很多银行都在开展银行数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a;缺少针对性的银行数字化转型年度培训规划不清楚如…...

RFID技术在物流行业中的应用:优化物流流程,提高效率

随着物流行业的不断发展&#xff0c;如何优化物流流程、提高效率成为了每个物流从业者关注的重点。RFID技术作为一种先进的自动识别技术&#xff0c;正逐渐被广泛应用于物流行业&#xff0c;帮助企业降低成本、提高运营效率。本文将重点介绍RFID技术在物流行业中的应用&#xf…...

安卓机器学习框架学习:Android Neural Networks API (NNAPI)

Android Neural Networks API (NNAPI) 简介&#xff1a; 1、Android Neural Networks API (NNAPI) 是一个 Android C API&#xff0c;在 Android 设备上实现机器学习&#xff1b; 2、NNAPI 旨在为更高层级的机器学习框架&#xff08;如 TensorFlow Lite 和 Caffe2&#xff09…...

阿里云GPU服务器收费标准、学生价格及一个小时费用大全

阿里云GPU租用费用价格表&#xff0c;GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折优惠&#xff0c;阿里云百科分享阿里云GPU服务器学生优惠价格、GPU服务器收费价格表、GPU服务器多少钱一个小时等费用明细表&#x…...

Asp.net core 依赖注入 (带案例以及注释理解)

1.很多朋友不知道什么是依赖注入&#xff0c;接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于减少组件之间的耦合度。它的核心思想是&#xff0c;将组件之间的依赖关系从…...

【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

GO实现Redis:GO实现Redis集群(5)

采用一致性hash算法将key分散到不同的节点&#xff0c;客户端可以连接到集群中任意一个节点https://github.com/csgopher/go-redis本文涉及以下文件&#xff1a; consistenthash&#xff1a;实现添加和选择节点方法 standalone_database&#xff1a;单机database client&#x…...

高阶数据结构之 B树 B+树 B*树

文章目录B树B树节点的设计插入key的过程B树的验证B树的性能分析B树和B*树B树B*树总结B树、B树、B*树B树的应用做索引MySQL索引MyISAMInnoDBB树 在前面几章中我们介绍了AVL树和红黑树&#xff0c;简单复习一下&#xff0c;我们说到原本的二叉搜索树会存在缺陷&#xff08;不能保…...

CSS3之动画属性

系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录CSS3 中的动画第一步&#xff1a;定义一个动画第二步&#xff1a;执行这个动画第三步&#xff1a;暂停或启动这个动画过渡和动画的区别CSS3 中的动画 CSS3 动画是使元素从一种样式逐渐变化为…...

python --Matplotlib详解

安装 pip install matplotlib导包 import matplotlib.pyplot as plt绘制散点图 如果输入的是两个列表&#xff0c;一个表示 x 轴的值&#xff0c;一个表示 y 轴的值&#xff0c;那么就可以在直角坐标系中划出很多个点&#xff0c;然后将这些点用指定的线段连接起来就得到了散…...

手机(Android)刷NetHunter安装指南,无需ssh执行kali命令, NetHunter支持的无线网卡列表!

一、安装NetHunter 前提&#xff1a;确保手机已经root&#xff0c;已装上magisk。如果没有root&#xff0c;可用尝试magisk root 后执行此文 1、下载Nethunter&#xff1a;Get Kali | Kali Linux 然后push 到sdcard 里&#xff0c; 2、打开magisk&#xff0c;选择刚刚下好的…...

教育行业ChatGPT的新挑战

随着科技不断发展&#xff0c;AI的水平越来越高&#xff0c;尤其是最近火出圈的ChatGPT不仅仅可以与人类对话&#xff0c;而且还可以为人们提供关于各种信息帮助。 作为一个先进的“聊天”AI&#xff0c;无论是正苦恼&#xff0c;还是只是需要一些关于如何更有效地管理时间的建…...

内存泄漏 定位方法

目录 内存概念 物理内存 虚拟内存 内存泄漏 定位方法和手段 1.MemInFo MemTotal MemFree MemAvailable Cached 2 vmalloc info 3.Kmemleak 算法原理 使用方法 参考文献与链接&#xff1a; 如果你点进这篇文章&#xff0c;那么要么你是一个C\C程序员&#xff0c;…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...