spring基础

来源:互联网 发布:linux防火墙策略 编辑:程序博客网 时间:2024/06/11 08:11

1. 概述

1.1.Ioc/DI(inversion of control控制反转/依赖注入)

应用本身不负责对象的创建和维护,对象和依赖对象创建完全交给spring容器去管理和维护,这个权利反转给spring容器了。使用Ioc降低了层与层之间的耦合性


问题:


1.1.1.       方案1,自己创建工厂模式。

工厂:


使用:


1.1.2.       方案2,使用spring的bean工厂

getBean(“beanId”)

1.2.AOP(面向切面/Aspect Oriented programming)

通过预编译的方式,在运行期使用动态代理的方式实现的一种技术。

1)在项目中使用aop来管理事务,事务的开启,提交,回滚。

2)在项目中管理事务的传播特性。


2. spring配置文件加载:

2.1.方案1


2.2.方案2


3. bean的创建

3.1.使用构造器创建

使用构造器创建bean,要求bean必须有默认的构造器,这是工作中最常用的方式。

spring配置文件:


3.2.静态工厂方式创建

首先,提供静态工厂类:


然后spring配置文件:


3.3.实例工厂方式创建

首先,提供实例工厂类:


然后spring配置文件:


4. bean延迟加载


1)所有的bean默认情况下,非延迟加载的,是spring容器创建的时候,就把bean创建出来了,我们getBean的时候直接从容器中去拿这个bean就可以了。

2)是否延迟加载有lazy-init来控制,默认是false,如果变成true,bean就在getBean的时候创建。

3)全局的延迟加载设置(所有bean都延迟加载,一般不用):


5. bean的作用域

默认情况下,bean都是单例的,是容器初始化的时候被创建的,就这么一份。

Scope:singleton单例, prototype:多例,默认使用singleton

如果是singleton我们使用lazy-init可以设置是否延迟加载。

如果是prototype只能是延迟加载,设置非延迟加载属性无效。

6. bean的生命周期

通过init方法和destroy的方法验证。

init是bean创建后被调用的,来初始化bean,做一些准备工作

destory是bean被销毁的时候调用的,做清理工作。

单例的Bean,生命周期和容器一致,容器被创建bean就被创建,容器销毁bean销毁。

7. 依赖注入方式

7.1.常量注入(常用)


7.2.构造器注入(不常用,bean中必须提供对应的构造器)

(1)  构造器注入常量

(2)  构造器注入变量

7.3.外部bean的注入(常用,必须提供对应的set方法)

7.4.内部bean的注入(不常用)

7.5.集合注入

都能注入:Set,List,Map,Properties等

首先bean,必须提供set方法:


(1)    set


(2)    list


(3)    map


(4)    prop


public class MovieRecommender { private Set<MovieCatalog> movieCatalogs; @Autowired public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) { this.movieCatalogs = movieCatalogs; } // ...}

小提示:如果当初定义的bean上有@Order注解或者标准注解@Priority的话,那么注入的集合就是有序的,这个元素顺序是当初注解定义的优先顺序。

@Autowired和@Resource

  • autowired by type
  • 可以 通过@Qualifier 显式指定 autowired by qualifier name(非集合类。注意:不是autowired by bean name!)
  • 如果 autowired by type 失败(找不到或者找到多个实现),则退化为autowired by field name(非集合类)

@Resource

  • 默认 autowired by field name
  • 如果 autowired by field name失败,会退化为 autowired by type
  • 可以 通过@Qualifier 显式指定 autowired by qualifier name
  • 如果 autowired by qualifier name失败,会退化为 autowired by field name。但是这时候如果 autowired by field name失败,就不会再退化为autowired by type了。

7.6.注解注入

7.6.1.       配置文件

1)注解context的约束文件(引入context后,则.xml文件会有提示信息):


2)开启注解的驱动


开启注解扫描器,使用了该标签,不需要在使用上面的开启注解驱动标签

7.6.2.       注解

(1)   @Resource

非spring注解,是javax下的

(1)作用在属性上,不需要提供set方法

Spring容器初始化时,若指定了name,则@Resource注解只根据name(“userDao2”)和bean的id匹配。若未指定name,则先根据变量名称userDao和bean的id匹配,如果匹配不上,则按接口UserDao和实现类的关系来匹配bean,这种情况下,如果一个接口(UserDao)有多个实现类的时候,必须通过name属性来指定到底注入哪一个,不指定会抛异常。

(2)作用在set方法上

基本规则同上,唯一不同如下:

不指定name时,如果左边三个框内的任意一个名称能匹配上,就能注入,三个都匹配不上,再按接口和实现类的关系匹配。

(2)  @Autowired注解

(1)加在属性上

@autowired注解,只按着接口和实现类的关系匹配,如果该接口存在多个实现类,由于该注解没有name属性,需要结合@Qulifier注解来指定value。


可在配置文件中配置注入方式:byTypebyName。。。


(2)加在属性上

同上

(3)required属性(不常用),默认为true,设置为false,不必须注人

(3)@Value

首先,@value需要参数,这里参数可以是两种形式:@Value("#{configProperties['t1.msgname']}")或者@Value("${t1.msgname}");
其次,下面我们来看看如何使用这两形式,在配置上有什么区别:
1、@Value("#{configProperties['t1.msgname']}")这种形式的配置中有“configProperties”,其实它指定的是配置文件的加载对象:配置如下:
    <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>classpath:/config/t1.properties</value>
            </list>
        </property>
    </bean>
    这样配置就可完成对属性的具体注入了;


    2、@Value("${t1.msgname}")这种形式不需要指定具体加载对象,这时候需要一个关键的对象来完成PreferencesPlaceholderConfigurer,这个对象的配置可以利用上面配置1中的配置,也可以自己直接自定配置文件路径。
    如果使用配置1中的配置,可以写成如下情况:
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="properties" ref="configProperties"/>
    </bean>


    如果直接指定配置文件的话,可以写成如下情况:
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="location">
        <value>config/t1.properties</value>
        </property>
    </bean>

8. spring的扫描器

 


9. spring和junit整合


10.  spring读取properties文件