Spring IOC

 ◆ 传统Javaweb开发的困惑

 

◆ IoC、DI和AOP思想提出

◆ Spring框架的诞生

Spring | Home

 

 

IOC控制反转:BeanFactory 快速入门 

 

package com.xiaolin.service.Impl;import com.xiaolin.dao.UserDao;
import com.xiaolin.service.UserService;public class UserServiceImpl implements UserService {//该方法是BeanFactory去调用该方法  从容器中获取userDap设置到此处public void setUserDao(UserDao userDao) {System.out.println("该方法是BeanFactory去调用该方法  从容器中获取userDap设置到此处"+userDao);}
}
package com.xiaolin.service;public interface UserService {
}
public class BeanFactoryTest {public static void main(String[] args) {//创建工厂对象DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个读取器(xml文件)XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);//读取器配置文件给工厂reader.loadBeanDefinitions("beans.xml");//根据id获取Bean实例对象UserService userService = (UserService) beanFactory.getBean("userService");
//        System.out.println(userService);}
}

DI依赖注入:BeanFactory 快速进阶(在一个bean对象中嵌套另一个bean对象)

 

package com.xiaolin.dao.Impl;import com.xiaolin.dao.UserDao;public class UserDaoImpl implements UserDao {
}
package com.xiaolin.dao;public interface UserDao {
}
public class BeanFactoryTest {public static void main(String[] args) {//创建工厂对象DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个读取器(xml文件)XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);//读取器配置文件给工厂reader.loadBeanDefinitions("beans.xml");//根据id获取Bean实例对象UserService userService = (UserService) beanFactory.getBean("userService");
//        System.out.println(userService);UserDao userDao = (UserDao) beanFactory.getBean("userDao");
//        System.out.println(userDao);}
}

 - ApplicationContext快速入门

 

package com.xiaolin.test;import com.xiaolin.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ApplicationContextTest {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) applicationContext.getBean("userService");System.out.println(userService);}
}

 applicationContext.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.xsd">
<!--    配置UserServiceImpl--><bean id="userService" class="com.xiaolin.service.Impl.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean>
<!--    配置UserDao将userDao设置给userService
--><bean id="userDao" class="com.xiaolin.dao.Impl.UserDapImpl"></bean>
</beans>

 BeanFactory与ApplicationContext的关系

 

 

 

BeanFactory的继承体系 

ApplicationContext的继承体系 

 

 

 

◆ 基于xml的Spring应用

- SpringBean 的配置详解

 1)Bean的基础配置

2)Bean的别名配置 

3)Bean的范围配置 【singleton(单例模式)/prototype(多对象模式)】

 

 4)Bean的延迟加载

 

 5)Bean的初始化和销毁方法配置

方法一:init-method/destory-method

方法二: 实现InitializingBean

 6)Bean的实例化配置【创建Bean方式】

 方法一:构造方法实例化:<constructor-arg>

 当没有无参构造方法而使用有参构造方法时候,要在相关的配置文件中使用<constructor-arg>,进行配置,name对应参数名,value对应相关的值

方法二:工厂方法实例化

⚫ 静态工厂方法实例化Bean

⚫ 实例工厂方法实例化Bean

⚫ 实现FactoryBean规范延迟实例化Bean

 

 7)Bean的依赖注入配置

 

注入 List 集合 

 注入 Set 集合

 注入 Map 集合

 注入 Properties 键值对

扩展:自动装配方式

 8)Spring的其他配置标签

 

 <bean>标签

 

指定其他环境的情况下,默认环境都起作用

<import>标签  

 <alisas>标签:起别名

 

 Spring的自定义标签

先在pom导入坐标

 

- Spring 的get方法

        Object userDao1 =applicationContext.getBean("userDao1");UserDao userDao11 = applicationContext.getBean("userDao1", UserDao.class);UserDao bean = applicationContext.getBean(UserDao.class);

