bean的生命周期

实体类
//初始化
public void init(){System.out.println("--初始化--");
}//销毁
public void destory(){System.out.println("--销毁--");
}
<bean id="user" class="cn.yunhe.beans.User" init-method="init" destroy-method="destory"><property name="age" value="12"></property><property name="name" value="小张"></property>
</bean>
//测试
@Test
public void queryUsersTest() {//1、读取Spring配置文件ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//2、通过Spring容器创建实例对象User user = ac.getBean("user", User.class);System.out.println(user);//3、手动关闭容器ac.close();
}

注意:destroy-method方法只有在scope为singleton的时候才能生效
bean的作用域
scope属性定义对象的作用域 默认作用域(singleton单例)

​ singleton 单例

​ prototype 多例

​ request 请求范围内

​ global 全局作用域

<!--scope定义bean的作用域-->
<bean id="userDao" class="cn.yunhe.dao.impl.UserDaoImpl" scope="prototype"></bean>
//两者的地址一样则代表是同一个对象
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
IUserDao userDao = ac.getBean("userDao",UserDaoImpl.class);
System.out.println(userDao);
IUserDao userDao2 = ac.getBean("userDao",UserDaoImpl.class);
System.out.println(userDao2);

装配方式

1. xml装配

手动装配

​ 以无参构造+setter进行演示

<bean id="date" class="java.util.Date"></bean><bean id="custom" class="cn.yunhe.beans.Custom"><property name="num" value="11"></property><property name="name" value="小小"></property><property name="date" ref="date"></property><property name="arr"><array><value>关羽</value><value>刘备</value><value>张飞</value></array></property><property name="list"><list><value>关羽</value><value>刘备</value><value>张飞</value></list></property><property name="map"><map><entry><key><value>name</value></key><value>项羽</value></entry><entry><key><value>坐骑</value></key><value>乌骓</value></entry><entry><key><value>user</value></key><bean id="user" class="cn.yunhe.beans.User"></bean></entry></map></property></bean>

2.自动装配

​ autowire 自动装配
byType:按照类型装配,查找上下文中是否有指定类型的对象,有就注入成功,没有就失败,如果有查找多个也会注入失败

<bean id="userDao" class="cn.yunhe.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="cn.yunhe.service.impl.UserServiceImpl" autowire="byType">
</bean>
//byType类型时通过无参构造+setter方式构建对象IUserDao userDao ;public UserServiceImpl(){}public UserServiceImpl(IUserDao userDao){this.userDao = userDao;}public void setUserDao(IUserDao userDao){this.userDao = userDao;}
 byName:按照名称装配,根据名称在上下文中进行查找,找到就注入,找不到就失败
<!--修改dao的id值,测试byName的使用-->
<bean id="userDao" class="cn.yunhe.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="cn.yunhe.service.impl.UserServiceImpl" autowire="byName">
</bean>
constructor:按照构造器参数类型装配,,和byType一样,根据构造器的参数类型匹配

3.注解方式装配
​ @Component 通用注解 类似 当实在不知道该类是做什么的那就选这个
​ @Component("") 类似
​ @Controller/@Controller("") 表现层
​ @Service/@Service("") 业务层
​ @Repository/@Repository("") 数据层
​ @Scope("") 定义生命周期
自动注入:

1. @Autowired       //按类型注入2. 按名称注入1. @Autowired+@Qualifier("")2. @Resources(name="")          //使用该注解需要spring-aop.jar的支持

测试步骤:

1、给dao的实现类和service的实现类中分别加上@Component注解

@Component("userDao")
public class UserDaoImpl implements IUserDao {@Overridepublic List<User> queryUsers() {System.out.println("查询用户列表");return null;}
}@Component("userService")
public class UserServiceImpl implements IUserService {@AutowiredIUserDao userDao;@Overridepublic List<User> queryUsers() {return userDao.queryUsers();}}

2、在配置文件中配置扫描,指定要扫描的包

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置注解扫描  base-package:指定要扫描的包--><context:component-scan base-package="cn.yunhe.dao.impl,cn.yunhe.service.impl"></context:component-scan>
</beans>

Spring整合Junit

