spring 详解二 IOC(Bean xml配置及DI)

配置列表

Xml配置

功能描述

<bean id="" class=""></bean>

Bean的id,配置id会转为Bean名称和不配就是全限定类名

<bean name="" ></bean>

Bean的别名配置,存储在Factory的aliasMap中通过别名也可以获取Bean

<bean scope="" ></bean>

Bean的作用范围,默认singleton和prototype,加上mvc依赖又request和session

<bean lazy-init="" ></bean>

Bean的实例化机制,是否延迟加载,BeanFactory作为容器无效

<bean init-method="" ></bean>

Bean的实例化之后自动执行的初始化方法

<bean destroy-method="" ></bean>

Bean实例销毁前执行的方法,必须用close()方法,停止程序无效

<bean autowire="byType" ></bean>

设置自动注入模式,按类型byType按名称byName

<bean factory-bean="" factory-method="" ></bean>

指定哪个自定义bean工厂的哪个方法完成bean的创建

Singleton 容器创建的时候,就会进行bean的实例化并存储到单例池中,每次getBean都是从单例池中取到

ProtoType  容器创建的时候不会进行Bean实例创建,当调用getBean方法时,才会创建Bean,每次都会创建一个新的Bean实例

lazy-init="true" 延迟加载为true时,容器创建时不会创建Bean,在getBean时创建Bean放在单例池中

Bean的初始化方法和别名配置 

配置文件

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="userService"  name="aaa,bbb" init-method="init" destroy-method="destroy" class="com.tech.test.service.impl.UserServiceImpl"></bean><!--        <alias name="userService" alias="aaa"></alias>--></beans>

UserServiceImpl 

package com.tech.test.service.impl;import com.tech.test.service.UserService;
import org.springframework.beans.factory.InitializingBean;public class UserServiceImpl implements UserService, InitializingBean {public UserServiceImpl() {System.out.println("Bean实例化");}@Overridepublic void getUser() {System.out.println("get User Success");}/*** Bean初始化方法*/public void init(){System.out.println("初始化方法");}/*** Bean销毁前方法*/public void destroy(){System.out.println("销毁前方法");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("initBean...");}
}

可以看到在Bean实例加载之后,我们自定义的初始化方法开始执行

同时我们的配置类可以实现InitializingBean接口来添加Bean的初始化方法,实现afterPropertiesSet方法,此方法执行时机早于自定义方法,见名知义,此方法在属性注入之后执行,在生命周期中介绍

 别名配置

可以看到,我们配置的别名存在aliasMap中,指向Bean的名称,在Bean标签上的name属性配置和单独alias 标签效果是一样的,只不过配置的地方不一样

工厂方法实例化Bean 

实例化Bean的方式

1、无参构造实例化Bean

2、有参构造实例化Bean

3、静态工厂方法实例化Bean

4、实例工厂实例化Bean

5、实现FactoryBean规范接口实例化Bean

静态工厂实例化Bean 

package com.tech.test.factory;
import com.tech.test.service.UserService;
import com.tech.test.service.impl.UserServiceImpl;public class MyStaticFactory {public static UserService getUserServiceBean(){return new UserServiceImpl();}
}
 <bean id="userService"  class="com.tech.test.factory.MyStaticFactory" factory-method="getUserServiceBean"></bean>

 直接配置工厂方法实例化bean即可 factory-method="getUserServiceBean"

 实例工厂实例化Bean

package com.tech.test.factory;import com.tech.test.service.UserService;
import com.tech.test.service.impl.UserServiceImpl;public class MyBeanFactory {public  UserService getUserBean(){return new UserServiceImpl();}
}
     <!--  配置实例工厂对象  --><bean id="factory"  class="com.tech.test.factory.MyBeanFactory"></bean><!--  配置实例工厂对象生成Bean对象  --><bean id="userService2"  factory-bean="factory" factory-method="getUserBean"></bean>

实例工厂配置bean,首先需要配置工厂Bean,因为不是静态的,不能够类名调用,必须需要对象,其他配置都一样

 实现FactoryBean规范接口实例化Bean

