SSM - Springboot - MyBatis-Plus 全栈体系(八)

第二章 SpringFramework

四、SpringIoC 实践和应用

4. 基于 配置类 方式管理 Bean

4.4 实验三:高级特性:@Bean 注解细节

4.4.1 @Bean 生成 BeanName 问题
  • @Bean 注解源码:
public @interface Bean {//前两个注解可以指定Bean的标识@AliasFor("name")String[] value() default {};@AliasFor("value")String[] name() default {};//autowireCandidate 属性来指示该 Bean 是否候选用于自动装配。//autowireCandidate 属性默认值为 true,表示该 Bean 是一个默认的装配目标,//可被候选用于自动装配。如果将 autowireCandidate 属性设置为 false,则说明该 Bean 不是默认的装配目标,不会被候选用于自动装配。boolean autowireCandidate() default true;//指定初始化方法String initMethod() default "";//指定销毁方法String destroyMethod() default "(inferred)";
}
  • 指定@Bean 的名称:
@Configuration
public class AppConfig {@Bean("myThing") //指定名称public Thing thing() {return new Thing();}
}
  • @Bean 注释注释方法。使用此方法在指定为方法返回值的类型的 ApplicationContext 中注册 Bean 定义。缺省情况下,Bean 名称与方法名称相同。下面的示例演示 @Bean 方法声明:
@Configuration
public class AppConfig {@Beanpublic TransferServiceImpl transferService() {return new TransferServiceImpl();}
}
  • 前面的配置完全等同于下面的 Spring XML:
<beans><bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>
4.4.2 @Bean 初始化和销毁方法指定
  • @Bean 注解支持指定任意初始化和销毁回调方法,非常类似于 Spring XML 在 bean 元素上的 init-method 和 destroy-method 属性,如以下示例所示:
