Spring框架配置进阶_自动装配(XML和注解)

Spring配置进阶

Spring 容器提供配置元数据有三种方式

  • XML配置文件。
  • 基于注解的配置。
  • 基于java的配置。

一、自动装配

应用程序上下文为你找出依赖项的过程,Spring会在上下文中自动查找,并自动给bean装配与其关联的属性

Spring中实现自动装配的方式有两种:

  • XML文件
  • 注解

(1)通过xml文件实现自动装配

1、通过xml文件实现自动装配

xml配置文件中的<bean>要配置autowire属性

autowire属性值:

模式描述
no这是默认的设置,它意味着没有自动装配,你应该使用显式的bean引用来连线。你不用为了连线做特殊的事。,
byName由属性名自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byName。然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的 beans 的属性进行连接。
byType由属性数据类型自动装配。Spring 容器看到在 XML 配置文件中 bean 的自动装配的属性设置为 byType。然后如果它的类型匹配配置文件中的一个确切的 bean 名称,它将尝试匹配和连接属性的类型。如果存在不止一个这样的 bean,则一个致命的异常将会被抛出
constructor类似于 byType,但该类型适用于构造函数参数类型。如果在容器中没有一个构造函数参数类型的 bean,则一个致命错误将会发生。
1)byName属性值

Spring会根据class属性找到实体类,然后查询实体类中所有setter方法的名字,根据setter方法后面的名字,再到配置文件中寻找一个与该名字相同id的Bean,注入进来

autowire属性赋值>>class找到对应类>>查询对应setter方法>>对应id的Bean对象

<bean id="iDeptDao" class="org.example.dao.impl.DeptImpl" autowire="byName"/>
2)byType属性值

Spring会自动寻找一个与该属性类型相同的Bean,注入进来

<bean id="iDeptService" class="org.example.service.impl.DeptServiceImpl autowire="byType">

(2)通过注解实现自动装配

二、Spring注解分类

1、使用注解前的准备:

//spring-config.xml文件配置数据

<!--    加入扫描包,配置根路径,查找根路径下使用的注解-->
<context:component-scan base-package="org.example"/>

以注解为主,XML为辅。