package com.tech.test.factory;import com.tech.test.service.UserService;
import com.tech.test.service.impl.UserServiceImpl;
import org.springframework.beans.factory.FactoryBean;public class MyBeanFactory1 implements FactoryBean<UserService> {@Overridepublic UserService getObject() throws Exception {return new UserServiceImpl();}@Overridepublic Class<?> getObjectType() {return UserService.class;}
}
    <!--实现工厂规范生成Bean对象,正常配置即可,该规范sping会自动调用生成工厂对象--><bean id="userService3"  class="com.tech.test.factory.MyBeanFactory1"></bean>

正常配置即可,该规范sping会自动调用生成工厂对象

DI依赖注入配置

注入方式

注入方式

配置方式

通过Bean的set方法注入

<property name = "user" ref="userService" />

<property name = "ceshi" value="test" />

通过Bean的构造方法注入

<constructor-arg  name="user" ref="userService"/>

<constructor-arg  name="ceshi" value="test"/>

Bean的属性或者依赖的注入方式只有两种,通过set方法为Bean设置属性,通过构造方法为Bean设置属性 

注入规则

普通数据类型 String int 等 用 value指定

<property name="url" value="jdbc:mysql://localhost:3306/test"></property>

引用数据类型 对象等 用ref指定

<bean id="userService" class="com.tech.test.factory.MyBeanFactory1"></bean>

<property name="userService" ref="userService">

集合数据类型 List Map Properties等如下示例所示:

示例 

 <bean id="di"  class="com.tech.test.testbean.DI"><property name="testString"><list><value>string1</value><value>string2</value></list></property><property name="userServices"><ref bean="userService"></ref></property><property name="map"><map><entry key="d1" value-ref="userService"></entry></map></property><property name="properties"><props><prop key="p1">123</prop></props></property>
</bean>

自动注入

除了这种注入方式,可以配置自动注入,但也是通过set和构造方法两种形式

bytype,根据类型注入,容器创建bean之后注入属性自动寻找匹配类型的bean,需要注意scope需要单例,否则报错

byName,会找寻bean实例的set方法,例如testString,会找这个setTestString注入

<bean id="di"  class="com.tech.test.testbean.DI" autowire="byName"><property name="testString"><list><value>string1</value><value>string2</value></list></property></bean>

Spring默认命名空间标签 

标签

作用

<beans>

xml的配置的根标签,其他标签都是该标签的子标签

<bean>

beans下创建bean的标签,配置bean

<import>

外部资源导入标签

<alias>

指定Bean别名标签 跟<bean>上的name一样 别名存在aliasMap中

<import>

可以引入分模块配置的其他配置

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="di.xml"></import></beans>

按模块导入,类似下面配置即可 

 多套<beans>环境配置

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="di.xml"></import><beans profile="test"><bean id="userServiceTestenv"  name="aaa,bbb" init-method="init" destroy-method="destroy" class="com.tech.test.service.impl.UserServiceImpl"></bean><alias name="userServiceTestenv" alias="aaa"></alias></beans></beans>

此时test之外的是默认环境,如果选择test环境也会包含默认环境的配置

切换环境如下:

  • 命令行参数 -Dspring.profiles.active = test
  • 使用代码的方式设置环境变量 System.setProperty(“spring.profiles.active”,”test”)

spring中的getBean方法

getBean(String name)

通过名称寻找bean实例,需要强转

getBean(Class Type)

通过类型寻找Bean,不需要强转,但Bean必须是单例唯一,否则报错

getBean(String name,Class Type)

根据名称获取Bean,返回值为Class类型的实例,无需强转

配置非自定义bean

在实际开发中,有些功能类并不是我们自己定义的,而是在第三方jar包之上,想要让容器管理需要考虑以下两个问题

Bean的实例化方式是什么 ?无参构造、有参构造,静态工厂还是实例工厂

被配置的Bean是否需要注入必要属性?

配置数据源 

引入依赖

 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version>
</dependency>

配置第三方jar交给spring管理

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean>

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

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

相关文章

操作系统Linux—day01

编程 网页 软件 网站项目 知识点&#xff1a; 前端页面&#xff1a;HTML css JavaScript JQuery VUE 数据库&#xff1a;Oracle MySQL 服务器&#xff1a;服务器的操作系统Linux Http://115.159.96.174:8090/EasyBuy/ www.baidu.com>http://180.101.49.12/ 后台技术…

几何伙伴行泊一体解决方案入选浦东人工智能十大创新技术

