一.将类交给spring管理(IOC)

1.将类交给spring容器管理

如何将一个类交给spring容器进行管理呢?
方法很简单,只需要在applicationContext.xml中加入对应的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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--将dao类加入到spring容器中进行管理--><!--name:bean的名称,class:该bean的实现类全名--><bean name="userDao" class="com.tledu.spring01.dao.UserDaoImpl"></bean>
</beans>

我们将加入到spring容器中的类叫做bean(豆子),他是容器的基本单位,交给了spring容器后,就可以通过容器去创建对象,这样就降低了耦合度,这个过程也叫做IOC,控制反转.

2.从spring容器中获取某个bean的实例

方法也很简单,如下:

//创建容器实例
ClassPathXmlApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取容器中的实例
UserDao userDao = application.getBean("userDao",UserDaoImpl.class);
//也可以这样,getBean返回的是一个Object,所以需要强转一下,或者通过上面的方式传入一个Class类型的值
UserDao userDao = (UserDaoImpl)application.getBean("userDao");

二.bean的注入

1.什么是注入

一个都在说注入注入,啥叫个注入,注入简单来说就是将某个值赋值给某个bean的属性,其实就是给某个bean的属性赋值,再简单点说就是给某个类的属性赋值,但是赋值的方式不是通过new 关键字或者其他直接复制,而是通过spring来赋值的,还是来个简单的例子吧

远古时期写类的时候这么写:

public class User{private String name = "123";//这是一个字符串private GirlFriend gf = new GirlFriend();//这是一个女朋友对象public void play(){}
}

现代人这么写:

public class User{@Setterprivate String name;//这是一个字符串@Setterprivate GirlFriend gf;//这是一个女朋友对象public void play(){}
}

将上面这个类交给spring进行管理

<?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"><!--将你的女朋友交给spring进行管理--><!--name:bean的名称,class:该bean的实现类全名--><bean name="girlFriend" class="com.tledu.spring01.dao.UserDaoImpl"></bean><bean name="user" class="包全名.User"><!--在创建User对象的时候,给user对象中的属性赋值--><!--name:bean对应实现类属性的名称,ref:bean的名称--><property name="gf" ref="girlFriend"></property><property name="name" value="高富帅"></property></bean>
</beans>

为了让你明白,敲的我手疼,这不给个赞?

2.通过property属性注入

package com.tledu.spring01.service;import com.tledu.spring01.dao.UserDao;
import lombok.Setter;/*** @author Antg* @date 2021/8/518:26*/
public class UserServiceImpl1 implements UserService {@Setterprivate UserDao userDao;@Overridepublic void testService() {System.out.println("userService01执行了");userDao.daoTest();}
}
    <!--通过property的方式注入--><bean name="userService1" class="com.tledu.spring01.service.UserServiceImpl01"><!--name中的是该实现类对应属性的名称,ref中的是spring容器中某个bean的名称--><property name="userDao" ref="userDao"></property></bean>

注意:需要注入的属性一定要有setter方法

3.通过构造方法注入

package com.tledu.spring01.service;import com.tledu.spring01.dao.UserDao;/*** @author Antg* @date 2021/8/519:34*/
public class UserServiceImpl2 implements UserService {private UserDao userDao;public UserServiceImpl2(UserDao userDao) {this.userDao = userDao;}@Overridepublic void testService() {System.out.println("通过构造方法注入");userDao.daoTest();}
}
     <!--通过构造方法的方式注入--><bean name="userService2" class="com.tledu.spring01.service.UserServiceImpl2"><!--name中的是该实现类对应属性的名称,ref中的是spring容器中某个bean的名称--><constructor-arg name="userDao" ref="userDao"></constructor-arg></bean>

三.scope

1.概述

spring中scope是一个非常关键的概念,简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式。
目前,scope的取值有5种取值:
在Spring 2.0之前,有singleton和prototype两种;
在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用
以下仅先具体说明前两种

2.singleton

此取值时表明容器中创建时只存在一个实例,所有引用此bean都是单一实例。
也就是说创建对象是单例模式,并且如果不进行设置,默认就行单例

可以看到,两次从ioc容器获取,构造方法只执行了一次

3.prototype

spring容器在进行输出prototype的bean对象 时,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求 方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一 个新的实例之后,就由这个对象“自生自灭”,最典型的体现就是spring与struts2进行整合时,要把action的scope改为 prototype。
简单来说,就是每次获取都创建一个新对象,并且这个对象的生命周期不归Spring管理
配置

    <!--当scope=prototype时--><bean name="userService4" class="com.tledu.spring01.service.UserServiceImpl4" scope="prototype"><!--name中的是该实现类对应属性的名称,ref中的是spring容器中某个bean的名称--><constructor-arg name="userDao" ref="userDao"></constructor-arg></bean>