@Component(组件),@Service(服务),@Controller(控制器),@Repository(*/rɪˈpɑːzətɔːri/*数据仓库)

1、Spring类注解

@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named注解,都是添加在类上面的类级别注解

Spring容器根据注解的过滤规则扫描读取注解Bean定义类,并将其注册到Spring IoC容器中。

1、使用asm技术扫描.class文件,并将包含@Component、@Controller、@Service、@Repository或者其他自定义的的bean注册到beanFactory中,

  • @Component : 通配
  • @Repository:用于声明DAO层的
  • @Service:用于业务层
  • @Controller:用于控制器 (暂时先不用,后面接触Spring MVC再使用)

2、然后spring在注册处理器

3、实例化处理器,然后将其放到beanPostFactory中,然后我们就可以在类中进行使用了。

4、创建bean时,会自动调用相应的处理器进行处理。

2、类内部注解

@Autowire、@Value、@Resource注解等,都是添加在类内部的字段或者方法上的类内部注解。

SpringIoC容器通过Bean后置注解处理器解析Bean内部的注解,比如Spring实现@Autowire解析和注入的核心的类是通过AutowiredAnnotationBeanPostProcessor来实现的

//@Component("deptService"),
//@Service类注解Service层
@Service("deptService")
public class DeptServiceImpl implements IDeptService {@Autowired//Autowired类内部注解,可以注解变量或方法private IDeptMapper deptMapper;
}

三、注解实现自动装配

2.使用注解(类内部注解)

  1. @Autowired注解

    只按照类型byType匹配, 默认情况匹配的Bean只有一个,匹配不到报错BeanCreationException 异常

    • 可使用在变量和setter方法上, xml文件中注解autowrie删除

    若要匹配多个类型, 引入:

    //1.注解在属性上
    @Autowired
    @Qualifier("类型2")
    private IDeptMapper deptMapper;
    //2.注解setter方法上(同一变量的2种二选一)@Autowiredpublic void setiDeptDaoMapper(IDeptMapper iDeptMapper) {this.iDeptMapper = iDeptMapper;}
    
  2. @Qualifier注解(

    当ioc容器根据属性类型去容器中找找到多个相同类型的组件,再将属性的名称作为组件(bean)的id去容器中查找找不到时就是用这两个注解搭配,指定需要装配的bean的id。

    和Autowired搭配使用

  3. @Resource注解

    • 可以写在字段和setter方法上(2选1)

    默认按名称进行装配

    @Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型

    • 默认按名字匹配

      @Resource
      private SqlSessionFactory sqlSessionFactory;
      
    • 按类型: 效果和@Autowired一样

     @Resource(type = SqlSessionFactory.class)private SqlSessionFactory sqlSessionFactory;
    • 匹配顺序

      同时name和type一致的bean对象>>指定的name>>指定type>>什么也没指定name

3.基于注解声明组件(类注解)

目前常用的组件有:@Component(组件),@Service(服务),@Controller(控制器),@Repository(数据仓库)

1.@Component注解

通用的注解,可标注任意类为 Spring 组件(一个 Bean 不知道属于哪个层时使用)

说明:如果一个类中有@Component,没有指定名称,那么这个组件名称就是类名首字母小写

//@Component //默认空指向deptMapperImpl
@Component("deptMapper")
public class DeptMapperImpl implements IDeptMapper {@Resourceprivate SqlSessionFactory sqlSessionFactory;
}

4.使用完类注解

删除掉声明的dao层的bean信息,以及service信息,只保留基础配置信息

//bean标签都删除
<!--    <bean id="iDeptDao" class="org.example.dao.impl.DeptImpltowire="byName"> -->
<!--    <bean id="iDeptDao1" class="org.example.dao.impl.IDeptMapperImpl1 -->

四.JavaConfig

JavaConfig是指基于java配置的spring。传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多JavaConfig的注解

任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类

package org.example;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;import javax.annotation.Resource;
import javax.sql.DataSource;/*** @author Arran* @version 1.0* @description: 基于java配置的spring* @date 2024/07/06 上午 11:59*/
//在类上打上这一标签,表示这个类是配置类
//表明该类是一个JavaConfig形式的Spring Ioc容器的配置类@Configuration//被该注解标识的类,
//读取数据源
@PropertySource("classpath:source.properties")
public class Myconfig {@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.xml文件的bean对象@Beanpublic DataSource dataSource() {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driver);druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);return druidDataSource;}
}
注解说明
@Configuration在类上打上这一标签,表示这个类是配置类
@ComponentScan相当于xml的<context:componentscan basepakage=>
@Beanbean的定义,相当于xml的<bean id="objectMapper" class="org.it.map.ObjectMapper" />
@EnableWebMvc相当于xml的<mvc:annotation-driven>,springMVC阶段涉及
@ImportResource相当于xml的 <import resource="applicationContext-cache.xml">
@PropertySourcespring 3.1开始引入,它是基于java config的注解,用于读取properties文件
@Profilespring3.1开始引入,一般用于多环境配置,激活时可用@ActiveProfiles注解,@ActiveProfiles(“dev”)
@Value读取外部配置文件对应的property

xml和java配置的区别

1.表达形式层面(二者区别)
  • 基于XML配置的方式是这样:

<?xml version=“1.0” encoding=“UTF-8”?>

<beans xmlns=“http://www.springframework.org/schema/beans”
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-3.0.xsd”> </beans>

  • 而基于JavaConfig的配置方式是这样:

    @Configuration
    public class MockConfiguration{
    //bean定义
    }

2.注册bean定义层面
  • 基于XML的配置形式是这样:

    <bean id=“mockService” class=“…MockServiceImpl”>

    </bean>

  • 而基于JavaConfig的配置形式是这样的:

    @Configuration
    public class MockConfiguration{
    @Bean
    public MockService mockService(){
    return new MockServiceImpl();
    }
    }

    任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

    @Bean一般用在使用第三方类来生成对象注入到spring容器的情况下使用

