• Spring是以Ioc和Aop为内核,提供了表现层spring MVC 和持久层Spring JDBC等众多应用技术,还能整合开源世界众多著名的第三方框架和类库,成为使用最多的JavaEE企业应用开源框架。
  • Spring的优势:
  1. 方便解耦,简化开发;
  2. Aop编程的支持;
  3. 声明式事务的支持;
  4. 方便程序的测试;
  5. 方便集成各种优秀框架;
  6. 降低JavaEE  API的使用难度;
  7. Spring源码是经典学习的范例;
  • Spring的体系结构:全部基于核心容器Core Container

  • 编译时期依赖:JDBC在没有导依赖包时即mysql驱动时,将无法编译。即注册驱动时找不到com.mysql.jdbc.Driver()依赖包;
  • 耦合:程序间的依赖关系,其中包括:①类之间的依赖;②方法之间的依赖;
  • 解耦:降低程序间的依赖关系,实际开发中应该做到,编译时期不依赖,运行时才依赖;
  • 解耦的思路:
  1. 使用反射来创建对象,而避免使用new关键字,即Class.forName(“全限定类名”)。
  2. 通过读取配置文件来获取要创建对象的全类名,而不是直接写死,然后再通过反射来创建对象。
  • 解耦的方式:

    方式一:使用工程模式解耦:(创建Bean对象的工厂,用来创建Service和dao对象的)

    1.定义一个配置文件bean.properties配置service和dao层的全类名,

      配置的内容:

      accountService=com.itheima.service.impl.IAccountServiceImpl
      accountDao=com.itheima.dao.impl.IAccountImpl

    2.通过读取配置文件的内容,反射创建对象

    BeanFactory工厂类:

 import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; /**
* 创建Bean对象的工厂
* Bean:在计算机英语中,有可重用组件的含义
*
* 它就是创建service和dao对象的
*
* 1.定义一个配置文件配置service和dao
* 配置的内容:唯一标志=全限定类名(key=value形式)
* 2.通过读取配置文件当中的内容,反射创建对象
*/
public class BeanFactory {
//定义一个properties对象
private static Properties properties = new Properties(); //定义一个map,用于存储我们创建的对象,称之为容器
private static Map<String,Object> beans; //使用静态代码块为Properties对象赋值
static { try {
//获取properties文件的流对象
InputStream is = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
properties.load(is);
beans = new HashMap<String, Object>();
//取出配置文件中所有的key
Enumeration keys = properties.keys();
//遍历枚举
while (keys.hasMoreElements()){
//取出每个key
String key = keys.nextElement().toString();
//根据key获取value
String beanPath = properties.getProperty(key);
//反射创建对象
Object value = Class.forName(beanPath).newInstance();
//把key和value存入容器之中
beans.put(key,value);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} /**
* 根据bean的名称获取bean对象,此时获取的对象为单例对象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}
}

   *使用工厂模式创建出来的对象,使用Map集合作为容器去存储之后,创建出来的为单例对象,是我们需要的。(单例对象:只被创建一次,类中的成员只会初始化一次,效率高,而且一般没有成员变量的定义,如果要定义变量也是在方                法内部。多例对象:每次都是创建一个新的对象,执行效率无单例对象高,从而类中的成员每次都会被初始化)

   方式二:使用Spring的Ioc控制反转(把创建对象的权利交给框架,是框架的重要特征,它包括依赖注入(DI)和依赖查找(DL))

   Spring的入门

   获取核心容器对象以及如何根据id获取bean对象的方式

/**
* 模拟一个表现层,用于调用业务层
*/
public class Client { /**
* 获取springIoc的核心容器,并且根据id获取对象
*
* ApplicationContext常用的三个实现类
* ClassPathXmlApplicationContext,它可以加载类路径下的配置文件,要求配置文件必须在类路径下,不在的话加载不了(更常用)
* FileSystemXmlApplicationContext,它可以加载磁盘任意路径下的配置文件,但要有访问权限
*
*
*
* AnnotationConfigApplicationContext,它是用于读取注解创建容器的
* @param args
*/
public static void main(String[] args) { //1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id查询获取bean对象
IAccountService accountService = ac.getBean("accountService", IAccountService.class);
IAccountDao accountDao = (IAccountDao) ac.getBean("accountDao");
System.out.println(accountService);
System.out.println(accountDao);
}
}

   bean.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">
<!--把对象的创建交给spring来管理 id为所要创建对象的名称 class为创建new对象的全限定类名-->
<bean id="accountDao" class="com.itheima.dao.impl.IAccountImpl"></bean> <bean id="accountService" class="com.itheima.service.impl.IAccountServiceImpl"></bean>
</beans>
  • 关于核心容器的两个接口引发的问题:

    ApplicationContetx:在创建核心容器时,创建对象采取的策略是采用立即加载的方式,也就是说,一读取完配置文件马上就创建配置文件中配置对象(单例对象)。

    BeanFactory:在创建核心容器时,创建对象采取的策略是采用延迟加载的方式,也就是说,什么时候根据id获取对象了,什么时候才真正创建对象(多例对象)。

  • 创建bean对象的三种方式:
<!--创建bean的三种方式-->

    <!--
第一种方式:使用默认构造函数进行创建,若无默认构造函数,则无法创建
-->
<bean id="accountService" class="com.itheima.service.impl.IAccountServiceImpl" scope="prototype"
init-method="init" destroy-method="destroy">
</bean> <!--
第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象并且存入spring容器)
-->
<!--<bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>-->
<!--<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>--> <!--
第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象并且存入spring容器)
-->
<!--<bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="getAccountService"></bean>-->
  • bean的作用范围:<bean>的scope属性取值:singleton-单例(默认值),prototype-多例,request:    web中的request请求范围,session:    web中的会话范围,global-session:   集群环境会话范围(全局会话)
  • bean的生命周期:
  1. 单例对象生命周期与核心容器相同;
  2. 多例对象在我们使用对象时被spring框架为我们创建,对象只要在使用过程中就一直活着,当对象长时间不用时由JVM虚拟机垃圾回收。
  • Spring中的依赖注入就是为了维护依赖关系,参考bean.xml