- Spring 配置非自定义Bean

 1)配置 Druid 数据源交由Spring管理

    <!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!-- druid数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.23</version></dependency>

    <!--配置 DruidDataSource数据源--><bean class="com.alibaba.druid.pool.DruidDataSource"><!--配置必要属性--><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></bean>

2)配置Connection交由Spring管理【静态工厂方法】

3)配置日期对象交由Spring管理 【实例化工厂方法】

 4)配置MyBatis的SqlSessionFactory交由Spring管理【多种配置方法统一】

mybatis-conifg.xml 

 

- Bean 实例化的基本流程

 

 

 

 

- Spring的后处理器

beanDefinitionMap->bean工厂后处理器->循环map(实例化->bean后处理器->填充到单例池) 

 BeanFactoryPostProcessor

 

 BeanDefinition 

 BeanDefinitionRegistryPostProcessor[BeanFactoryPostProcessor的子接口]

 小总结:

 自定义注解【注解的底层实现】

 

 

 BeanPostProcessor

 

 

 对Bean方法进行执行时间日志增强

 

 

public class TimeLogBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {//使用动态代理对目标Bean进行增强,返回proxy对象,进而存储到单例池singletonObjects中Object beanProxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(),bean.getClass().getInterfaces(),(proxy, method, args) -> {//1、输出开始时间System.out.println("方法:" + method.getName() + "-开始时间:" + new Date());//2、执行目标方法Object result = method.invoke(bean, args);//3、输出结束时间System.out.println("方法:" + method.getName() + "-结束时间:" + new Date());return result;});return beanProxy;}
}

- Spring Bean的生命周期

 Bean初始化阶段

 Bean实例属性填充

注入双向对象引用

 

 

 三级缓存(解决注入双向对象引用)

 P54底层源码(欠)

常用的Aware接口

- Spring IoC 整体流程总结

 

 

 

硬核讲解:

55-Spring IoC容器实例化Bean整体流程图_哔哩哔哩_bilibili

- Spring xml方式整合MyBatis

Spring整合MyBatis --纯手写Mybatis整合

public interface UserMapper {List<User> findAll();}

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper"><select id="findAll" resultType="com.itheima.pojo.User">select * from tb_user</select>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><package name="com.itheima.mapper"></package></mappers></configuration>
MyBatisTest
public class MyBatisTest {public static void main(String[] args) throws Exception {InputStream in = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = builder.build(in);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> all = mapper.findAll();for (User user : all) {System.out.println(user);}}}

 Spring整合MyBatis 

        <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.13.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency>

    <!--配置数据源信息--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property></bean><!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.itheima.mapper"></property></bean>

 

Spring整合MyBatis的原理剖析 

SqlSessionFactoryBean 

 执行完SqlSessionFactoryBean后,里面调用了getObject然后产生SqlSessionFactory。

 

 

MapperScannerConfigurer

60-Spring整合第三方框架-MyBatis整合Spring-MapperScannerConfigurer_哔哩哔哩_bilibili

 

 Spring xml方式整和第三方框架【自定义命名空间】

 使用外部配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

    <!--加载properties文件--><context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源信息--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean>
硬核讲解

62-Spring整合第三方框架-自定义命名空间解析原理_哔哩哔哩_bilibili

 

 

 

 

 

 基本流程

 

P-65-66 

◆ 基于注解的Spring应用

- Bean基本注解开发

 

 在@Component后面不加value值,默认id是该类名首字母小写

 

- Bean依赖注入注解开发

@Value 

 

 

 @Autowired【根据类型进行注入】

根据类型进行注入,如果同一个类型的Bean有多个,尝试根据名字进行二次匹配,匹配变不成功的则匹配失败

 

 

 @Qualifier

结合@Autowired一起使用,作用是根据名称注入相应的Bean

在非自定义属性上要@Autowird+@Qualifier 

在自定义属性中添加参数名可以单独使用@Qualifier

 

 @Resource

