1.准备工作

  下载Spring:http://repo.spring.io/libs-release-local/org/springframework/spring/

    

   选择需要下载的版本

    选择dist.zip结尾的下载即可。

   下载完后将其解压,进入libs文件夹,libs文件夹下有很多jar文件.

   目前阶段只需要将 spring-core-x.x.x.RELEASE.jar 、spring-beans-x.x.x.RELEASE.jar

    spring-context-x.x.x.RELEASE.jar、 spring-expression-x.x.x.RELEASE.jar导入到项目中。

   要是想全部导入也可以。

   下载commons-Logging.jar

   下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi

   点击下载。

   将解压后的commons-logging.jar导入项目。

    

2.核心容器(BeanFactory,ApplicationContext)

  BeanFactory:BeanFactory是org.springframework.beans.facytory . BeanFactory 接口定义.是基础的IOC(控制反转)容器。

  控制反转即控制权发生了反转,例如创建一个对象,一般都是我们通过new来创建,而发生控制反转后创建由

  容器来创建(容器会根据配置文件进行创建),不用我们显示的new一个对象。

  可以将BeanFactory看作一个管理bena的工厂类,负责初始化等操作。

   

  ApplicationContext:ApplicationContext是BeanFactory的子接口,除了包含BeanFactory中所有功能外还包含

  国际化、资源访问、事件传播等方面的支持。

  ApplicationContext实例创建方法:

    2.1.ClassPathXmlApplication

    ClasspathXmlApplication会从类路径中寻找指定的xml文件并加载。(一般采用这种方式)

ApplicationContext applicationContext = new ClassPathApplicationContext("xxx.xml");

  

    2.2.FileSystemXmlApplicationContext

    FileSystemXmlApplication是指定绝对路径来进行查找,这种方式不灵活使用较少。

ApplicationContext ac = new FileSystemXmlApplicationContext("C:text/.../xxx.xml");

    ApplicationContext中有一个方法:Object getBean(String name);通过name(xml文件中的id属性)获取指定类。

  2.3 小例子

  首先创建一个web项目。

  2.3.1我们创建一个Animal接口,并定义一个say()方法。

public interface Animal {
public void say();
}

  

  2.3.2再创建一个类Cat实现Animal接口

public class Cat implements Animal{

    @Override
public void say() {
// TODO Auto-generated method stub
System.out.println("喵喵喵");
}
}

  

  2.3.3在src目录下创建beans.xml文件(一般命名为beans.xml,也有叫applicatinContex.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-4.3.xsd">
<!-- 一将指定类配置给 Spring,让 Spring 创建其对象的实例一 -->
<bean id = "cat" class = "com.ioc.Cat"> </bean> <!-- 设置id及对应类 -->
</beans>

  2.3.4测试IOC容器实例化对象

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
Animal cat = (Animal)ac.getBean("cat");//cat为配置文件中id属性的值,通过配置文件的id获取对应类
cat.say();
}
}
运行结果:
二月 09, 2019 5:07:47 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@46f7f36a: startup date [Sat Feb 09 17:07:47 CST 2019]; root of context hierarchy
二月 09, 2019 5:07:47 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans.xml]
喵喵喵

上例我们没有显示的new,而是通过容器创建了一个对象,控制发生了反转从自己控制变成了容器控制。

容器创建时默认是单例模式,即每次获取的都是一个对象。要想每次获取的对象都是不同的对象可按如下设置:

<bean id = "cat" class = "com.ioc.Cat" scope = "prototype”> </bean>

3.依赖注入

  问题引出:假如当前有一个Person类,person要养宠物,于是我们可以这样写;

public Person{
Dog dog;
Cat cat;
...
...
}

person每想养一个宠物就要修改代码为其添加一个宠物,这样很麻烦,而且扩展性解耦性都不好。

于是我们首先可以将Dog、Cat改为Animal,这样比之前好一些了,所有宠物都是Animal。

但这样在需求有变时还是需要修改一些内容,这样的确比之前的想法方便了一些,但有没有更方便的方法呢?

如果Animal的属性是通过.xml文件中的设置来进行赋值的呢?这样是不是更方便了,当需求改变时在xml修改即可。

我们就在原有例子的基础上来进行这个实验:

  3.1创建一个Dog类,实现Animal接口

public class Dog implements Animal{

    @Override
public void say() {
// TODO Auto-generated method stub
System.out.println("汪汪汪");
}
}

  

  3.2创建Person类

public class Person {
private Animal animal;//养的宠物 public Animal getAnimal() {
return animal;
} public void setAnimal(Animal animal) {//set方法一定要有
this.animal = animal;
} public void palyAnimal() {//设置一个玩宠物的方法
animal.say();//玩宠物宠物发出来对应的声音
}
}

  3.3beans.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-4.3.xsd">