public class BeanOne {public void init() {// initialization logic}
}public class BeanTwo {public void cleanup() {// destruction logic}
}@Configuration
public class AppConfig {@Bean(initMethod = "init")public BeanOne beanOne() {return new BeanOne();}@Bean(destroyMethod = "cleanup")public BeanTwo beanTwo() {return new BeanTwo();}
}
4.4.3 @Bean Scope 作用域
  • 可以指定使用 @Bean 注释定义的 bean 应具有特定范围。您可以使用在 Bean 作用域部分中指定的任何标准作用域。

  • 默认作用域为 singleton ,但可以使用 @Scope 注释覆盖此范围,如以下示例所示:

@Configuration
public class MyConfiguration {@Bean@Scope("prototype")public Encryptor encryptor() {// ...}
}
4.4.4 @Bean 方法之间依赖
4.4.4.1 准备组件
public class HappyMachine {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName = machineName;}
}
public class HappyComponent {//引用新组件private HappyMachine happyMachine;public HappyMachine getHappyMachine() {return happyMachine;}public void setHappyMachine(HappyMachine happyMachine) {this.happyMachine = happyMachine;}public void doWork() {System.out.println("HappyComponent.doWork");}}
4.4.4.2 Java 配置类实现:
  • 方案 1:直接调用方法返回 Bean 实例:在一个 @Bean 方法中直接调用其他 @Bean 方法来获取 Bean 实例,虽然是方法调用,也是通过 IoC 容器获取对应的 Bean,例如:
@Configuration
public class JavaConfig {@Beanpublic HappyMachine happyMachine(){return new HappyMachine();}@Beanpublic HappyComponent happyComponent(){HappyComponent happyComponent = new HappyComponent();//直接调用方法即可!happyComponent.setHappyMachine(happyMachine());return happyComponent;}}
  • 方案 2:参数引用法:通过方法参数传递 Bean 实例的引用来解决 Bean 实例之间的依赖关系,例如:
package com.alex.config;import com.alex.ioc.HappyComponent;
import com.alex.ioc.HappyMachine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** projectName: com.alex.config* description: 配置HappyComponent和HappyMachine关系*/@Configuration
public class JavaConfig {@Beanpublic HappyMachine happyMachine(){return new HappyMachine();}/*** 可以直接在形参列表接收IoC容器中的Bean!*    情况1: 直接指定类型即可*    情况2: 如果有多个bean,(HappyMachine 名称 ) 形参名称等于要指定的bean名称!*           例如:*               @Bean*               public Foo foo1(){*                   return new Foo();*               }*               @Bean*               public Foo foo2(){*                   return new Foo()*               }*               @Bean*               public Component component(Foo foo1 / foo2 通过此处指定引入的bean)*/@Beanpublic HappyComponent happyComponent(HappyMachine happyMachine){HappyComponent happyComponent = new HappyComponent();//赋值happyComponent.setHappyMachine(happyMachine);return happyComponent;}}

4.5 实验四:高级特性:@Import 扩展

  • @Import 注释允许从另一个配置类加载 @Bean 定义,如以下示例所示:
@Configuration
public class ConfigA {@Beanpublic A a() {return new A();}
}@Configuration
@Import(ConfigA.class)
public class ConfigB {@Beanpublic B b() {return new B();}
}
  • 现在,在实例化上下文时不需要同时指定 ConfigA.class 和 ConfigB.class ,只需显式提供 ConfigB ,如以下示例所示:
public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);// now both beans A and B will be available...A a = ctx.getBean(A.class);B b = ctx.getBean(B.class);
}
  • 此方法简化了容器实例化,因为只需要处理一个类,而不是要求在构造期间记住可能大量的 @Configuration 类。

4.6 实验五:基于注解 + 配置类方式整合三层架构组件

4.6.1 需求分析
  • 搭建一个三层架构案例,模拟查询全部学生(学生表)信息,持久层使用 JdbcTemplate 和 Druid 技术,使用注解+配置类方式进行组件管理!

在这里插入图片描述

4.6.2 数据库准备
create database studb;use studb;CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,gender VARCHAR(10) NOT NULL,age INT,class VARCHAR(50)
);INSERT INTO students (id, name, gender, age, class)
VALUES(1, '张三', '男', 20, '高中一班'),(2, '李四', '男', 19, '高中二班'),(3, '王五', '女', 18, '高中一班'),(4, '赵六', '女', 20, '高中三班'),(5, '刘七', '男', 19, '高中二班'),(6, '陈八', '女', 18, '高中一班'),(7, '杨九', '男', 20, '高中三班'),(8, '吴十', '男', 19, '高中二班');
4.6.3 项目准备
4.6.3.1 项目创建
  • spring-java-practice-06
4.6.3.2 依赖导入
<dependencies><!--spring context依赖--><!--当你引入SpringContext依赖之后,表示将Spring的基础依赖引入了--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.6</version></dependency><!-- 数据库驱动和连接池--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version></dependency><!-- spring-jdbc --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.0.6</version></dependency></dependencies>
4.6.3.3 实体类准备
public class Student {private Integer id;private String name;private String gender;private Integer age;private String classes;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getClasses() {return classes;}public void setClasses(String classes) {this.classes = classes;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", age=" + age +", classes='" + classes + '\'' +'}';}
}
4.6.4 三层架构搭建和实现
4.6.4.1 持久层
//接口
public interface StudentDao {/*** 查询全部学生数据* @return*/List<Student> queryAll();
}//实现类
@Repository
public class StudentDaoImpl implements StudentDao {@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 查询全部学生数据* @return*/@Overridepublic List<Student> queryAll() {String sql = "select id , name , age , gender , class as classes from students ;";/*query可以返回集合!BeanPropertyRowMapper就是封装好RowMapper的实现,要求属性名和列名相同即可*/List<Student> studentList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Student.class));return studentList;}
}
4.6.4.2 业务层
//接口
public interface StudentService {/*** 查询全部学员业务* @return*/List<Student> findAll();}//实现类
@Service
public class StudentServiceImpl  implements StudentService {@Autowiredprivate StudentDao studentDao;/*** 查询全部学员业务* @return*/@Overridepublic List<Student> findAll() {List<Student> studentList =  studentDao.queryAll();return studentList;}
}
4.6.4.3 表述层
@Controller
public class StudentController {@Autowiredprivate StudentService studentService;public void findAll(){List<Student> studentList =  studentService.findAll();System.out.println("studentList = " + studentList);}
}
4.6.5 三层架构 IoC 配置类
@Configuration
@ComponentScan(basePackages = "com.alex")
@PropertySource("classpath:jdbc.properties")
public class JavaConfig {@Value("${alex.url}")private String url;@Value("${alex.driver}")private String driver;@Value("${alex.username}")private String username;@Value("${alex.password}")private String password;@Bean(destroyMethod = "close")public DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}}
4.6.6 运行测试
public class ControllerTest {@Testpublic void testRun(){AnnotationConfigApplicationContext applicationContext =new AnnotationConfigApplicationContext(JavaConfig.class);StudentController studentController = applicationContext.getBean(StudentController.class);studentController.findAll();}
}
4.6.7 注解+配置类 IoC 方式总结
  • 完全摒弃了 XML 配置文件
  • 自定义类使用 IoC 和 DI 注解标记
  • 第三方类使用配置类声明方法+@Bean 方式处理
  • 完全注解方式(配置类+注解)是现在主流配置方式

5. 三种配置方式总结

5.1 XML 方式配置总结