当前所用环境:spring5.x 需要junit的版本在4.12及以上

  1. 需要junit的jar包

  2. 需要Spring中的test包

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringJunitTest {public static void main(String[] args) {/*//读取容器ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//通过getBean来构建对象IUserService userSerivce = ac.getBean(IUserService.class);userSerivce.delUser();userSerivce.saveUser();*/}@AutowiredIUserService userSerivce;@Testpublic void test(){userSerivce.delUser();userSerivce.saveUser();}
}

spring入门第二讲 bean的生命周期 装配方式 Spring整合Junit相关推荐

  1. Spring容器启动流程+Bean的生命周期【附源码】

    如果对SpringIoc与Aop的源码感兴趣,可以访问参考:https://javadoop.com/,十分详细. 文章目录 Spring容器的启动全流程 Spring容器关闭流程 Bean 的生命周 ...

  2. Spring全家桶(四)Bean的生命周期

    十.Bean生命周期 10.1 Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,也允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进 ...

  3. 框架源码专题:springIOC的加载过程,bean的生命周期,结合spring源码分析

    文章目录 1.BeanFactory和ApplicationContext的区别? 2. IOC与 Bean的加载过程 ①:初始化容器DefaultListableBeanFactory ②:创建读取 ...

  4. Spring源码学习--Bean的生命周期

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  5. Spring学习总结1——bean的生命周期

    为什么80%的码农都做不了架构师?>>>    Spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao...),并且可以维护bea ...

  6. Spring源码分析——Bean的生命周期

    文章目录 说明 测试代码 说明 本文从源码的角度分析Spring中Bean的加载过程,本文使用的Spring版本为4.3.25.RELEASE 测试代码 测试代码如下,根据这段简单的测试代码,一步步跟 ...

  7. Spring高级应用之bean的生命周期

    简介: 在spring世界中,一切皆为bean,spring是面向bean编程的,bean也可以称为组件,是一个个java对象,多个组件间协调工作完成复杂的业务功能. 所以理解bean的生命周期,方便 ...

  8. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)

    五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 ,  指定初始化方法 init-method 方法​ 二 ,指定销毁 ...

  9. Spring:IOC容器Bean的生命周期的int和destro方法详解(4)

    Bean的生命周期 1)实例化Bean 对于BeanFactory容器,当客户向容器请求一个未初始化的bean时,或初始化bean的时候需要注入另一个未初始化的依赖时,容器就会调用createBean ...

最新文章

  1. 什么是A记录、MX记录、CNAME记录
  2. [转] 大规模服务设计部署经验谈
  3. XDP/eBPF — 架构设计
  4. LeetCode上删除链表末尾第N个节点算法——Remove Nth Node From End of List
  5. SpringBoot 中 @RequestBody的正确使用方法
  6. mongodb 怎样检测 安装成功 以及mongodb的一些增删改查命令
  7. 图文列表+富文本解析+折线图示例小程序模板
  8. python功能模块之psutil_1.python系统性能信息模块之psutil模块
  9. 最近30分钟合约市场爆仓842万美元
  10. 电动汽车燃料电池行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. 最火的开源项目及编程语言
  12. 此版本的visual studio无法打开下列项目_深度学习实现高精度钢琴曲转谱Piano transcription项目简明使用教程...
  13. 我只注视你全cg存档_科幻国漫持续推出,全CG动画星骸骑士首播,这一次吞噬星空输了...
  14. [P5172] Sum
  15. Android APP开发入门教程
  16. android xutils加密,xutils
  17. 电信网通竞合协议事件升级 内部文件泄露曝裂痕
  18. Ubuntu安装中文字体
  19. 9、攻守兼备的投资利器--可转债基金
  20. vs2013 与mysql的连接数据库_VS2013连接Mysql数据库的设置以及常见问题

热门文章

  1. XAI之SHAP:SHAP算法(How—每个特征如何重要/解释单个样本的预测)的简介(背景/思想/作用/原理/核心技术点/优缺点)、常用工具库、应用案例之详细攻略
  2. 数据挖掘常用的模型,具体有哪些?
  3. Jenkins在tomcat中启动配置nginx
  4. 2019.4.3拼多多笔试第一题
  5. JMeter进行并发测试
  6. 想要学美术找不到靠谱画室?美术加网校基础课程推荐~
  7. JPEG压缩算法的Python实现 -- 2 JPEG介绍
  8. 两级交流放大电路实验仿真
  9. 使用静态内部类单例模式创建自定义线程池
  10. python教程79--A4纸增值税电子发票合并打印