Spring4.0学习笔记(1) —— 基础知识
1、基本定义
IOC: 其思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了
IOC之后,容器主动将资源推送给它所管理的组件,组件索要做的只是选择一种合适的方式接受资源,这种行为也被称为查找的被动形式。
DI: IOC 的另一种表述方式,即组件以一些预定好的方式(例如Action中属性的setter方法)接受来自容器的资源注入
2、原理

3、Bean的配置
Bean:通过全类名(反射)、通过工厂方法(静态工厂方法&实例工厂方法)、FactoryBean
IOC容器:BeanFactory& ApplicationContext 概述
依赖注入的方式:属性注入、构造器注入
3.1、IOC容器的实现
Spring提供了两种类型的IOC容器
BeanFactory : IOC容器的基本实现,面向Spring本身。
ApplicationContext : 提供了 更多的高级特性,是BeanFactory的子接口,面向开发者。
主要实现类 {ClassPathXmlApplicationContext : 从类路径下加载文件,FileSystemXmlApplicationContext : 从文件系统中加载配置文件}
//1、创建spring 的 ioc 容器,配置文件在类路径下
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //2、ioc 容器中获取 Bean实例,利用id 定位到IOC容器中的bean
HelloWorld helloWorld = (HelloWorld)ctx.getBean("helloWorld");
<bean id="helloWorld" class="com.spring.beans.HelloWorld">
<property name="name" value="spring"></property>
</bean>
3.2、依赖注入的方式
3.2.1 属性注入<property>
通过setter方法注入Bean的属性值或者依赖的对象
3.2.2 构造器注入<constructor-arg>
通过构造方法注入Bean的属性值或依赖的对象,保证了Bean实例在实例化后就可以使用<constructor-arg>
4、bean属性值详解
4.1、出现特殊字符时:
<constructor-arg>
<value><![CDATA[<Audi>]]></value>
</constructor-arg>
4.2、ref 建立bean之间的引用关系 :
<bean id="car_ref" class="com.spring.beans.Car">
<constructor-arg>
<value><![CDATA[<Audi>]]></value>
</constructor-arg>
<constructor-arg value="ShangHai"></constructor-arg>
<constructor-arg value="300000"></constructor-arg>
</bean> <bean id="person" class="com.spring.beans.Person">
<property name="name" value="Tom"></property>
<property name="age" value="24"></property>
<property name="car" ref="car_ref"></property>
</bean>
4.3、内部bean,无法被外部bean引用
<bean id="person" class="com.spring.beans.Person">
<property name="name" value="Tom"></property>
<property name="age" value="24"></property>
<property name="car">
<bean class="com.spring.beans.Car">
<constructor-arg value="Ford"></constructor-arg>
<constructor-arg value="ChangAn"></constructor-arg>
<constructor-arg value="20000"></constructor-arg>
</bean>
</property>
</bean>
4.4、null值和级联属性
null值
<bean id="person2" class="com.spring.beans.Person">
<constructor-arg value="jerry"></constructor-arg>
<constructor-arg value="23"></constructor-arg>
<constructor-arg><null/></constructor-arg>
</bean>
级联属性
<bean id="car_ref" class="com.spring.beans.Car">
<constructor-arg>
<value><![CDATA[<Audi>]]></value>
</constructor-arg>
<constructor-arg value="ShangHai"></constructor-arg>
<constructor-arg value="300000"></constructor-arg>
</bean> <bean id="person2" class="com.spring.beans.Person">
<constructor-arg value="jerry"></constructor-arg>
<constructor-arg value="23"></constructor-arg>
<constructor-arg ref="car_ref"></constructor-arg>
//必须在bean文件中,定义maxSpeed的set方法【属性注入!】
<property name="car.maxSpeed"></property>
</bean>
集合属性
<bean id="car_ref" class="com.spring.beans.collections.Car">
<constructor-arg>
<value><![CDATA[<Audi>]]></value>
</constructor-arg>
<constructor-arg value="ShangHai"></constructor-arg>
<constructor-arg value="300000"></constructor-arg>
</bean> <bean id="car2_ref" class="com.spring.beans.collections.Car">
<constructor-arg value="Ford"></constructor-arg>
<constructor-arg value="beijing"></constructor-arg>
<constructor-arg value="20000"></constructor-arg>
</bean> <bean id="car3_ref" class="com.spring.beans.collections.Car">
<constructor-arg value="Honda"></constructor-arg>
<constructor-arg value="beijing"></constructor-arg>
<constructor-arg value="120000"></constructor-arg>
</bean> <!-- 测试如何配置集合属性 -->
<bean id="testCollections" class="com.spring.beans.collections.Person" >
<property name="name" value="Mike"></property>
<property name="age" value="27"></property>
<property name="cars">
<list>
<ref bean="car_ref"></ref>
<ref bean="car2_ref"></ref>
<ref bean="car3_ref"></ref>
</list>
</property>
</bean>
package com.spring.beans.collections;
import java.util.List;
public class Person {
    private String name;
    private int age;
    private List<Car> cars;
    public Person(String name, int age, List<Car> cars) {
        super();
        this.name = name;
        this.age = age;
        this.cars = cars;
    }
    @Override
    public String toString() {
        return "Person [age=" + age + ", cars=" + getCarStr(cars) + ", name=" + name + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person() {
    }
    public List<Car> getCars() {
        return cars;
    }
    public void setCars(List<Car> cars) {
        this.cars = cars;
    }
    //获取汽车
    public String getCarStr(List<Car> cars)
    {
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        for(Car car :cars){
            sb.append("brand: "+car.getBrand()+ "corp:"+ car.getCorp() +"maxSpeed:" +car.getMaxSpeed()+"price:"+car.getPrice()+"\n");
        }
        sb.append("]");
        return sb.toString();
    }
}
package com.spring.beans.collections;
public class Car {
    private String brand;
    private String corp;
    private String price;
    private String maxSpeed;
    //通过构造器注入
    public Car(String brand, String corp, String price) {
        super();
        this.brand = brand;
        this.corp = corp;
        this.price = price;
    }
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getCorp() {
        return corp;
    }
    public void setCorp(String corp) {
        this.corp = corp;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public String getMaxSpeed() {
        return maxSpeed;
    }
    public void setMaxSpeed(String maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
}
集合属性-2 【map】
<bean id="testMap" class="com.spring.beans.collections.newPerson">
<property name="name" value="java"></property>
<property name="age" value="30"></property>
<property name="cars">
<map>
<entry key="A1" value-ref="car_ref"></entry>
<entry key="A2" value-ref="car2_ref"></entry>
<entry key="A3" value-ref="car3_ref"></entry>
</map>
</property>
</bean>
集合属性-3【properties】
<bean id="dataSource" class="com.spring.beans.collections.DataSource">
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="jdbcUrl">jdbc:mysql:///test</prop>
<prop key="driverClass">com.mysql.jdbc.drivce</prop>
</props>
</property>
</bean>
p标签
<bean id="person5" class="com.spring.beans.collections.Person"
p:name="queen" p:age="30" p:cars-ref="cars"> </bean>
配置单例的集合bean
<!-- 配置单例的集合bean,以供多个bean进行引用,需要导入util命名空间 -->
<util:list id="cars">
<ref bean="car_ref"></ref>
<ref bean="car2_ref"></ref>
<ref bean="car3_ref"></ref>
</util:list> <bean id="person4" class="com.spring.beans.collections.Person">
<property name="name" value="jack"></property>
<property name="age" value="30"></property>
<property name="cars" ref="cars"></property>
</bean>
Spring4.0学习笔记(1) —— 基础知识的更多相关文章
- MyBatis:学习笔记(1)——基础知识
		
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
 - C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
		
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
 - Quartz学习笔记:基础知识
		
Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...
 - C#学习笔记(基础知识回顾)之值传递和引用传递
		
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
 - C#学习笔记(基础知识回顾)之值类型和引用类型
		
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
 - .net学习笔记---xml基础知识
		
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
 - Docker的学习笔记(一)基础知识
		
概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...
 - Scala学习笔记--正则表达式基础知识、如何在scala内使用
		
正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...
 - (C/C++学习笔记) 一. 基础知识
		
一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...
 
随机推荐
- android host
			
74.125.20.31 market.android.com 74.125.20.31 developer.android.com 74.125.20.31 android.googlesource ...
 - Milking Grid
			
poj2185:http://poj.org/problem?id=2185 题意:在一个字符矩阵中,找一个最小的字符子矩阵,使其能够覆盖整个矩阵. 题解:在KMP中i-next[i]是这能够覆盖这个 ...
 - [Android] 混音线程MixerThread
			
MixerThread是Android音频输出的核心部分,所有Android的音频都需要经过MixerThread进行混音后再输出到音频设备. MixerThread的继承关系如下: MixerThr ...
 - Android SharedPreferences登录记住密码
			
SharedPreferences是Android中存储简单数据的一个工具类.可以想象它是一个小小的Cookie,它通过用键值对的方式把简单 数据类型(boolean.int.float.long和S ...
 - mysql  安装截图
			
这里有3个选项, 1.Developer Machine(开发机器),个人用桌面工作站,占用最少的系统资源 2.Server Machine(服务器),MySQL服务器可以同其它应用程序一起运行,例如 ...
 - [Design Pattern] Factory Pattern 简单案例
			
Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...
 - html5中input新增type值的使用
			
二狗在最近的项目以html5和webapp为主,并接触到了input新增type值的使用,下面就把这些玩意一一以实例列举出来 一:type = date:定义日期:年-月-日 input type=& ...
 - oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
			
LAG()和LEAD()统计函数能够在一次查询中取出同一字段的前N行的数据和后N行的值.这样的操作能够使用对同样表的表连接来实现,只是使用LAG和 LEAD有更高的效率.下面整理的LAG()和LEAD ...
 - 使用glob()查找文件(转)
			
大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来查找文件,请看下面的用法: ...
 - 线程在WPF中的使用
			
项目中可能会有这样的需求,一直获取新的某个数据信息,但仍不影响其他的操作功能,这时就用到了线程,获取新数据放到线程中操作,对其他操作不产生影响,下面就以随机获取数组中项为例解说WPF中使用线程这一实例 ...