Spring特点

  1. 方便解耦,简化开发
    通过IOC,将对象之间的依赖关系交由Spring进行控制,避免硬编码导致程序过度拟合
  2. 支持AOP
    通过Spring 提供AOP功能,实现面向切面编程的功能,让许多不容易用OOP实现的功能可以通过AOP轻松应付,如日志等
  3. 声明式事务支持
    通过Transactions模块,进行声明式事务管理,免于程序员对繁琐事务的管理。
  4. 支持Junit4单元测试功能
  5. 方便继承其他优秀框架
    支持Mybatis,Hibernate等框架

Spring架构

tp组织架构 组织架构mapping_xml

  1. DataAccess部分
    提供JDBC模块
    ORM模块——object relation mapping
    OXM模块——Object xml mapping
    JMS——Java消息服务
    Transactions——事务管理
    DataAccess这部分会用Mybatis来代替
  2. Web部分
    提供Servlet,WebSocket,Web,Portlet模块
    Web这部分最后会使用SpringMVC来代替
  3. 单项功能支持
    1) AOP功能
    2)Aspects功能
    3)Instrumentation功能
  4. Messaging功能
  5. 核心容器—Core Container
    Beans——Bean工厂与Bean装配
    Core——Spring-core 依赖注入IOC与DI的实现支持
    Context——Spring-context:Spring的context上下文即IOC容器
    SpEL——Spring 的EL表达式
  6. Test——继承Junit4进行单元测试

Spring中的IOC和DI

IOC-控制反转

软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
过程

DI-依赖注入
1.添加jar包
2.创建配置文件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">
</beans>

3.在配置文件中创建对象

<bean id="对象名" class="类的完整路径"> 
 	<property name="属性名" ref="对象的id值">
 	</property>
 </bean>

4.加载配置文件,获得对象

ApplicationContext app=new ClassPathXmlApplicationContext("spring.xml"); 
Users users=(Users)app.getBean("u1");

DI 注入方法

一种是通过set方法赋值,一种是使用构造方法赋值

  1. set注入值
基本属性类型值注入
<property  name = "name"  value = "jeck"/>
引用属性类型值注入
<property name = "car" ref  = "car"/>
  1. 构造注入
    通过name属性,按照参数名赋值
public Person(String name,Car car){
	this.name = name;
	this.car = car;
	System.out.println("Person的有参构造"+name + car);
}
<bean name = "person" class = "com.xzk.spring.bean.Person">
		<constructor-arg  name = "name" value = "rose"/>
		<constructor-arg name = "car" ref = "car"/>
</bean>

通过index属性,按照参数索引注入

<bean name = "person" class = "com.xzk.spring.bean.Person">
		<constructor-arg  name = "name" value = "rose" index = "0"/>
		<constructor-arg name = "car" ref = "car" index = "1"/>
</bean>
  1. 注解注入
    添加在类名上的
@Component("对象名")  //component是不是MVC架构下,使用的,是Service Controller Repository 的父注解
@Service("person")	//	service层
@Controller("person")	//控制的Controller层
@Repository("person") //持久化的dao层
@Scope(scopeNmae="singleton") //单例对象
@Scope(scopeName="prototype") // 多例对象

添加在属性上

@Value("属性值")
private String name;

@Autowired // 如果一个接口类型同时又两个实现类,则会报错,此时需用
@Qualifier("bean name")
private Car car;

// @Resource 是java的注释,但是Spring框架支持,@Resource指定注入哪个名称的对象
@Resource(name = "对象名")  == @Autowired + @Qualifier("name")
private Car car;

添加在方法上
@postConstruct //等价于init-method属性
 @PreDestroy // 等价于destroy-method属性