  • 所有内容写到 xml 格式配置文件中
  • 声明 bean 通过<bean 标签
  • <bean 标签包含基本信息(id,class)和属性信息 <property name value / ref
  • 引入外部的 properties 文件可以通过<context:property-placeholder
  • IoC 具体容器实现选择 ClassPathXmlApplicationContext 对象

5.2 XML+注解方式配置总结

  • 注解负责标记 IoC 的类和进行属性装配
  • xml 文件依然需要,需要通过<context:component-scan 标签指定注解范围
  • 标记 IoC 注解:@Component,@Service,@Controller,@Repository
  • 标记 DI 注解:@Autowired @Qualifier @Resource @Value
  • IoC 具体容器实现选择 ClassPathXmlApplicationContext 对象

5.3 完全注解方式配置总结

  • 完全注解方式指的是去掉 xml 文件,使用配置类 + 注解实现
  • xml 文件替换成使用@Configuration 注解标记的类
  • 标记 IoC 注解:@Component,@Service,@Controller,@Repository
  • 标记 DI 注解:@Autowired @Qualifier @Resource @Value
  • <context:component-scan 标签指定注解范围使用@ComponentScan(basePackages = {“com.alex.components”})替代
  • <context:property-placeholder 引入外部配置文件使用@PropertySource({“classpath:application.properties”,“classpath:jdbc.properties”})替代
  • <bean 标签使用@Bean 注解和方法实现
  • IoC 具体容器实现选择 AnnotationConfigApplicationContext 对象

6. 整合 Spring5-Test5 搭建测试环境

6.1 整合测试环境作用

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

6.2 导入相关依赖

<!--junit5测试-->
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.1</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>6.0.6</version><scope>test</scope>
</dependency>

6.3 整合测试注解使用

//@SpringJUnitConfig(locations = {"classpath:spring-context.xml"})  //指定配置文件xml
@SpringJUnitConfig(value = {BeanConfig.class})  //指定配置类
public class Junit5IntegrationTest {@Autowiredprivate User user;@Testpublic void testJunit5() {System.out.println(user);}
}

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

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

相关文章

思科的简易配置

vlan 划分配置 1. 拓扑连接 2. 终端设备配置&#xff0c;vlan(v2, v3)配置&#xff0c;模式设置 然后设置交换机 fa 0/5 口为 trunk 模式&#xff0c;使得不同交换机同一 vlan 下 PC 可以互连 3.测试配置结果 用 ip 地址为 192.168.1.1 的主机(PC0)向同一 vlan(v2)下的 192.…

如何统计iOS产品不同渠道的下载量?

一、前言 在开发过程中&#xff0c;Android可能会打出来很多的包&#xff0c;用于标识不同的商店下载量。原来觉得苹果只有一个商店&#xff1a;AppStore&#xff0c;如何做出不同来源的统计呢&#xff1f;本篇文章就是告诉大家如何做不同渠道来源统计。 二、正文 先看一下苹…

算法——快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 由图可知&#xff0c;其实这也是一个判断循环的过程&#xff0c;要用到快慢指针&#xff0c;且相遇后&#xff0c;若在全为1的循环里&#xff0c;那么就是快乐数&#xff0c;若相遇后不为1&#xff0c;说明这不是快乐数。 …

备份数据重删

重复数据删除&#xff1a; 在计算中&#xff0c;重复数据删除是一种消除重复数据重复副本的技术。此技术用于提高存储利用率&#xff0c;还可以应用于网络数据传输以减少必须发送的字节数。在重复数据删除过程中&#xff0c;将在分析过程中识别并存储唯一的数据块或字节模式。…

HAlcon例子

气泡思想 * This example shows the use of the operator dyn_threshold for * the segmentation of the raised dots of braille chharacters. * The operator dyn_threshold is especially usefull if the * background is inhomogeneously illuminated. In this example, *…

vue3的生命周期

1.vue3生命周期官方流程图 2.vue3中的选项式生命周期 vue3中的选项式生命周期钩子基本与vue2中的大体相同&#xff0c;它们都是定义在 vue实例的对象参数中的函数&#xff0c;它们在vue中实例的生命周期的不同阶段被调用。生命周期函数钩子会在我们的实例挂载&#xff0c;更新…

竞赛 基于机器视觉的火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖&#xff0c;适合作为竞赛…

23下半年学习计划

大二上学期计划 现在已经是大二了&#xff0c;java只学了些皮毛&#xff0c;要学的知识还有很多&#xff0c;新的学期要找准方向&#xff0c;把要学的知识罗列&#xff0c;按部就班地完成计划&#xff0c;合理安排时间&#xff0c;按时完成学习任务。 学习node.js&#xff0c…

运维学习之部署Grafana

sudo nohup wget https://dl.grafana.com/oss/release/grafana-10.1.1.linux-amd64.tar.gz &后台下载压缩包&#xff0c;然后按一下回车键。 ps -aux | grep 15358发现有两条记录&#xff0c;就是还在下载中。 ps -aux | grep 15358发现有一条记录&#xff0c;并且tail …

一百七十八、ClickHouse——海豚调度执行ClickHouse的.sql文件

一、目的 由于数仓的ADS层是在ClickHouse中&#xff0c;即把Hive中DWS层的结果数据同步到ClickHouse中&#xff0c;因此需要在ClickHouse中建表&#xff0c;于是需要海豚调度执行ClickHouse的.sql文件 二、实施步骤 &#xff08;一&#xff09;第一步&#xff0c;海豚建立Cl…

Python in Visual Studio Code 2023年9月更新

作者&#xff1a;Courtney Webster - Program Manager, Python Extension in Visual Studio Code 排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 9 月发布&#xff01; 此版本包括以下内容&#xff1a; • 将 Python …

使用 Nginx 实现企业微信域名配置中的校验文件跳转

背景 在企业微信中配置业务域名时&#xff0c;通常需要在该域名的根路径下放置一个校验文件&#xff0c;以验证域名的所有权。然而&#xff0c;如果该域名是第三方的&#xff0c;你可能无法直接在根路径下放置文件。在这种情况下&#xff0c;你可以使用 Nginx 来实现校验文件的…

2023 Google 开发者大会|Mobile开发专题追踪

文章目录 前言大会介绍涉及内容MobileWebAICloud Mobile开发专题多终端应用的开发适配大屏视频流可穿戴设备电视新的设计中心 构建高质量的应用高级相机和媒体功能用户的安全和隐私更精细的视觉体验 小结 前言 哈喽大家好&#xff0c;我是阿Q。近期&#xff0c;【2023 Google …

python: excel假期时间提取统计

# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 311 # Datetime : 2023/9/3 7:04 # User : geovindu # Product : PyCharm # Proje…

Redis 数据一致性方案的分析与研究

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 一般的业务场景都是读多写少的&#xff0c;当客户端的请求太多&#xff0c;对数据库的压力越来越大&#xff0c;引入缓存来降低数据库的压力是必然选择&#xff0c;目前业内…

常用数据库的 API - 开篇

API API 这个词在大多数人看来可能和 CNS 差不多&#xff0c;前者天天听说就是用不上&#xff0c;后者天天读就是发不了。 不过&#xff0c;通过今天的一个简短介绍&#xff0c;今后 API 这个东西你就用上了&#xff0c;因为在文章最后我将会展示一个最最基础且高频的 API 使…

【CSS3】

文章目录 1.简介2.边框3.圆角4.背景5.渐变CSS3 径向渐变6.文本效果7.字体8.2D转换9.3D转换10.过渡11.动画12.多列13.用户界面14.按钮 ​ 1.简介 模块 CSS3 被拆分为"模块"。旧规范已拆分成小块&#xff0c;还增加了新的。 一些最重要 CSS3 模块如下&#xff1a; 选…

时序数据库

时序数据库在许多应用领域中得到广泛应用,包括物联网(IoT)监控、应用性能监控(APM)、日志分析、金融数据分析、工业自动化和能源管理等。一些知名的开源和商业时序数据库包括InfluxDB、Prometheus、OpenTSDB、TimescaleDB和Kdb+等。 上图是一个典型的时序数据示意图,由…

慢查询SQL如何优化

一.什么是慢SQL? 慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录&#xff0c;它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s. 二.查看慢SQL是否…

网络原理(一)网络基础,包括IP ,网络相关的定义

网络基础&#xff0c;包括IP &#xff0c;网络相关的定义 网络基础冲突域广播域DNSNATNAPT 网络基础 以下图片是书上的网图。 什么是IP地址&#xff1f; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。P地址是…