可以看到,每次获取都会从新创建一个示例

4.request

request,session和global session类型只适用于web程序,通常是和XmlWebApplicationContext共同使用。
<bean id ="requestPrecessor" class="...RequestPrecessor" scope="request" />
Spring容器,即XmlWebApplicationContext 会为每个HTTP请求创建一个全新的RequestPrecessor对象,当请求结束后,该对象的生命周期即告结束,如同java web中request的生命周期。当同时有100个HTTP请求进来的时候,容器会分别针对这10个请求创建10个全新的RequestPrecessor实例,且他们相互之间互不干扰,简单来讲,request可以看做prototype的一种特例,除了场景更加具体之外,语意上差不多。

5.session

对于web应用来说,放到session中最普遍的就是用户的登录信息,对于这种放到session中的信息,我们可以使用如下形式的制定scope为session:
<bean id ="userPreferences" class="...UserPreferences" scope="session" />
Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例,比request scope的bean会存活更长的时间,其他的方面没区别,如同java web中session的生命周期。

6.global session

<bean id ="userPreferences" class="...UserPreferences" scope="globalsession" />
global session只有应用在基于porlet的web应用程序中才有意义,它映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待

四.集合的注入

类:

package com.tledu.spring01.service;import lombok.Setter;import java.util.List;
import java.util.Map;
import java.util.Set;/*** 测试集合的注入** @author Antg* @date 2021/8/520:27*/
public class UserServiceImpl5 implements UserService {@Setterprivate List<String> list;@Setterprivate Set<String> set;@Setterprivate Map<String, String> map;@Overridepublic void testService() {System.out.println("=========List的注入========");list.forEach(x -> System.out.println(x));System.out.println("=========Set的注入========");set.forEach(x -> System.out.println(x));System.out.println("=========Map的注入========");map.forEach((x, y) -> System.out.println(x + "--->" + y));}
}

配置:

    <!-- ############################### 集合的注入 #################################  --><bean name="userService5" class="com.tledu.spring01.service.UserServiceImpl5"><property name="list"><list><value>aaa</value><value>bbb</value><value>ccc</value><value>ccc</value></list></property><property name="set"><set><value>ddd</value><value>eee</value><value>fff</value><value>fff</value></set></property><property name="map"><map><entry key="001" value="张三"></entry><entry key="001" value="李四"></entry><entry key="002" value="张三"></entry></map></property></bean>

五.自动装配

上面我们学习到了两种手动注入的方式,通过property注入和通过构造方法注入
接下来再来看两种更牛逼的自动注入autowire的两种方法 byName 和 byType
注意:以下两种注入方法都需要在类的对应的属性上加setter方法

1.autowire=byName

    <!--使用byName--><bean name="userService6" class="com.tledu.spring01.service.UserServiceImpl6" autowire="byName"></bean>

byName是自动根据setter的属性名称去找,找到一个和ioc容器中名称相同的bean进行注入,如果找不到,就不赋值

2.autowire=byType

    <!--使用byType--><bean name="userService7" class="com.tledu.spring01.service.UserServiceImpl7" autowire="byType"></bean>

byType是自动根据setter中属性的类型去找到ioc容器中对应的类型,如果中找到就返回,但是需要注意的是,如果在ioc容器中存在多个类型相同的bean,就会报错.

六.生命周期

类:

package com.tledu.spring01.service;import com.tledu.spring01.dao.UserDao;
import lombok.Setter;/*** @author Antg* @date 2021/8/522:08*/
public class UserServiceImpl8 implements UserService {@Setterprivate UserDao userDao;@Overridepublic void testService() {System.out.println("测试生命周期的bean执行了");userDao.daoTest();}public void init() {System.out.println("UserServiceImpl8被初始化了");}public void destroy() {System.out.println("UserServiceImpl8被销毁了");}
}

配置:

    <bean name="userService8" class="com.tledu.spring01.service.UserServiceImpl8" init-method="init"destroy-method="destroy" autowire="byName"></bean>

测试:

    //测试singleton的生命周期@Testpublic void singletonTheLifeCycle() {application.getBean("userService8", UserServiceImpl8.class).testService();application.destroy();//销毁容器}

执行结果:

总结:
init-method属性配置bean初始化的方法
destory-method属性配置bean被销毁的时候的方法

七.迟加载

我们知道,当容器创建的时候,就会将scope=singleton的bean创建出来,但是如果有太多这样的bean,那么就会导致程序启动很慢,所以引入了迟加载的概念
配置如下:

    <bean name="userService9" class="com.tledu.spring01.service.UserServiceImpl9" autowire="byName"lazy-init="true"></bean>

