Spring简介
1.概念
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
IoC:Inversion of Control
AOP:Aspect Oriented Programming
2.Spring官方压缩包介绍
3.常用jar包说明
4.spring不同版本之间的新特性
Spring之Ioc
1.IoC与DI
1.1 IoC
控制反转,是一个概念,是一种思想。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。把对象的创建、初始化、销毁等工作交给spring容器来做。有spring容器控制对象的生命周期。
1.2 DI
依赖注入:Dependency Injection。依赖注入DI是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起的。
1.3 IoC与DI的关系
IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式之一是DI。
2.第一个IoC程序
2.1 导入jar包(基本7个)
2.2 创建spring配置文件
2.3 Bean的定义与注册
applicationContext.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的定义:以下配置相当于SomeService service = new SomeServiceImpl(); -->
<bean id="someServiceImpl" class="com.java.service.impl.SomeServiceImpl"></bean>
</beans>
2.4 从spring容器中获取Bean
package com.java.test;
import com.java.service.SomeService;
import com.java.service.impl.SomeServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SomeTest {
//该方式的缺点:当前测试类与service实现类耦合到一起
@Test
public void someTest(){
SomeService service = new SomeServiceImpl();
service.doSome();
}
//该方式的优点:实现了测试类与service实现类的解耦合
@Test
public void someTest01(){
//创建容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
SomeService service = ac.getBean("someServiceImpl", SomeService.class);
service.doSome();
}
}
3. ApplicationContext容器与BeanFactory容器的区别
@Test
public void someTest01(){
//创建容器对象,ApplicationContext容器初始化时,所有的容器中的bean创建完毕
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
SomeService service = ac.getBean("someServiceImpl", SomeService.class);
service.doSome();
}
@Test
public void someTest02(){
//创建容器对象,BeanFactory当调用getBean获取相应对象时,才创建对象
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
SomeService service = bf.getBean("someServiceImpl", SomeService.class);
service.doSome();
}
4. Bean的装配
Bean的装配,即Bean对象的创建
4.1 默认装配方式(构造方式)
<!-- bean的定义:以下配置相当于SomeService service = new SomeServiceImpl(); -->
<bean id="someServiceImpl" class="com.java.service.impl.SomeServiceImpl"></bean>
4.2 动态工厂Bean
public class ServiceFactory {
//实例工厂方式创建bean对象
public SomeService getSomeService(){
SomeService someService = new SomeServiceImpl();
return someService;
}
}
<!-- 注册工厂 -->
<bean id="serviceFactory" class="com.java.factory.ServiceFactory"></bean>
<!-- 从工厂中获取someServiceImpl的bean对象 -->
<bean id="someServiceImpl" factory-bean="serviceFactory" factory-method="getSomeService"></bean>
4.3 静态工厂Bean
public class ServiceFactory {
//静态工厂方式创建bean对象
public static SomeService getSomeService(){
SomeService someService = new SomeServiceImpl();
return someService;
}
}
<!-- 从工厂中获取someServiceImpl的bean对象 -->
<bean id="someServiceImpl" class="com.java.factory.ServiceFactory" factory-method="getSomeService"></bean>
5.Bean的作用域(单态模式singleton\原型模式prototype)
<!-- bean的定义:以下配置相当于SomeService service = new SomeServiceImpl(); -->
<bean id="someServiceImpl" class="com.java.service.impl.SomeServiceImpl" scope="prototype"></bean>
<bean id="someServiceImpl1" class="com.java.service.impl.SomeServiceImpl"></bean>
6.基于XML的DI
所谓注入,可理解为对象的属性赋值
6.1 设值注入
6.1.1 简单数据类型和引用数据类型注入
<!-- 设值方式DI -->
<bean id="star" class="com.java.pojo.Star">
<property name="name" value="贝克汉姆"></property>
<property name="age" value="39"></property>
<property name="partner" ref="partner"></property>
</bean>
<bean id="partner" class="com.java.pojo.Partner">
<property name="name" value="维多利亚"></property>
</bean>
6.1.2 集合属性注入(array、set、list、map、properties)
<!-- 设值方式DI -->
<bean id="partner1" class="com.java.pojo.Partner">
<property name="name" value="维多利亚"></property>
</bean>
<bean id="partner2" class="com.java.pojo.Partner">
<property name="name" value="布兰妮"></property>
</bean>
<bean id="someService" class="com.java.service.SomeService">
<property name="myArray">
<array>
<value>北京</value>
<value>上海</value>
</array>
</property>
<property name="mySet">
<set>
<ref bean="partner1"/>
<ref bean="partner2"/>
</set>
</property>
<property name="myList">
<list>
<value>男</value>
<value>女</value>
</list>
</property>
<property name="myMap">
<map>
<entry key="qq" value="123456"></entry>
<entry key="mobile" value="1300000"></entry>
</map>
</property>
<property name="myProps">
<props>
<prop key="兴趣">足球</prop>
<prop key="爱好">下棋</prop>
</props