• 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. 搭建本地YUM仓库

    YUM介绍 yum(yellow dog updater modified)为多个Linux发行版的软件包管理工具,Redhat RHEL CentOS Fedora YUM主要用于自动安装,升级rp ...

  2. MFC unicode字符集与多字节字符集 问题之彻底终结!

    Unicode 和多字节字符集 (MBCS) 支持 Visual Studio .NET 2003   有些国际市场以大字符集来使用日文和中文等语言.为了支持这些市场的编程,Microsoft 基础类 ...

  3. srvany.exe读取配置文件问题

    使用instsrv.exe与srvany.exe将自己的程序弄成免登录系统就能自动启动了,然而程序运行需要读取相应的配置文件,所以程序是跑起来了,但不能正常使用,找了很久终于找到了答案.在之前的基础上 ...

  4. 2016/09/27 Hadoop Yarn

    1.1 YARN基本架构     YARN是Hadoop2.0中的资源管理系统,它的基本设计思想是将MRv1中的JobTracker拆分成了两个独立的服务:一个全局的资源管理器ResourceMana ...

  5. AI行业精选日报_人工智能(12·20)

    IDC:中国智能家居市场2020年十大预测 12 月 20 日消息,「IDC 咨询」官方公众号发布「中国智能家居 2020 年十大预测」.具体内容如下:互联平台加速整合.语音助手广泛赋能.智能电视显著 ...

  6. cmake常用命令总结

    最近研究了下cmake,总结了一些常用命令,方便以后快速查找. project(projectname [CXX] [C] [Java]): 设置工程名. set(VAR [VALUE] [CACHE ...

  7. 从AlexNet(2012)开始

    目录 写在前面 网络结构 创新点 其他有意思的点 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 本文重点在于回顾深度神经网络在CV领域的First Blood--A ...

  8. python 多线程编程之进程和线程基础概念

    多线程编程 在多线程(multithreaded,MT)出现之前,计算机程序的执行都是由单个步骤序列组成的,该序列组合在主机的CPU中按照同步顺序执行.无论是任务本身需要按照步骤顺序执行,还是整个过程 ...

  9. orleans 2.0 进阶之自定义持久化储存

    一丶简单介绍下目录结构和项目依赖,如图 二丶主要核心自定义代码 1. 添加自定义实现类 CustomProvider public class CustomProvider : IGrainStora ...

  10. 对JDK动态代理的模拟实现

    对JDK动态代理的模拟 动态代理在JDK中的实现: IProducer proxyProduec = (IProducer)Proxy.newProxyInstance(producer.getCla ...