自动装配

我们进行对象注入的时候有两种方式

  • 1 set方法注入
<property name="uerDao" ref="userDao" />
  • 2 构造方法注入
<constructor-arg><ref bean="userDao"/></constructor-arg>

现在来学习自动注入,就是不需要指定以上两种方式

Autowire : 自动装配,两种取值

  1. 1 byName
  2. 2 byType

byName

byName是根据setter方法名字进行匹配,如果找不到,就不赋值

如 setUserDao 方法  就会找userDao,如果 bean的ID为 UserDao 也一样找不到,区分大小写

设置方式

<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl"></bean><bean id="userService" class="com.tledu.zrz.service.UserService"  autowire="byName"></bean>

byType

byType是根据setter方法的参数列表中的数据类型进行匹配,如果beans.xml中出现了多个相同类型的对象,就会报错

如 setUserDao(UserDao userDao) 方法  就会找UserDao,如果是接口,就找对应的实现类对象

设置方式

<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl"></bean><bean id="userService" class="com.tledu.zrz.service.UserService"  autowire="byType"></bean>

注意 : 使用自动装配,需要有公共的无参构造,虽然这里就算是私有化构造方法也依然可以创建对象,但是还是提供一个公共的比较好,万一别的框架需要呢

生命周期和迟加载

生命周期

之前servlet的生命周期

构造方法 -- init -- service -- destroy

那么spring创建对象的生命周期呢?

Spring中是没有init、service和destroy的,但是我们可以指定某个方法在创建完对象之后执行,某个方法在最后销毁的时候执行.

public void init(){System.out.println("init--------");}public void destroy(){System.out.println("destroy----------");}public UserService() {System.out.println("service构造方法");
}
<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl" ></bean><!--  init-method : 用于设置初始化的方法destory-method : 用于设置销毁资源的方法--><bean id="userService" class="com.tledu.zrz.service.UserService"  autowire="byName"   init-method="init" destroy-method="destroy"  ></bean>

Destroy之所以会执行,是因为我们默认创建对象的时候是单例模式

这个时候对象的生命周期会和Spring容器的生命周期绑定到一起,所以当我们销毁Spring容器的时候,会把所有的对象销毁,并自动调用destroy方法

但是如果我们把scope设置为prototype的时候,对象的生命周期就不会再和Spring容器绑定,销毁Spring容器的时候也就不会再执行该对象的destroy方法

比如

<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl" ></bean><!--  init-method : 用于设置初始化的方法destory-method : 用于设置销毁资源的方法--><bean id="userService" class="com.tledu.zrz.service.UserService"  scope="prototype"autowire="byName"   init-method="init" destroy-method="destroy"  >
</bean>

注意:scope为prototype类型时,我们容器只负责实例的创建,创建之后的生命周期由调用者负责。

迟加载

Spring容器默认是在执行

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

进行解析的时候创建对象并调用init,

如果我们不想让某个类在解析的时候就创建对象,而是用到的时候在创建对象的话,就需要设置迟加载

比如想要对userService迟加载可以这样设置

1.相关类

public UserDaoImpl(){System.out.println("Dao构造方法");
}
public UserService() {System.out.println("service构造方法");
}

2.配置

<bean name="userDao" class="com.tledu.zrz.dao.impl.UserDaoImpl" >
<bean id="userService" class="com.tledu.zrz.service.UserService"  scope="prototype"autowire="byName"   init-method="init" destroy-method="destroy" lazy-init="true"  >
</bean>

3.测试

@Testpublic void testAdd() {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
}

这时,不使用getBean方法就会报错,因为迟加载

通过结果可以看出,UserService的对象没有创建,那么什么时候创建呢?

UserService userService = (UserService) applicationContext.getBean("userService");

当调用getBean()的时候创建

或者是使用到这个对象的时候,比如我们获取userService对象,但是需要将userDao对象注入到userService中,那么这时候就算没有通过getBean(“userDao”) 而是通过getBean(“userService”)  也会创建userDao对象,因为在UserService中用到userDao了

为了使用方便,Spring还提出了default-lazy-init="true"

比如我们通过xml创建了10个对象,这10个对象都需要迟加载,那么每个bean标签中都设置lazr-init是比较麻烦的

于是我们可以在beans标签中添加default-lazy-init="true" 对所有的bean进行迟加载

