spring框架总结

1、IOC和DI

IOC: 控制反转
即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建(spring)
DI: Dependency Injection 依赖注入
spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件.
实现IOC思想需要DI做支持
注入方式: 1.set方式注入 2.构造方法注入 3.字段注入
注入类型: 1.值类型注入 2.引用类型注入

1.降低组件之间的耦合度,实现软件各层之间的解耦.
2.可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工 控制事务,也不需要处理复杂的事务传播
3.容器提供单例模式支持,开发人员不需要自己编写实现代码.
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供众多的辅佐类,使这些类可以加快应用的开发.如jdbcTemplate HibernateTemplate

2、applicationContext & BeanFactory区别

BeanFactory接口

  1. spring的原始接口,针对原始接口的实现类功能较为单一
  2. BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象

ApplicationContext接口

  1. 每次容器启动时就会创建容器中配置的所有对象
  2. 提供了更多功能
  3. 从类路径下加载配置文件: ClassPathXmlApplicationContext(从硬盘的绝对路径下加载配置文件:FileSystemXmlApplication)

3、spring配置详解

元素属性

bean元素:使用该元素描述需要spring容器管理对象
name属性:给被管理的对象起个名字,获得对象时getBean("name值")
class属性:被管理对象的完整类名
id属性:与name属性一模一样,名称不可重复,不能使用特殊字符

name和id之间的一些注意点:

  1. 配置两个相同的 id 或者 name 都不能通过
  2. 如果既配置了 id ,也配置了 name ,则两个都生效。如果id和name都没有指定,则用类全名作为name,如,则你可以通过getBean(“com.stamen.BeanLifeCycleImpl”)返回该实例
  3. 如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 相同的时候, 则两个冲突,配置文件生效。如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 不相同的时候, 则两个不冲突,都能够生效

bean元素(scope属性、生命周期属性)—单例多例

scope属性

  1. singleton 默认值

单例对象 :被标识为单例的对象在spring容器中只会存在一个实例

  1. prototype

多例原型:被标识为多例的对象,每次在获得才会被创建,每次创建都是新的对象

  1. request

Web环境下,对象与request生命周期一致

  1. session

Web环境下,对象与session生命周期一致

总结:绝大多数情况下,使用单例singleton(默认值),但是在与struts整合时候,务必要用prototype多例,因为struts2在每次请求都会创建一个新的Action,若为单例,在多请求情况下,每个请求找找spring拿的都是同一个action。

二、生命周期属性———初始化和销毁

  1. 配置一个方法作为生命周期初始化方法,spring会在对象创建之后立刻调用 init-method
  2. 配置一个方法作为生命周期的销毁方法,spring容器在关闭并销毁所有容器中的对象之前调用destory-method
	//  对应注解为@PostConstruct
    
    //  对应注解为@PreDestory
      

三、模块化配置,即分模块配置(导入其他spring配置文件)


    

spring三种对象的创建方式

空参数构造


静态工厂创建(调用静态方法创建)
调用UserFactory类的静态createUser方法创建名为user的对象,放入容器


实例工厂创建(调用非静态方法创建)——需要配置两个bean,因为无法通过类名调用非静态方法



spring注入方式

set方式注入(重点)————值类型用value注入 引用类型用ref注入

 
	 
	 

构造方法注入
name属性:构造函数的参数名称
index属性:构造函数的参数索引
type属性:构造函数的参数类型

 
	 
	 
	 

p名称空间注入———实际上set注入
spring特有,为了简化写法

  • applicationContext.xml中标签头部导入p命名空间
xmlns:p="http://www.springframework.org/schema/p"
  • 书写格式:
    值类型注入 p:属性名=“值” 引用类型注入 p:属性名-ref=“引用的 name属性”

list集合的注入


	
		list1
		list2
	

map集合的注入


	
		
		
	

properties的注入


	
		com.jdbc.mysql.Driver
		root
		root
	

4、使用注解方式代替配置文件(官方推荐使用注解)

1.在applicationContext.xml中书写指定扫描注解


2.在类中书写Component

3.指定对象的作用范围Scope

  • singleton作用域:当把一个Bean定义设置为singleton作用域是,Spring IoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域
  • prototype作用域:prototype作用域的Bean会导致在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的Bean实例。根据经验,对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。对于具有prototype作用域的Bean,有一点很重要,即Spring不能对该Bean的整个生命周期负责。具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源
  • singleton 只有一个实例,也即是单例模式
  • prototype访问一次创建一个实例,相当于new

4.值类型的注入

// 通过反射赋值的
@value("xxx")
private String name;
// 通过set方式赋值的
@value("xxx")
public void setSender(String name) {
     this.name= name;
}

5.引用类型的注入
@AutoWired默认以类型进行查找,@Resource默认以名称进行查找(@Resource注解是jdk1.6后才有的)

6.创建与销毁方法
在创建方法前加 @PostConstruct 注解,在销毁方法前加 @PreDestroy 注解

你可能感兴趣的:(萌新刚上道)