2023年7月8日&#xff0c;在全球瞩目的世界人工智能大会&#xff08;WAIC&#xff09;浦江东岸分会场&#xff0c;主题为“引领未来&#xff0c;赋能焕新”的“2023世界人工智能大会浦东论坛”隆重举办。浦东新区作为全国首个人工智能创新应用先导区&#xff0c;正打造上海人工…

electron的(maximize)最大化方法会导致头部白色横条以及四周大黑边

参考文章&#xff1a;https://www.w3cways.com/2505.html 感谢这位博主 我在使用win.maximize()后发现应用程序虽然最大化了&#xff0c;但是四周和顶部有一定宽度的黑边白边&#xff0c;在百度一段时间后没有发现其他人有这个问题 &#x1f614;唉 必现步骤&#xff1a; 只要…

前端理解的HTTP缓存(作用、缓存策略、缓存控制机制、应用)

一、HTTP缓存有什么作用&#xff1f; 缓存是为了重复使用而被存储的&#xff0c;可以减少浏览器和服务器之间通信的次数、降低网络延迟、加速页面加载、提高用户体验性等。不但能使网页打开速度更快&#xff0c;还能减少服务器的压力。 二、 浏览器的缓存策略有哪些&#xff1…

【MySQL】不就是事务

前言 嗨咯&#xff0c;小伙伴们大家好呀&#xff0c;我已经一个星期没有更新了&#xff0c;实在抱歉&#xff01;本期我们要学习MySQL初阶中的最后一课&#xff0c;MySQL数据库中的事务也算是近几年面试必考的问题&#xff0c;所以我们一定要认真学习。 目录 前言 目录 一、事…

派盘支持单向和双向资料同步

派盘作为一款本地云存储解决方案&#xff0c;不仅支持双向同步&#xff0c;还提供了设置部分文件夹单向同步的功能。这意味着用户可以根据自己的需求&#xff0c;精确控制文件夹的同步方向&#xff0c;以实现更有针对性的文件管理和同步。 π-Disk派盘 – 知识管理专家 派盘的…

最详细的下载安装PicGo图床配合Typora使用

1.node.js下载安装1.2 检验安装成功 2. PicGo下载安装3. 配置Gitee【配合PicGo使用】3.1 获取PicGo的token 4. 配置PicGo4.1 下载插件4.2 配置图床[Gitee]4.3 配置Typora 5. 上传图片到Gitee【重要】6.解决配置错误 1.node.js下载安装 【node.js下载链接】点击跳转页面&#x…

JVM (simple Version)

简介 JVM 其实就是一个Java进程 , 从操作系统申请一大块内存区域, 供 java 代码使用 . 申请出的内存 , 进一步划分 , 给出不同的用途 . JVM 内存区域划分 : 堆中存放就是 new 出来的对象. (成员变量) 栈 是用来维护方法之间的调用关系 (局部变量) 元数据区(或者叫方法区) 存放的…

day34-servlet 分页

0目录 servlet 1.分页 分页逻辑1&#xff1a;数据库中20条记录&#xff0c;要求每页5条数据&#xff0c;则一共有4页 分页逻辑2&#xff1a;数据库中21条记录&#xff0c;要求每页5条数据&#xff0c;则一共有5页 分页逻辑3&#xff1a;数据库中19条记录&#xff0c;要求每页…

Java阶段五Day04

Java阶段五Day04 文章目录 Java阶段五Day04订单交易案例调整项目案例环境克隆项目验证maven环境数据库导入本地mysql核心业务 实现csmall-for-jsd-all纵向拆分csmall-for-jsd-order系统 删除module&#xff08;删除maven项目&#xff09;idea记录maven忽略pull远程解决冲突git对…

Windows操纵kafka

这里写目录标题 启动kafk创建一个测试主题查看所有主题查看first详细信息修改分区数(分区数只能增加 不能减少)删除主题生产者生产数据消费命令 启动kafk 安装目录下 .\bin\windows\kafka-server-start.bat .\config\server.properties创建一个测试主题 安装目录下 .\bin\wi…

详解LeafLet中如何展示GeoServer发布的图层组

目录 前言 一、关于图层组 1、使用图层图组的好处 2、创建图层组 二、在Leaflet中展示图层组 1、新建Html模板框架 2、绑定地图map和底图设置 3、绑定图层组 总结 前言 在之前的博文中&#xff0c;曾经重点介绍如何使用LeafLet叠加Geoserver wms图层到已有底图的方法 ,…