    bean.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"> <!--使用构造函数注入 -->
<bean id="accountService" class="com.itheima.service.impl.IAccountServiceImpl">
<constructor-arg name="name" value="test"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="date" ref="now"></constructor-arg>
</bean>

<!--配置一个日期对象 Date类型不为基本数据类型,所以要先反射创建Date对象存入Ioc核心容器,之后再用ref属性接收-->
<bean id="now" class="java.util.Date"></bean> <!--使用set方法注入 比较常用的方式-->
<bean id="accountService1" class="com.itheima.service.impl.IAccountServiceImpl1">
<property name="name" value="test1"></property>
<property name="age" value="19"/>
<property name="date" ref="now"/>
</bean>

<!--复杂类型的注入/集合类型的注入 结构相同标签可以互换,List结构集合:list,array,set标签可以通用,Map结构集合:map,props标签可以通用-->
<bean id="accountService2" class="com.itheima.service.impl.IAccountServiceImpl2">
<property name="myStrs">
<array>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</array>
</property>
<property name="myList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="mySet">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="testA" value="aaa"></entry>
<entry key="testB">
<value>bbb</value>
</entry>
</map>
</property>
<property name="myProperties">
<props>
<prop key="testC">ccc</prop>
<prop key="testD">ddd </prop>
</props>
</property>
</bean>
</beans>

Spring学习的第一天的更多相关文章

  1. Spring学习笔记第一篇——初识Spring

    1.简单介绍 spring的ioc底层是先配置xml文件,接着创建工厂,利用dom4j解析配置文件,最后通过反射完成.大概步骤差不多这样,这些具体代码spring帮你完成了.现在我们只需要配置xml和 ...

  2. Spring学习 Ioc篇(一 )

    一直以来忙于项目的开发,Spring虽然不用,一直想系统地学习一下,想看看它的源码,都没有时间,这段时间比较充裕,就索性先把Spring学习下,熟悉各个功能再去探究它内部的实现.就从Ioc篇开始学习. ...

  3. Spring学习总结

    spring是当前流行的一个框架.在学习spring之前当然的先准备一些jar包.可以在官网找找,(也可以留言,网盘分享): 基于IDEA环境学习. 第一天完成的任务: 1.使用spring框架输出一 ...

  4. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  5. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  6. spring学习(01)之IOC

    spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...

  7. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  8. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  9. spring boot实战(第一篇)第一个案例

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   spring boot实战(第一篇)第一个案例 前言 写在前面的话 一直想将spring boot相关内容写成一个系列的 ...

随机推荐

  1. BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 30078  Solved: 7908[Submit][ ...

  2. Zabbix通过与微信、钉钉整合实现实时告警

    abbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信.钉钉作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警 ...

  3. Dubbo学习系列之七(分布式订单ID方案)

    既然选择,就注定风雨兼程! 开始吧! 准备:Idea201902/JDK11/ZK3.5.5/Gradle5.4.1/RabbitMQ3.7.13/Mysql8.0.11/Lombok0.26/Erl ...

  4. idea实现简单热部署

    首先我们打开设置tomcat的页面         

  5. Java中通过代码得到int类型数值的二进制形式

    一.完整代码 public class BigInteger { int sing; byte[] val; public BigInteger(int val){ // 将传递的初始值,按位取值,存 ...

  6. LInux内核配置过程

    内核版本 linux 2.6.32.2 配置内核的过程 配置内核可以通过执行 make menuconfig 来进行,下面分析该命令的执行流程 执行该目标 %config: scripts_basic ...

  7. Python爬虫基础——re模块的提取和匹配

    re是Python的一个第三方库. 为了能更直观的看出re的效果,我们先新建一个HTML网页文件(可直接复制): index.html <!DOCTYPE html> <html l ...

  8. 常见面试题之*args

    这个地方理解即可,只是面试的时候会被问到,单独做了一下知识点的整理,不推荐使用. def self_max(a,b,c,d,e,f,g,h,k,x=1,y=3,z=4): #默认参数 print(a, ...

  9. 微信pc端和手机上传处理

    一.原因 在微信通过电脑版和浏览器登录时,调用了微信上传的接口,wx.getLocalImgData或返回失败. 没办法,只有处理当电脑上传时,使用ajaxuploadfile上传. 二.方法 fun ...

  10. 《CSAPP》实验二:二进制炸弹

    二进制炸弹是第三章<程序的机器级表示>的配套实验,这章主要介绍了x64汇编,包括:操作数的表示方式,数据传送指令,算术和逻辑指令,控制流跳转指令,过程(procedure)的实现与运行时栈 ...