效果:

spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载相关推荐

  1. Spring学习笔记4,注解方式管理Bean

    Spring框架的Bean管理注解方式的快速入门 1. 步骤一:下载Spring框架的开发包 解压后的目录结构如下 * docs – API和开发规范 * libs – jar包和源码      Sp ...

  2. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  3. springBoot将Service实现类交给spring容器管理的两种方法

    方法一: 在类名上面添加@Service注解 方法二: 添加配置文件,配置文件里添加添加方法如下的方法,并加@Bean注解 springBoot将(Service实现)类交给spring容器管理的目的 ...

  4. Spring学习总结(一)- Spring的核心特性之依赖注入(DI)总结

    文章目录 1.Spring容器 1.1.使用应用上下文 2.装配Bean 2.1.自动化装配bean 2.1.1.创建可被发现的bean 2.1.2.@ComponentScan注解启用组件扫描 2. ...

  5. Spring学习笔记:第一个Spring Boot程序HelloWorld

    Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...

  6. Spring -- 入门,装备集合,自动装配,分散装配,自定义编辑器

    1. 概要 struts2:web hibernate:持久化 spring:业务层.管理bean的,容器.List Map Set.体验spring:1.创建java项目.2.引入spring的类库 ...

  7. Atitit 几大研发体系对比 Stage-Gate体系 PACE与IPD体系 敏捷开发体系 CMMI体系 艾龙 著 1. 3. 1.5:业界领先的研发管理体系简介 2 1 2. 《产品及生命周期

    Atitit 几大研发体系对比 Stage-Gate体系  PACE与IPD体系 敏捷开发体系 CMMI体系 艾龙 著 1. 3. 1.5:业界领先的研发管理体系简介 2 1 2. <产品及生命 ...

  8. Spring框架学习笔记03:初探Spring——利用注解配置类取代Spring配置文件

    文章目录 一.课程引入 二.利用注解配置类取代Spring配置文件 (一)打开项目[SpringDemo2021] (二)创建net.hw.spring.lesson03包 (三)移植上一讲的接口和类 ...

  9. Spring学习(一)初识Spring

    本文借鉴:Spring学习(特此感谢!) 一.简介 什么是Spring 定义:Spring 是一个轻量级的 DI / IoC 和 AOP 容器的开源框架,目的为了简化java开发. DI:注入 IOC ...

最新文章

  1. MyBatisPlus插件扩展_PaginationInterceptor分页插件的使用
  2. lua检测表中是否有某个值,如何检查表是否包含Lua中的元素?
  3. GoogleAppEngine是什么?
  4. 在Spring Boot中使用 @ConfigurationProperties 注解
  5. 【Tomcat Eclipse】8080端口被占用问题记录
  6. SAP 电商云 Spartacus UI set delivery mode HTTP put 请求的触发时机
  7. postgresql是如何求年龄的_Postgresql 通过出生日期获取年龄的操作
  8. 深度强化学习和强化学习_深度强化学习:从哪里开始
  9. 保研生看过来!加入DUT Media Lab,科研没有不可能!
  10. Lubuntu16.4.3定制教程
  11. Docker实践(六)部署redis
  12. C#DataTable2Json(附时间格式化)
  13. 基于扩展卡尔曼滤波的slam
  14. 免校准的电量计量芯片_电能计量专用芯片CS5460A
  15. Samba 服务详解
  16. 【深度学习】OCR文本识别
  17. EventBus实现原理
  18. 易用、弹性、开放 — 云原生技术是数字时代的“水电煤”
  19. 如何限制同一客户端登录的用户数量以及禁止同一用户同时在不同客户端登录?
  20. netstat及telnet

热门文章

  1. RecyclerView添加蒙板引导信息
  2. tp5的通过php文件的打包与解包
  3. Waifu2x-Extension-GUI 支持图片gif视频的放大与降噪程序 v0.11-beta更新
  4. 深度学习部署神器——triton inference server入门教程指北
  5. matlab迭代算法实例sor,SOR迭代 - 程序语言 - MATLAB/Mathematica - 小木虫论坛-学术科研互动平台...
  6. jQuery获取指定ul下的li
  7. 【Guacamole中文文档】二、用户指南 —— 1.实现和架构
  8. 著名物理学家张首晟2018年12月1日去世,享年 55 岁。此事件被美国当地警方认为是自杀,目前已经结案。
  9. 杰理之电流声/杂音【篇】
  10. 和阿里P7聊过后,才知道自己是个棒槌...