1、首先对Spring下一个定义:
1:spring是一个容器。用于管理所有在java中声明的类。在spring中,spring所管理的所有类,叫springBean。
(只要是被spring的管理类,都叫做springbean)
2:spring是一个框架:
Aop/di框架 – 面向切面的编程。Di(dependences injection) – 依赖注入框架。
2、Spring容器介绍
Spring的容器的特点,是通过读取spring的配置文件,实例化配置的所有类。
Spring的容器有两个:
类 | 功能 |
Org.springframework.BeanFactory(接口) | 根容器的类,所有的spring的容器都必须是它的子类。 The root interface for accessing a Spring bean container. |
Org…..ApplicationContext (接口) | 上下文容器 1:是BeanFactory的子类。 2:比BeanFacotry更强大。 3:在开发时,大多都使用这个类。和它的子类:
|
ClasspathXmlApplicationContext (具体类) | 是ApplicationContext的子类。 用于从classpath根目录下,读取spring的配置文件。 |
FileSystemXmlApplicationContext (具体类) | 是ApplicationContext的子类。 用于从文件系统中,读取spring的配置文件。 |
3、Spring两个容器区别:
BeanFactory – 当用户使用SpringBean时才会实例化某个类 – 懒加载
<?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.1.xsd">
<!-- 配置第一个spring的bean
spring会根据你的的配置,实例化这个类,且将这个类缓存到自己的容器中去
Person person = new Person();//spring通过反射来实例化这个类、
将这个类缓存到自己的容器中去
map.put("person",person);
-->
<bean id="person" class="cn.domain.Person"/>
</beans>
applicationContext –只要是容器实例化,就会实例化所有springBean – 非懒加载
4、Spring管理的bean的范围
scope | 说明 |
Prototype
每一次都返回一个新的实例 | 原型模式。 这个对象在Spring容器实例化时,不会实例化这个对象,而是只保存这个类的字节码。当用户每一次调用 getBean()方法时,每一次都返回一个新的实例。 |
Request | 在web环境下, 每一个request就是一个新的springBean实例 |
session | 在web环境下, 每一个session就返回一个新的springbean的实例。 |
Singleton – 默认的形式
| 在spring里,所有的spring的bean,默认都是单列的。 每一次调用getBean返回的都是同一个实例。 |
5、Spring装配
5.1通过SetXxxx属性注入值。
<bean id="person" class="cn.domain.Person">
<!-- #{3*7}:叫SpEL表达式,就是在spring的配置文件中可以使用的表达式语言 -->
<property name="age" value="#{3*7}"/>
<property name="married">
<value>true</value>
</property>
<property name="name" value="张三"></property>
</bean>
运行结果:
这个类被实例化了:4650724
Person [name=张三, age=21, married=true]
以上注入8大数据类型+String都可以。
5.2注入集合类
<!--Map-->
<property name="mpp">
<map>
<entry key="name" value="Jack"></entry>
<entry key="addr">
<value>北京中国</value>
</entry>
</map>
</property>
<!--list-->
<property name="lt">
<list>
<value>张三</value>
<value>李四</value>
</list>
</property>
<!--Set-->
<property name="set">
<set>
<value>kkkkkk</value>
</set>
</property>
<!--数组-->
<property name="SSS">
<array>
<value>DDD</value>
</array>
</property>
<property name="DD">
<!-- properties -->
<props>
<prop key="name">Jack..</prop>
</props>
</property>
6.1构造器注入---通过构造器设置值
public Person(String name, Integer age, Boolean married) {
this.name = name;
this.age = age;
this.married = married;
System.err.println("这是有参数的构造。。");
}
<bean id="person" class="cn.domain.Person">
<constructor-arg value="Jack"></constructor-arg>
<constructor-arg value="89"/>
<constructor-arg value="false"></constructor-arg>
</bean>
6.2注入引用
1:用ref引用
<bean id="person" class="cn.domain.Person">
<!-- 引用另一个Spring的Bean -->
<property name="addr" ref="addr"></property>
</bean>
<!-- 声明addr的实例,没有前后的关系 -->
<bean id="addr" class="cn.domain.Addr">
<property name="tel" value="189373844"/>
<property name="zip" value="中国山东"></property>
</bean>
2、嵌入式的声明
<bean id="person" class="cn.domain.Person">
<!-- 引用另一个Spring的Bean -->
<property name="addr">
<bean class="cn.domain.Addr">
<property name="tel" value="189373844" />
<property name="zip" value="中国山东"></property>
</bean>
</property>
</bean>
6.3自动的注入
1、byname
<bean id="person" class="cn.domain.Person" autowire="byName">
</bean>
<!-- 因为在person类中有 一个setAddr所有找名称为addr的bean -->
<bean id="addr" class="cn.domain.Addr">
<property name="tel" value="189373844" />
<property name="zip" value="中国山东"></property>
</bean>
2、byType ---如果是byType则必须要有一个唯一的对象
3、constructotr-----有构造器,先根据参数名称,如果没有参数名称, 则按照byType
建议不用自动注入,隐藏了注入的细节,会带来性能的降低。
7.1Spring的初始化方法和销毁方法
配置通过静态的工厂方法来实例化这个类:
public class Car {
private Car() {
System.err.println("2:new Car...");
}
public static Car instacne(){
System.err.println("1:静态的方法。。。。");
return new Car();
}
public void init(){
System.err.println("3:初始化完成了..");
}
public void destory(){
System.err.println("4:销毁了..");
}
}
bean class="cn.domain.Car" factory-method="instacne" ></bean>
下面一篇文章将专门介绍Spring的生命周期