不指定名称参数时,根据类型注入【@Autowired】,指定名称就根据名称注入【@Autowired+@Qualifier】

- 非自定义Bean注解开发【@Bean】

注意点:

 

 

 

@Component
public class OtherBean {@Bean("dataSource")public DataSource dataSource(@Value("${jdbc.driver}") String driverClassName,@Qualifier("userDao2") UserDao userDao,UserService userService){/*System.out.println(driverClassName);System.out.println(userDao);System.out.println(userService);*/DruidDataSource dataSource = new DruidDataSource();//设置4个基本参数 ...return dataSource;}}

 

- Bean配置类的注解开发【替代整个配置文件】

 @Configuration

 @ComponentScan

 @PropertySource

 @Import

@Configuration  //标注当前类是一个配置类(替代配置文件)+@Component-->替代了<bean>//<context:component-scan base-package="com.itheima"/>
@ComponentScan("com.itheima")//相当于包扫描//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")//属性资源//<import resource=""></import>
@Import(OtherBean.class)

- Spring 配置其他注解

@Primary

@Profile 【切换环境】

没有指定环境,在任何情况下都可以使用

- Spring注解的解析原理

 

 

 

 

- Spring注解方式整合第三方框架

使用xml

 使用注解

 

 @import

@Import导入实现了ImportSelector接口的类