default-lazy-init 和 lazy-init 可以同时存在,比如 10个对象中 只有一个不需要迟加载,那么可以使用 default-lazy-init = true 全部设置迟加载,然后再去指定的bean中添加 lazy-init=false 就可以

<?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"  default-lazy-init="true" >

IOC注解

XML和注解的区别

XML配置

优点有:

  1. XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译。

  2. 在处理大的业务量的时候,用XML配置应该更加好一些。因为XML更加清晰的表明了各个对象之间的关系,各个业务类之间的调用。同时spring的相关配置也能一目了然。

缺点有:

配置文件读取和解析需要花费一定的时间,配置文件过多的时候难以管理,无法对配置的正确性进行校验,增加了测试难度。

annotation配置

优点有:

  1. 在class文件中,可以降低维护成本,annotation的配置机制很明显简单

  2. 不需要第三方的解析工具,利用java反射技术就可以完成任务

  3. 编辑期可以验证正确性,查错变得容易

  4. 提高开发效率

缺点有:

  1. 如果需要对于annotation进行修改,那么要重新编译整个工程

  2. 业务类之间的关系不如XML配置那样容易把握。

  3. 如果在程序中annotation比较多,直接影响代码质量,对于代码的简洁度有一定的影响

Spring-SecondDay相关推荐

  1. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  2. html+spring boot简单的ajax数据传输实现

    本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...

  3. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

  4. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  5. Spring cloud 微服务docker容器化最佳实践

    Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...

  6. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  7. Strutsw2与Spring整合流程-简述

    1.      新建WEB工程: 2.      导入struts2开发包,和资源配置文件 ① globalMessages.properties ② struts.properties 3.     ...

  8. spring Bean自动装配

    spring Bean自动装配 自动装配是使用spring满足bean依赖的一种方式. spring会在应用上下文中为某个bean寻找其依赖的bean. spring自动装配需要从两个角度来实现,或者 ...

  9. spring IOC创建对象方式

    spring IOC创建对象方式 通过无参构造来创建 验证方法: 创建实体类: public class User {private String name;public User() {System ...

  10. 第一个spring程序

    第一个spring程序: 第一步:导入jar包. 新建maven项目: <dependency><groupId>org.springframework</groupId ...

最新文章

  1. 计算机视觉基础:图像处理(上)
  2. 解决VS2010链接错误:LINK fatal error LNK1123: 转换到 COFF
  3. c# datetime._C#| DateTime.Year属性与示例
  4. MySQL · 物理备份 · Percona XtraBackup 备份原理
  5. 母亲节html页面,[母亲节散分]模块化思想的重要性_html/css_WEB-ITnose
  6. 杭电2100Lovekey
  7. 你是码农还是Geek?
  8. python编程100个小程序-【Python精华】100个Python练手小程序
  9. C#网络编程----(一)获取IP地址
  10. 串级pid算法c语言实现,【开源】分享一个经典的串级PID算法,附源代码
  11. smith圆图重要性_smith圆图的理解
  12. 堆排序(Heapsort)-全网最详细
  13. Python网络爬虫——爬取视频网站源视频!
  14. Maven常用命令_飘云羽逸_新浪博客
  15. TypeScript等无法获取到歌曲播放的位置信息时,关于歌曲的续播
  16. R语言分组画条形图——qplot
  17. 500 内部服务器错误 解决方法
  18. C语言题目:打印华氏温度与摄氏温度对照表(for循环思路一)(有能力的同学老师们赞一下呀)
  19. もし私はあなたの恋人(1)作者xuanyang
  20. 对接钉钉消息通知_接入钉钉API发送企业消息

热门文章

  1. 2022爆火的AIGC,能给AI续命吗
  2. 奥塔在线:如何查看连接数?
  3. 应用数据流状态管理框架Redux简介、设计思想、核心概念及工作流
  4. 电大java语言程序设计_国家开放大学电大Java语言程序设计形考任务1答案
  5. cobalt strike安装
  6. CobaltStrike脚本
  7. 跨境自由职业者如何把境外的PayPal收款,方便快捷的汇入大陆的银联卡?
  8. C语言文字简单加密程序的实现
  9. 笨方法学python 41:来自 Percal 25 号行星的哥顿人 (Gothons)
  10. Pandas详细总结(20000字 完结)