<!-- 一将指定类配置给 Spring,让 Spring 创建其对象的实例一 -->
<bean id = "cat" class = "com.ioc.Cat"> </bean>
<bean id = "person" class = "com.ioc.Person"> <!--设置Person类及其对应id-->
<property name="animal" ref="cat"></property> <!--设置属性 name为属性名 ref为将bean定义的实例注入到属性(id = cat 注入)-->
</bean>
</beans>

  3.4测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person)ac.getBean("person");
person.palyAnimal();
}
}
运行结果:
二月 09, 2019 5:31:01 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@46f7f36a: startup date [Sat Feb 09 17:31:01 CST 2019]; root of context hierarchy
二月 09, 2019 5:31:01 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans.xml]
喵喵喵

如果不想养猫了,只需将beans.xml文件中的ref修改下即可。

1.1(Spring学习笔记)Spring基础(BeanFactory、ApplicationContext 、依赖注入)的更多相关文章

  1. Spring学习笔记--spring+mybatis集成

    前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...

  2. Spring学习笔记—Spring之旅

    1.Spring简介     Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...

  3. Spring 学习笔记 IoC 基础

    Spring IoC Ioc 是什么 IoC -- Inversion of Control(控制反转)什么是控制?什么是反转? 控制反转了什么? 在很早之前写项目不用 Spring 的时候,都是在 ...

  4. Spring学习笔记1——基础知识 (转)

    1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...

  5. Spring学习笔记1——基础知识

    1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...

  6. Spring学习笔记之基础、IOC、DI(1)

    0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 application ...

  7. Spring学习笔记--Spring IOC

    沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...

  8. Spring学习笔记--Spring配置文件和依赖注入

    Spring配置文件 1.alias:设置别名,为bean设置别名,并且可以设置多个别名; <!-- 设置别名 --> <alias name="user" al ...

  9. Spring学习笔记-Spring之旅-01

    使用Spring简化JAVA开发 Spring的四种关键策略: ●基于POJO的轻量级和最小侵入式编程: ●通过依赖注入(DI)和面向接口实现松耦合: ●基于切面(AOP)和惯例进行声明式编程. ●通 ...

  10. Spring学习笔记——Spring依赖注入原理分析

    我们知道Spring的依赖注入有四种方式,各自是get/set方法注入.构造器注入.静态工厂方法注入.实例工厂方法注入 以下我们先分析下这几种注入方式 1.get/set方法注入 public cla ...

随机推荐

  1. elementUi 组件--el-table

    [需求]在element中,将表格中的数据进行处理,然后渲染出来.例如,将数据保留小数点后两位显示. [知识点]formatter:用来格式化内容 [分析]在element 的table中,实现的过程 ...

  2. Android 网络编程--上传文件及相应的参数到服务器

    之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...

  3. HDU5748---(记录每个元素的 最长上升子序列 nlogn)

    分析: 给一个序列,求出每个位置结尾的最长上升子序列 O(n^2) 超时 #include "cstdio" #include "algorithm" #def ...

  4. vivo面试经验4(linux基本操作,最基本,必须得会!!)

    操作linux通过xshell进行连接: 基本操作介绍 1.shutdown -h 关机 shutdown -r 重启 2.mkdir aaa 新建目录aaa rmdir aaa 删除目录aaa 3. ...

  5. JAVA程序打包成exe文件详细图解

    我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: eclipse ...

  6. 【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈

    这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的 ...

  7. 汕头市队赛 SRM 06 A 撕书

    A 撕书 SRM 06 背景&&描述 游行寺汀正在杀书.         书总共有n页,每页都可以看作是一个小写英文字母,所以我们可以把书看成长度为n的字符串s.         琉璃 ...

  8. 网络流专题练习Day1

    04/16 一共做了8道题 首先网络流目前自己掌握的只有最大流Dinic算法和普通的费用流算法 有空还要去学习一下SAP和ZKW费用流(flag早早立在前面以后看到都有动力... 但网络流的算法个人认 ...

  9. Kubernetes : 多节点 k8s 集群实践

    说明: 本文参考 『 Kubernetes 权威指南 』 第一章的案例. 需要说明的是, 这本书里有很多描述的东西和实践的案例不吻合. Kubernets 集群架构 架构图 Server List 节 ...

  10. bzoj 1433 二分图匹配

    裸地匈牙利或者最大流,直接匹配就行了 需要注意的是(我就没注意细节WA了好多次...) 每个人和自己之间的边是0,但是应该是1 不是在校生是没有床的.... /******************** ...