 @Import导入实现ImportBeanDefinitionRegistrar接口

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

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

相关文章

Intel 4工艺太难了!酷睿Ultra终于突破5GHz

无论是14nm还是10nm&#xff0c;Intel这些年的新工艺都有一个通性&#xff1a;刚诞生的时候性能平平&#xff0c;高频率都上不去&#xff0c;只能用于笔记本移动端(分别对应5代酷睿、10代酷睿)&#xff0c;后期才不断成熟&#xff0c;比如到了13代酷睿就达到史无前例的6GHz。 接…

【Linux】守护进程

1 相关概念 1.1 守护进程的概念 守护进程也叫做精灵进&#xff0c;是运行在后台的一种特殊进程。它独立于控制终端并且可以周期性的执行某种任务或者处理某些发生的事件。 守护进程是非常有用的进程&#xff0c;在Linux当中大多数服务器用的就是守护进程。比如&#xff0c;web…

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

【网络基础知识铺垫】

文章目录 1 :peach:计算机网络背景:peach:1.1 :apple:网络发展:apple: 2 :peach:协议:peach:2.1 :apple:协议分层:apple:2.2 :apple:OSI七层模型:apple:2.3 :apple:TCP/IP模型:apple:2.4 :apple:TCP/IP模型与操作系统的关系:apple: 3 :peach:网络传输基本流程:peach:4 :peach:网…

MybatisPlus存在 sql 注入漏洞(CVE-2023-25330)解决办法

首先我们了解下这个漏洞是什么&#xff1f; MyBatis-Plus TenantPlugin 是 MyBatis-Plus 的一个为多租户场景而设计的插件&#xff0c;可以在 SQL 中自动添加租户 ID 来实现数据隔离功能。 MyBatis-Plus TenantPlugin 3.5.3.1及之前版本由于 TenantHandler#getTenantId 方法在…

DeviceNet主站网关转ETHERCAT连接ethercat总线伺服如何控制

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关——捷米JM-ECTM-DNT。这款产品可是解决了不同协议设备数据交换的麻烦问题&#xff0c;让我们一起来看看它的神奇之处吧&#xff01; 这款通讯网关有什么特别的呢&#xff1f;首先&#xff0c;它可以连接DEVICENET总…

火车头标题伪原创【php源码】

大家好&#xff0c;给大家分享一下python怎么读取文件中的数据&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; python是一门非常火爆且相对易学的编程语言&#xff0c;应用在各种场景。许多人想学…

electron+vue3全家桶+vite项目搭建【13.1】ipc通信的使用,主进程与渲染进程之间的交互

文章目录 引入IPC通信[主/渲染]进程对应渲染进程>主进程代码测试测试效果 主进程>渲染进程代码测试测试效果 双向通信代码测试测试效果 引入 electron项目常常由一个主进程和多个渲染进程构成&#xff0c;渲染进程之间是隔离的&#xff0c;而所有渲染进程都和主进程共享…

vscode 格式问题

1、EditorConfig for VS Code 插件 shift alt f 格式化文件&#xff08;VS Code格式化按键&#xff09;&#xff0c;如下图&#xff0c;每个缩进4空格 代码如下 创建文件名 .editorconfig root true [*] charset utf-8 indent_style space indent_size 2 end_of_…

Docker 启动 Nacos 报错:No DataSource set

​ &#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 …

Microsoft Message Queuing Denial-of-Service Vulnerability

近期官方公布了一个MSMQ的拒绝服务漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 漏洞具体描述参见如下&#xff1a; Name: Microsoft Message Queuing Denial-of-Service Vulnerability Description: Microsoft Message Queuing…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

静态页面与动态页面的区别及部署jpress应用

简述静态网页和动态网页的区别 静态网页&#xff1a; 1、首先是静态网页&#xff0c;静态网页每个网页中都有一个固定的URL&#xff0c;网页URL以htm、HTML、jpg、.gif、.mp4等常见形式为后缀&#xff0c;而且不含有问号&#xff1b; 2、静态网页内容一经发布到网页服务器上…

Java 8:让你的代码更简洁、高效和灵活的新特性

Java 8 ——企业中使用最普遍的版本&#xff0c;那么了解它的新特性是非常有必要的 目录 一、函数式接口 二、Lamdba表达式 三、方法引用 四、Stream API 3.1 创建 方法一&#xff1a;通过集合 方法二&#xff1a;通过数组 方法三&#xff1a;通过Stream的of() 方法四…

《JeecgBoot系列》JeecgBoot(ant-design-vue) 识别字段中指定内容并修改该行文字颜色

JeecgBoot(ant-design-vue) 识别字段中指定内容并修改该行文字颜色 需求&#xff1a;将生产工厂是配件工厂的行改变颜色标注 一、修改table组件内容 在<a-table></a-table>内添加:rowClassName"tableRowClass" <a-table>...:rowClassName"t…

【Linux】从0到1实现一个进度条小程序

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处 文章目录 前言一、理解回车 \r 和换行 \n二、初步认识缓冲区1. 认识第一个函数&#xff1a;sleep2.观察缓冲区…

Hive终端命令行打印很多日志时,如何设置日志级别

示例&#xff1a;use test; 切换到test数据库时&#xff0c;输出很多日志信息不方便看结果&#xff0c;如下图。 解决方法&#xff1a; 退出hive命令行界面&#xff08;ctrlC&#xff09;执行“vi /usr/local/apache-hive-3.1.2-bin/conf/log4j.properties”命令&#xff0c;创…

Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting

安装PlatformIO插件成功&#xff0c;初始化失败 错误信息判断问题尝试访问https://pypi.tuna.tsinghua.edu.cn/simple/platformio/成功点击文件后报错如下&#xff1a; 解决问题- 换源 &#xff08; Windows下有两个地方需要更改&#xff09;cmd命令行Pip文件 总结&#xff1a;…

Python自动化测试之用Robot Framework进行自动化测试详解

概要 你还在手动测试&#xff1f;不妨了解一下更高效、准确且简单的测试方法——使用Python的Robot Framework进行自动化测试。 什么是Robot Framework&#xff1f; Robot Framework是一款开源的Python自动化测试框架&#xff0c;它基于关键字驱动的思想&#xff0c;具有易读、…

Autoware.ai1.14.0自动驾驶-Demo运行

Autoware.ai1.14.0自动驾驶-Demo运行 数据准备 下载数据&#xff1a; wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz一定要注意解压文件是在.auto…