3.表达依赖注入关系层面
  • 为了表达bean与bean之间的依赖关系,在XML形式中一般是这样:

    <bean id=“dependencyService” class=“DependencyServiceImpl”></bean>

    <bean id=“mockService” class=“…MockServiceImpl”>
    <propery name =“dependencyService” ref=“dependencyService” />
    </bean>

  • 而基于JavaConfig的配置形式是这样的:

    @Configuration
    public class MockConfiguration{
    @Bean
    public DependencyService dependencyService(){
    return new DependencyServiceImpl();
    }

如果一个bean的定义依赖其他bean,则直接调用对应的JavaConfig类中依赖bean的创建方法就可以了。

五MapperScannerConfigurer配置

MyBatis中可以使用SqlSession的getMapper(Class type)方法,根据指定的映射器和映射文件直接生成实现类,这样不必自行编写映射器的实现类,就可以调用映射器的方法进行功能实现。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property><property name="basePackage" value="mapper路径"></property>
</bean>
  1. basePackage属性中可以包含多个包名,多个包含之间使用逗号或分号隔开。
  2. MapperScannerConfigurer会为所有又它创建的映射器实现开启自动装配,也就是MapperScannerConfigurer创建的所有映射器实现都会被自动注入SqlSessionFactory例,因此在如上示例中配置DAO组件时无需显示注入SqlSessionFactory实例
  3. 映射器被注册到Spring容器时,Spring会根据其接口名称为其命名,默认规则是首字母小写的非完全限定类名。例如EmpMapper类型的组件会被默认命名为empMapper

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

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

相关文章

26-ARM常用汇编指令

汇编格式&#xff1a; label&#xff1a;instruction comment label&#xff1a;标号instruction&#xff1a;具体汇编指令comment&#xff1a;注释内容 常用段名&#xff1a; .text&#xff1a;代码段.data&#xff1a;初始化的数据段.bss&#xff1a;未初始化的数据段.ro…

Spring Boot+Vue项目从零入手

Spring BootVue项目从零入手 一、前期准备 在搭建spring bootvue项目前&#xff0c;我们首先要准备好开发环境&#xff0c;所需相关环境和软件如下&#xff1a; 1、node.js 检测安装成功的方法&#xff1a;node -v 2、vue 检测安装成功的方法&#xff1a;vue -V 3、Visu…

JSP WEB开发(一) JSP语言基础

目录 JSP JSP简介&#xff1a; JSP页面 JSP运行原理 JSP脚本元素 JAVA程序片 局部变量 全局变量和方法的声明 全局变量 方法的声明 程序片执行特点 synchronized关键字 表达式 JSP指令标记 page指令 include指令 JSP动作标记 JSP动作元素include和include指令的…

Docker在人工智能领域的应用与实战

摘要 人工智能&#xff08;AI&#xff09;技术的快速发展带来了对高效开发和部署工具的需求。Docker作为一个创新的容器化平台&#xff0c;为AI领域提供了强大的支持。本文详细介绍了Docker在AI模型开发、训练、部署以及服务器集群管理等方面的应用&#xff0c;并探讨了其在数…

AcWing 1550:完全二叉搜索树

【题目来源】https://www.acwing.com/problem/content/1552/【题目描述】二叉搜索树 (BST) 递归定义为具有以下属性的二叉树&#xff1a; &#xff08;1&#xff09;若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值 &#xff08;2&#xff09;若它的右…

大数据平台之数据同步

数据同步也成为CDC (Chanage Data Capture) 。Change Data Capture (CDC) 是一种用于跟踪和捕获数据库中数据变更的技术&#xff0c;它可以在数据发生变化时实时地将这些变更捕获并传递到下游系统。以下是一些常用的开源 CDC 方案&#xff1a; 1. Flink CDC Flink CDC 是基于 …

快速上手LangChain:构建强大的语言模型应用

引言 在人工智能和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;构建高效且强大的语言模型应用变得越来越重要。LangChain 是一个专为开发者设计的框架&#xff0c;它简化了语言模型应用的构建流程。本文将详细介绍LangChain的功能和使用方法&#xff0c;帮助读者…

76 4G模组 境外拨号入网注意

1 引言 最近朋友把国内的设备拿到新加坡了&#xff0c;然后发现原本国内可以使用的设备无法在异国他乡联网&#xff0c;所以就叫我来看看&#xff0c;发现是附网返回状态、入网APN发生了改变导致的。另外&#xff0c;如果在境外使用国产4G模组拨号入网&#xff0c;也需要关注4G…

Windows安装超好用的截图工具——Snipaste

1、下载 官网&#xff1a;https://zh.snipaste.com/ 2、安装 &#xff08;1&#xff09;解压下载的压缩包 &#xff08;2&#xff09;选中Snipaste.exe文件&#xff0c;右键发送到 -- > 桌面快捷方式 &#xff08;3&#xff09;双击桌面Snipaste图标&#xff0c;桌面右下…

linux 服务器数据备份 和 mysql 数据迁移

查看域名ip 查看程序所处文件位置 list open files 1、 lsof -i :port 查看端口获取进程 pid 2、lsof -i pid 1、scp 下载服务器文件到本地 security copy protocol 2、导出服务器 mysql 数据库&#xff08;表&#xff09;到本地 mysqldump是MySQL自带的一个实用程序&…

解析Java中1000个常用类:Date类,你学会了吗?

在线工具站 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。程序员资料站 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程…

Git 完整的提交规范教程

约定式提交规范 本文中的关键词 “必须&#xff08;MUST&#xff09;”、“禁止&#xff08;MUST NOT&#xff09;”、“必要&#xff08;REQUIRED&#xff09;”、“应当&#xff08;SHALL&#xff09;”、“不应当&#xff08;SHALL NOT&#xff09;”、“应该&#xff08;S…

云计算【第一阶段(24)】Linux文件系统与日志分析

一、文件与存储系统的inode与block 1.1、硬盘存储 最小存储单位&#xff1a;扇区(sector) 每个扇区大小&#xff1a;512字节 1.2、文件存取 最小存取单位&#xff1a;块(block)连续八个扇区组成&#xff1a;块(block) 每个块大小&#xff1a;4K文件数据&#xff1a;实际数据…

Leetcode1115 交替打印 FooBar及其测试

题目描述 相关标签 相关企业 给你一个类&#xff1a; class FooBar { public void foo() { for (int i 0; i < n; i) { print(“foo”); } } public void bar() { for (int i 0; i < n; i) { print(“bar”); } } } 两个不同的线程将会共用一个 FooBar 实例&#xf…

Java面试八股之如何提高MySQL的insert性能

如何提高MySQL的insert性能 提高MySQL的INSERT性能可以通过多种策略实现&#xff0c;以下是一些常见的优化技巧&#xff1a; 批量插入&#xff1a; 而不是逐条插入&#xff0c;可以使用单个INSERT语句插入多行数据。例如&#xff1a; INSERT INTO table_name (col1, col2) V…

正则表达式-使用笔记

正则表达式使用不当&#xff0c;会导致CPU飙升&#xff1b; 二、相关参考 正则表达式 – 语法 | 菜鸟教程 sparksql 正则匹配总结 三、回溯原理 导致性能下降最主要原因&#xff1a; .* 会导致大量回溯| 分支操作 https://zhuanlan.zhihu.com/p/27417442 四、常用工具 regex…

OpenSNN推文:科技前沿动态速览:六七月份的技术革新与行业进展

随着夏季的到来&#xff0c;科技界的热度也如同气温一般持续攀升。在这个充满活力的季节里&#xff0c;从量子计算的深邃世界到脑机接口的未来探索&#xff0c;从人工智能的智慧跃升到大数据的海洋遨游&#xff0c;再到运营策略的精妙布局和设计领域的创新火花&#xff0c;以及…

2024第三届中国医疗机器人大会第一轮通知

2024第三届中国医疗机器人大会第一轮通知 大会背景 医疗机器人技术正以前所未有的速度在主流医学领域取得卓越进展&#xff0c;新应用、新技术不断涌现&#xff0c;使得该领域在过去一年中取得了令人惊叹的增长。然而&#xff0c;这仅仅是冰山一角&#xff0c;未来的发展空间仍…

Docker:一、安装与卸载、配置阿里云加速器(Ubuntu)

目录 &#x1f341;安装docker&#x1f332;1、环境准备&#x1f332;2、安装docker Engine&#x1f9ca;1、卸载旧版、任何冲突的包&#x1f9ca;2、使用存储库安装&#x1f9ca;3、安装 Docker 包。&#x1f9ca;4、查询是否安装成功&#x1f9ca;5、运行hello-world镜像&…

柯桥小语种学校成人生活口语学习|西班牙语中H为什么不发音…

01 H en el alfabeto espaol 西语字母表中的h 字母H是唯一一个在标准西班牙语中不再代表任何音素的字母。尽管在它单独出现时被叫做HACHE&#xff0c;但在大多数单词拼写中&#xff0c;它只是一个没有声音对应关系的字母&#xff0c;因此RAE称其为“无声的H”&#xff08;hac…